這里我們記錄一些mybatis的一些常用知識和項目中遇到的問題總結。快樂人生的三個必要元素是,有要做的事、熱愛的事及盼望的事。
javaweb框架??
mybatis的一些知識
一、mybatis插入返回主鍵值
- 插入的java代碼:其中返回是當前插入的主鍵,insert方法返回的是影響的行數。
public void insertUserInfo() {Map<String, Object> map1 = new HashMap<>();map1.put("userName", "huhx");map1.put("age", 35);int effectRow = this.sqlSession.insert("login.insertUserInfo", map1);System.out.println(map1.get("huhxId")); // 5System.out.println(effectRow); // 1 }
- ?語句映射的sql語句:
<insert id="insertUserInfo" parameterType="java.util.HashMap" useGeneratedKeys="true" keyProperty="huhxId">INSERT INTOpuser(user_name, age)VALUES(#{userName}, #{age}) </insert>
?關于mybatis的官方文檔: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
sql語句where多條件查詢??
?二、mybatis的一個參數傳遞的異常
- ?java代碼
public Map<String, Object> getUserInfoById(Long userId) {return this.sqlSession.selectOne("user.queryUserInfoByUserId", userId); }
- xml映射的代碼
<select id="queryUserInfoByUserId" parameterType="java.lang.Long" resultType="java.util.HashMap">SELECTuserId, username, password, address, birthday, sexFROMpuserWHERE1 = 1<if test="userId != null">AND userId = #{userId}</if>ORDER BYuserId DESC </select>
- 拋出異常
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'userId' in 'class java.lang.Long'
對于這類單個入參然后用if判斷的,mybatis有自己的內置對象。如果你在if判斷里面寫的是你的入參的對象名,那么就會拋出上述的異常。
?
三、mybatis的查詢數據包含上送的數據字段
這里面注意幾點:一、parameterType的類型可以為縮寫的形式map;二、SELECT中可以有#{ActivityType} AS ActivityType的寫法;三、LEFT JOIN前端的FROM里面的數據需要括號。
<select id="getOtherActivity" parameterType="map" resultType="map">SELECT a.ActivitySeq,a.ActivityName,a.ActivityDes,a.ActivityBeginDate,a.ActivityEndDate,a.ActivityStatus,b.ActivityChannel,c.ToolName,c.ToolType,c.ToolDesc,#{ActivityType} AS ActivityTypeFROM(A_ACTIVITY a, A_ACTIVITY_CHANNEL b, T_TOOL c)LEFT JOIN<choose><when test="ActivityType != null and ActivityType == 2">A_CONVERT d</when><when test="ActivityType != null and ActivityType == 3">A_DISTRIBUTION d</when><when test="ActivityType != null and ActivityType == 6">A_MISSION d</when></choose>ONd.ActivitySeq = a.ActivitySeq ANDd.ToolSeq = c.ToolSeqWHEREa.ActivitySeq = b.ActivitySeq <if test="ActivityNo != null">AND a.ActivitySeq = #{ActivityNo}</if>ORDER BYa.ActivitySeq DESC </select>
?
四、mybatis的批量插入傳遞額外的數據
我們的需求是在批量插入的時候,有些數據是一定的,不需要在遍歷的列表里面。
public String batchInsertMap() {Map<String, Object> parmMap = new HashMap<>();parmMap.put("personId", "1");List<Map<String, String>> list = new ArrayList<>();for (int i = 0; i < 3; i ++) {Map<String, String> map = new HashMap<>();map.put("content", "comment " + i);list.add(map);}parmMap.put("list", list);// 批量插入數據int rowCounts = this.sqlSession.insert("user.insertBatchComments", parmMap);return rowCounts + ""; }
mybatis的sql語句如下:
<insert id="insertBatchComments" parameterType="map">INSERT INTO comment(person_id, content)VALUES<foreach collection="list" item="item" index="index" separator=",">(#{personId},#{item.content})</foreach> </insert>
?
友情鏈接
?