Mybatis的动态sql
1 if(条件判断)
使用案例:
< SELECT id = "queryUser" parameterType ="int" resultType = "UserEneity" >
SELECT
*
FROM
USER
WHERE
age = '33'
<!-- 只有name这个字段的值不是null并且不是空串这个条件才会执行 -->
<IF test = " name !=null and name!='' " >
AND NAME = #{name}
</IF >
</ SELECT>
2 choose(when,otherwise)
类似于
if(){}
else if(){}
else{} 的结构
使用案例:
<select id="queryInfo" parameterType="Map" resultType="UserEneity">
select * from user where 1=1
<choose>
<when test="age!=null and age!=0">
and age=#{age}
</when>
<when test="name!=null and name!='' ">
and name=#{name}
</when>
<otherwise>
<!--当都不满足时会执行这个 -->
and id=6
</otherwise>
</choose>
</select>
3 trim(where set)
<where>标签可以避免当传入空值时的一些sql问题
比如:
< SELECT id = "queryUser" parameterType = "int" resultType = "UserEneity" >
SELECT
*
FROM
USER
WHERE
<IF test = " name !=null " >
AND NAME = #{name}
</IF >
当 name传入null时 那么sql语句就是 select * from user where 那么sql语句就会报错 这时我们可以使用where标签
< SELECT id = "queryUser" parameterType = "int" resultType = "UserEneity" >
SELECT
*
FROM
USER
<where>
<IF test = " name !=null " >
AND NAME = #{name}
</IF >
</where>
当name=null sql最终的语句是 select * from user 查询全部的
<set>标签在修改数据的时候使用的比较多
使用案例:
<update id="update" parameterType="map">
update user
<set>
<if test="name!=null and name!='' "> name=#{name}</if>
<if test="age!=null and age!='' "> age=#{age}</if>
</set>
where id=#{id}
</update>
3 foreach
可以做一些循环的操作 比如动态的批量插入或是批量修改等
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。
使用案例:
SELECT SUM(amount) as amount, sum(realpoliplanfee) as realpoliplanfee
FROM hh_asset
WHERE 1=1 AND jobnumber in
<foreach collection="array" item="job" open="(" separator=","
close=")">
#{job}
</foreach>
<if test="paramters.type=='month'"><!-- 月 -->
AND
DATE_FORMAT(signdate,'%m')=DATE_FORMAT(NOW(),'%m')
</if>
</select>
传递数据组时
Mybatis传入参数是基本类型的注意
1当传入参数是int类型时
<select id="queryUser" parameterType="int"resultType="UserEneity" >
select * from user where
<if test=" id !=null">
id=#{id}
</if>
</select>
则会报以下错误
There is no getter for property named 'id' in 'class java.lang.Integer'
原因::
Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取Integer.cmpid。Integer对象没有cmpid属性。如果不解析参数,mybatis自动识别传入的参数,不会报错。
解决的办法:
第一种:
<select id="queryUser"parameterType="int"resultType="UserEneity" >
select * from user where
<if test=" _parameter!=null">
id=#{_parameter}
</if>
</select>
第二种:
在传递参数的方法中使用注解@Param
queryUser(@Param(value="id" )int id);
在sql中
<select id="queryUser" parameterType="int"
resultType="UserEneity" >
select * from user
where 1=1
<if test=" id !=null ">
and id=#{id}
</if>
</select>