Mybatis动态SQL语句
1.if
使用动态SQL最常见情景是根据条件包含where子句的一部分
<select id="findByUser1" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">select * from user<where><if test="username!=null">and username=#{username}</if><if test="address!=null">and address = #{address}</if><if test="sex !=null">and sex = #{sex}</if></where>
</select>
测试:
2.where
我们在写sql语句的where部分的时候为了保证sql语句的语法正确,我们会加上1=1的表达式,如果我们不想这么写的话,可以使用标签来代替
<select id="findByUser1" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">select * from user<where><if test="username!=null">and username=#{username}</if><if test="address!=null">and address = #{address}</if><if test="sex !=null">and sex = #{sex}</if></where>
</select>
测试:
(1)不带条件:
(2)带条件:
3.choose语句
有时候我们不想使用所有的条件而是想从多个条件中选择一个使用,针对这种情况MyBatis提供了choose元素,它有点像java中的Switch语句
<!--查询用户信息查询条件1.如果先根据sex查询2。如果sex为空就根据address查询3.如果address为空就根据id倒序输出-->
<select id="findByUser2" resultType="com.qcby.entity.User" parameterType="com.qcby.entity.User">select * from userwhere 1=1<choose><when test="sex!=null">and sex = #{sex}</when><when test="address!=null">and address=#{address}</when><otherwise>order by id desc</otherwise></choose>
</select>
测试:
1.条件都不给(执行otherwise中的语句):
2.sex与address都不为空
3.sex为空,address不为空
4.set
当我们需要是实现动态更新操作的时候,我们会使用set标签
<!--根据主键更新操作按需更新字段-->
<update id="update1" parameterType="com.qcby.entity.User">updateuser<set><if test="username!=null">username=#{username},</if><if test="sex!=null">sex=#{sex},</if><if test="address != null">address=#{address},</if></set>where id = #{id}
</update>
测试:
set标签会处理xml的更新语句
<select id="query" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">select * from user<trim prefix="where" prefixOverrides="AND | OR"><if test="username!=null">and username=#{username}</if><if test="address!=null">and address = #{address}</if><if test="sex !=null">and sex = #{sex}</if></trim>
</select>
5.trim
trim标记是一个格式化标记,可以完成set或者where标记的功能
第一种使用:替代where标签
<trim>标签用于处理SQL语句的前缀和前缀覆盖:
- prefix="where" 表示在内容前添加WHERE关键字
- prefixOverrides="AND | OR" 表示自动去除内容开头多余的AND或OR
<select id="query" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">select * from user<trim prefix="where" prefixOverrides="AND | OR"><if test="username!=null">and username=#{username}</if><if test="address!=null">and address = #{address}</if><if test="sex !=null">and sex = #{sex}</if></trim>
</select>
测试:
第二种使用方式:替代set标
prefixOverrides="AND | OR"
表示去掉内容末尾多于的","
<update id="update2" parameterType="com.qcby.entity.User">updateuser<trim prefix="set" suffixOverrides=","><if test="username!=null">username=#{username},</if><if test="sex!=null">sex=#{sex},</if><if test="address != null">address=#{address},</if></trim>where id = #{id}
</update>
测试结果:
6.foreach
动态sql的另一个常用的使用场景是对集合的遍历
如: select * from user where id in (1,5,8,10)
<select id="query2" resultType="com.qcby.entity.User" parameterType="java.util.List">select*from userwhere 1=1<if test="list != null and list.size() > 0">and id in<foreach collection="list" open="(" close=")" separator="," item="id">#{id}</foreach></if>
</select>
测试:
7.bind
bind元素允许在OGNL表达式以外创建一个变量,将该变量绑定到上下文中,可以后续使用
<select id="query1" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User"><bind name="usernameLike" value="'%'+username+'%'"/>select * from user<trim prefix="where" prefixOverrides="AND | OR"><if test="username!=null">and username like #{usernameLike}</if><if test="address!=null">and address = #{address}</if><if test="sex !=null">and sex = #{sex}</if></trim>
</select>
测试: