当前位置: 首页 > news >正文

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>

 测试:

http://www.lqws.cn/news/157555.html

相关文章:

  • 【iSAQB软件架构】软件架构中构建块的视图:黑箱、灰箱和白箱及其交互机制
  • 2025年渗透测试面试题总结-腾讯[实习]玄武实验室-安全工程师(题目+回答)
  • 数据驱动的智驾十年 特斯拉、Momenta合流闯进Robotaxi卫冕之战
  • Java应用10(客户端与服务器通信)
  • Postman环境变量全局变量设置
  • Postman常见问题及解决方法
  • Perforce ALM产品简介:一站式需求与测试管理平台(已通过SO 26262认证)
  • 基于ResNet残差网络优化梯度下降算法实现图像分类
  • RKNN3588上部署 RTDETRV2
  • 深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
  • CSP-VP37th
  • 麒麟信安系统下修改系统默认记录日志大小
  • [arthas]arthas安装使用
  • vue+element-ui一个页面有多个子组件组成。子组件里面有各种表单,实现点击enter实现跳转到下一个表单元素的功能。
  • 成都芯谷金融中心·文化科技产业园:构建产业新城的实践与探索
  • 基于大数据爬虫+智能AI的网络小说数据可视化系统设计与实现
  • Unity基础-Mathf相关
  • 3ds Max 渲染技术突破:一键解锁照片级真实感!
  • 小程序引入deepseek
  • 每日算法-250605
  • xmind转换为markdown
  • QQ邮箱发送验证码(Springboot)
  • SDC命令详解:使用set_max_fanout命令进行约束
  • MacOS解决局域网“没有到达主机的路由 no route to host“
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: TTask创建多线程, 更简单, 更快捷.
  • Git 安装全攻略Linux、macOS、Windows 与源码编译
  • redis数据过期策略、淘汰策略
  • 安卓四大组件数据存储Handler
  • React从基础入门到高级实战:React 实战项目 - 项目一:在线待办事项应用
  • Kafka入门-消费者