if语句
在update节点中,一般会结合条件语句进行判断在执行:
<update id="update" parameterType="com.youkeda.comment.dataobject.UserDO">
update user set
<if test="nickName != null">
nick_name=#{nickName},gmt_modified=now()
</if>
where id=#{id}
</update>
通过这个if语句就可以对数据提前做判断
set语句
<update id="update" parameterType="com.youkeda.comment.dataobject.UserDO">
update user
<set>
<if test="nickName != null">
nick_name=#{nickName},
</if>
<if test="avatar != null">
avatar=#{avatar},
</if>
gmt_modified=now()
</set>
where id=#{id}
</update>
修改操作一定要更新时间,set就可以避免所有列值都为null是引起的语法错误,使用set系统会自动去掉最后一个,
if+select
查询条件一般是动态的,比如模糊查询某个时间后注册的用户:
List<UserDO> search(@Param("keyWord")String keyWord,
@Param("time")LocalDateTime time);
<select id="search" resultMap="userResultMap">
select * from user where
<if test="keyWord != null">
user_name like CONCAT('%',#{keyWord},'%')
or nick_name like CONCAT('%',#{keyWord},'%')
</if>
<if test="time != null">
and gmt_created <![CDATA[ >= ]]> #{time}
</if>
</select>
>=、<、<=、>、>=、&
这类的表达式会导致MyBatis解析失败,所以需要使用<![CDATA[ key ]]>
来包围住
当参数为LocalDateTime时,需要添加注解@DateTimeFormat
用于把字符串转化为日期类型
where
- 当keyWord为null,SQL会变成
select * from user where
and gmt_created >= ?
- 当keyWord,time都为null,SQL会变成
select * from user where
这时候就需要把SQL里的where改成MyBatis XML的where子句
<select id="search" resultMap="userResultMap">
select * from user
<where>
<if test="keyWord != null">
user_name like CONCAT('%',#{keyWord},'%')
or nick_name like CONCAT('%',#{keyWord},'%')
</if>
<if test="time != null">
and gmt_created <![CDATA[ >= ]]> #{time}
</if>
</where>
</select>