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

MyBatis 动态 SQL:让 SQL 语句随条件灵活变化

目录

1. 动态SQL

1.1. if

1.1.1. 持久层接口添加方法

1.1.2. 映射文件添加标签

1.1.3. 编写测试方法

1.2. where

1.3. set

1.4. choose、when、otherwise

1.5. foreach

1.5.1. 遍历数组

1.5.2. 遍历Collection

1.5.3. 遍历Map

2. 总结


前言

本文来讲解MyBatis的动态SQL

集合代码和图片演示,旨在让大家更好的理解(๑•̀ㅂ•́)و✧

个人主页:艺杯羹🌿

系列专栏:本文ben'weben'wbenbeMyBbatis🚀

1. 动态SQL

一个查询的方法的Sql语句不一定是固定的
比如电影选片,根据不同要求,Sql语句就会添加不同的查询条件
如图:


此时就需要在方法中使用动态Sql语句

1.1. if

​<if>​标签内的Sql片段在满足条件后才会添加,用法为:<if test="条件">​。例如:根据不同条件查询用户:

1.1.1. 持久层接口添加方法

// 用户通用查询
List<User> findByCondition(User user);

1.1.2. 映射文件添加标签

<select id="findByCondition" parameterType="com.yibeigen.pojo.User" resultType="com.itbaizhan.pojo.User">select * from user where 1 = 1<if test = "username != null and username.length() != 0">and username like #{username}</if><if test = "sex != null and sex.length() != 0">and sex = #{sex}</if><if test="address != null and address.length() != 0">and address = #{address}</if>
</select>

1.1.3. 编写测试方法

@Test
public void testFindByCondition(){User user = new User();List<User> users1 = userMapper2.findByCondition(user);//users1.forEach(System.out::println);user.setUsername("%金%");List<User> users2 = userMapper2.findByCondition(user);users2.forEach(System.out::println);user.setAddress("北京");List<User> users3 = userMapper2.findByCondition(user);users3.forEach(System.out::println);
}
  1. if中的条件不能使用 && / ||,而应该使用 and / or
  2. if中的条件可以直接通过属性名获取参数POJO的属性值,并且该值可以调用方法。
  3. where后为什么要加1=1?
    任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可

1.2. where

​<where>​可以代替sql中的 where 1=1 和 第一个and
更符合程序员的开发习惯,使用<where>​后的映射文件如下:

if 标签放在 where 里

<select id="findByCondition" resultType="com.itbaizhan.user.User" parameterType="com.itbaizhan.user.User">select * from user<where><if test="username != null and username.length() != 0">username like #{username}</if><if test="sex != null and sex.length() != 0">and sex = #{sex}</if></where>
</select>

1.3. set

<set>​标签用在update语句中
借助<if>​,可以只对有具体值的字段进行更新
<set>​会自动添加set关键字,并去掉最后一个if语句中多余的逗号

<update id="update" parameterType="com.yibeigen.user.User">update user<set><if test="username != null and username.length() > 0">username = #{username},</if><if test="sex != null and sex.length() > 0">sex = #{sex},</if></set><where>id = #{id}</where>
</update>

1.4. choose、when、otherwise

这些标签表示多条件分支,类似JAVA中的switch...case
<choose>类似switch
<when>类似case
<otherwise>类似default
用法如下:

<select id="findByCondition" resultType="com.yibeigen.user.User" parameterType="com.yibeigen.user.User">select * from user<where><choose><when test="username.length() &lt; 5">username like #{username}</when><when test="username.length() &lt; 10">username = #{username}</when><otherwise>id = 1</otherwise></choose></where>
</select>

这段代码的含义为:
用户名 < 5 时使用 模糊查询
用户名 >= 5 并且 < 10 时使用 精确查询
否则查询id为1的用户

1.5. foreach

​<foreach>​类似 JAVA 中的for循环,可以遍历集合数组。<foreach>​有如下属性:

  • collection:遍历的对象类型
  • open:开始的sql语句
  • close:结束的sql语句
  • separator:遍历每项间的分隔符
  • item:表示本次遍历获取的元素,遍历List、Set、数组时表示每项元素,遍历map时表示键值对的值
  • index:遍历List、数组时表示遍历的索引,遍历map时表示键值对的键

