这里我们记录一些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")); //
System.out.println(effectRow); //
}
- 语句映射的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>