欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Mybatis动态SQL语句

Mybatis动态SQL语句

2025/9/30 22:43:46 来源:https://blog.csdn.net/m0_62923286/article/details/148459227  浏览:    关键词: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>

 测试:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词