1.5.1. 遍历数组

我们使用<foreach>​遍历数组进行批量删除

1. 持久层接口添加方法

void deleteBatch(int[] ids);

2. 映射文件添加标签

<delete id="deleteBatch" parameterType="int">delete from user<where><foreach open="id in(" close=")" separator="," collection="array" item="id" >#{id}</foreach></where>
</delete>

3. 编写测试方法

@Test
public void testDeleteBatch(){int[] ids = {5,8};userMapper.deleteBatch(ids);session.commit();
}


1.5.2. 遍历Collection

​<foreach>​遍历List和Set的方法是一样的,我们使用<foreach>​遍历List进行批量添加。

1. 持久层接口添加方法

void insertBatch(List<User> users);

2. 映射文件添加标签

<insert id="insertBatch" parameterType="com.yibeigen.user.User">insert into user values<foreach collection="list" item="user" separator=",">(null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})</foreach>
</insert>

3. 编写测试方法

@Test
public void testInsertBatch(){User user1 = new User("程序员1", "男", "北京");User user2 = new User("程序员2", "女", "上海");List<User> users = new ArrayList();users.add(user1);users.add(user2);userMapper2.insertBatch(users);session.commit();
}

1.5.3. 遍历Map

我们使用<foreach>​遍历Map进行多条件查询

1. 持久层接口添加方法

/*** 多条件查询* @param map 查询的条件键值对 键:属性名 值:属性值* @return要给参数起一个参数名才能用!!!*/
List<User> findUser(@Param("queryMap") Map<String,Object> map);

2. 映射文件添加标签

<select id="findUser" parameterType="map" resultType="com.yibeigen.pojo.User">select * from user<where><foreach collection="queryMap" separator="and" index="key" item="value">-- 键是拼进来的,这个key和value是到时候会传进来的!!!-- ${} 是直接会加上的,#{},是会预编译的${key} = #{value}</foreach></where>
</select>

3. 编写测试方法

@Test
public void testFileUser(){Map<String, Object> queryMap = new HashMap<>();queryMap.put("sex", "男");queryMap.put("address", "北京");List<User> user = userMapper.findUser(queryMap);user.forEach(System.out::println);
}

2. 总结

现在就讲解完了动态SQL,希望对你有所帮助(๑•̀ㅂ•́)و✧

http://www.lryc.cn/news/592247.html

相关文章:

  • [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精
  • 美创科技建设项目被评为中国信通院医疗领域“磐安”优秀案例
  • 禁止拖动视频进度条来保障视频安全?
  • 西门子工业软件全球高级副总裁兼大中华区董事总经理梁乃明先生一行到访庭田科技
  • 免费PDF文件格式转换工具
  • 如何选择旅游科技行业云ERP?Oracle NetSuite助力汇智国际数智化升级
  • 【世纪龙科技】汽车故障诊断与排除仿真教学软件让课堂更高效安全
  • TCL 电视安装 APK 文件主要有 U 盘安装——仙盟创梦IDE
  • Java并发编程性能优化实践指南:锁分离与无锁设计
  • PYTHON日志神器nb_log详细介绍和使用说明
  • 数据统计模块后端架构解析:从Controller到SQL的ECharts数据对接实践
  • div和span区别
  • 为什么IoTDB成为物联网场景的技术优选?
  • Vue3 业务落地全景:脚手架、权限、国际化、微前端、跨端与低代码 50 条实战心法
  • 差分数组算法
  • ElasticSearch Doc Values和Fielddata详解
  • Android音视频探索之旅 | Webrtc 1对1音视频通话核心流程分析
  • 力扣347:前K个高频元素
  • [AI8051U入门第五步]modbus_RTU主机
  • 《Python Web 框架深度剖析:Django、Flask 与 FastAPI 的选择之道》
  • 数据库防止数组字符串序列化
  • Python暑期学习笔记5
  • C++编程学习(第10天)
  • 近期遇到的问题汇总
  • 微信小程序商品结算功能
  • 【嵌入式硬件实例】-555定时器实现LED追逐效果
  • 后端参数校验
  • LP-MSPM0G3507学习--05管脚中断
  • 网络基础12--可靠性概述及要求
  • postman接口测试,1个参数有好几个值的时候如何测试比较简单快速?