这里我们记录一些mybatis的一些常用知识和项目中遇到的问题总结。快乐人生的三个必要元素是,有要做的事、热爱的事及盼望的事。
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")); // 5 System.out.println(effectRow); // 1 }
- 语句映射的sql语句:
<insert id="insertUserInfo" parameterType="java.util.HashMap" useGeneratedKeys="true" keyProperty="huhxId"> INSERT INTO puser(user_name, age) VALUES (#{userName}, #{age}) </insert>
关于mybatis的官方文档: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
二、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"> SELECT userId, username, password, address, birthday, sex FROM puser WHERE 1 = 1 <if test="userId != null"> AND userId = #{userId} </if> ORDER BY userId 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 ActivityType FROM (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> ON d.ActivitySeq = a.ActivitySeq AND d.ToolSeq = c.ToolSeq WHERE a.ActivitySeq = b.ActivitySeq <if test="ActivityNo != null"> AND a.ActivitySeq = #{ActivityNo} </if> ORDER BY a.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>
友情链接