使用动态sql可简化代码开发,减少开发者的工作量,程序可以自动动根据业务参数来决定sql的组成。
1、if和where标签
- if 标签可以自动根据表达式的结果来决定 是否将语句添加到sql中,如果条件不成立则不添加,如果条件成立则添加。
- where ** 标签可以自动判断是否要删除语句块中的and关键字,如果检测到where**直接跟 and拼接,则自动删除 and
- 总结:if标签使用时,如果sql语句中的where 和and相连,这事需要使用where标签来将and删掉,所以往往if和where标签一起使用。
<mapper>
<select id=" " parmeterType="...model">
select from t_account
<where>
<if test="id !=0>//如果id不为0
id=#{id}
</if>
<if test="username !=null">
and username=#{uaername}
</if>
<if test="pasword!=null">
and password =#{password}
</if>
</where>
</select>
</mapper>
2、choose和when标签
- 如果第一个when成立就不会执行下一个when
<mapper>
<select id=" " parmeterType="...model">
select from t_account
<where>//
<choose>
<when test="id !=0>//如果id不为0
id=#{id}
</when >
<when test="username !=null">
username=#{uaername}
</when >
<when test="pasword!=null">
password =#{password}
</when >
</choose>
</where>
</select>
</mapper>
3、trim标签
- trim 和 where功能类似,用来处理动态关键字是否要添加
- trim 标签中的prefix和suffix属性会被用于生成实际的sql语句,会和标签内部的语句进行拼接,如果语句前后出现了preffix Overrides或者suffix Overrides属性中指定的值,Mybatis框架会自动将其删除。
<mapper>
<select id=" " parmeterType="...model" resultType="...model">
select from t_account
<trim prefix="where" preffixOverrides="and">//如果发现where和and连接,就会把and删掉
<if test="id !=0">
id=#{id}
</if>
<if test="username !=null">
and username=#{username}
</if>
<if test="passowrd!=null">
and passowrd=#{passowrd}
</if>
</trim>
</select>
</mapper>
4、set标签
- set标签用于update操作,会自动根据参数选择生成sql语句
- 原始sql语句,没有set标签
<mapper>
<update id=" " parmeterType="...model" >
update t_account set username=#{username},password=#{password} where id=#{id}
</update>
</mapper>
- 添加set标签之后的update语句
<mapper>
<update id=" " parmeterType="...model" >
update t_account
<set>
<if test="username != null">
username=#{username},
</if>
<if test="password!= null">
password=#{password}
</if>
</set>
where id=#{id}
</update>
</mapper>
5、foreach标签
- 作用:foreach标签可以迭代生成一系列值,主要用于sql的in语句。
- mysql中查询的语句:select* form t_account where id=1 or id=2 or id=3
或者 select * from t_account where id in (1,4,5)
加入foreach后如下 - 首先要在实体类中加id集合变量 例:private List ids;
<mapper>
<select id=" " parmeterType="...model" resultType=“...model” >
select * from t_account where id in (1,4,5)
<where>
<foreach cllection="ids" open="id in (" close=")" item="id" separator=","> //open中写的是数据集合之前where关键字之后放入内容,同理close是数据集合之后的内容,cllection是集合的名称,item是变量名
</foreach>
</where>
</select >
</mapper>