MyBatis---动态SQL
很多时候查询/修改会根据不同数据执行不同的sql语句,一般情况下,我们需要对sql进行拼装。在MyBatis中可以通过动态SQL实现,就避免了拼装SQL
if语句:满足条件,则执行语句
choose when 条件一,when 条件二......otherwise相当于if()else if()...else(),如果when的条件不满足,则会执行otherwise代码块中的SQL语句。
值得注意的是下面的例子中有两个id为selectIf的查询,两个传递的参数不同,一个是基础数据类型,一个是类对象。传参为基础数据类型,那么在判断、#后面传递参数的时候使用_parameter;传参为类对象,则使用类中对应的属性
<select id="selectIf" parameterType="int" resultType="Student">select * from student where 1=1<if test="_parameter != null">and studentId=#{_parameter}</if> </select><select id="selectIf" parameterType="Student" resultType="Student">select * from student where 1=1<if test="studentId != null and studentId != 0">and studentId=#{studentId}</if> </select><select id="selectChoose" resultType="Student" parameterType="Student">select * from student where 1=1<choose><when test="studentId != null and studentId != 0">and studentId=#{studentId}</when><otherwise>and name=#{name}</otherwise></choose> </select>
以上代码,每次使用条件时都添加了1=1,这样其实是不正确的,但我们需要条件,所以where和set就出来了。where用于删除没必要的and(在执行第一个条件时,是不需要and的),set用于update,在修改字段值时,没个字段后面都有一个“,”但是最后一个后面不应该有“,”而set便用于去除最后一个逗号
trim即格式化SQL代码,trim有四个属性,这四个属性都配套使用
- prefix:前缀增加
- suffix:后缀增加
- prefixOverrides:自动判断前置
- suffixOverrides:自动判断后置
<select id="selectIfWhere" resultType="Student" parameterType="Student">select * from student<where><if test="studentId != null and studentId != 0">and studentId=#{studentId}</if><if test="name != null and studentId != ''">and name=#{name}</if><if test="zhuangtai != null and zhuangtai != 0">and zhuangtai=#{zhuangtai}</if></where> </select><update id="updateSet" parameterType="Student">update student<set><if test="name != null and name != ''">name=#{name},</if><if test="zhuangtai != null">zhuangtai=#{zhuangtai},</if></set> </update><select id="selectTrim" parameterType="Student" resultType="Student">select * from student<trim prefix="where" prefixOverrides="and|or"><if test="studentId != null and studentId != 0">and studentId=#{studentId}</if><if test="name != null and studentId != ''">and name=#{name}</if><if test="zhuangtai != null and zhuangtai != 0">and zhuangtai=#{zhuangtai}</if></trim> </select>
foreach
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息
基础数据类型的list:where标记之后输出的sql语句WHERE id in ( ? , ? )
<select id="selectForeach" resultType="JikeUser" parameterType="list">select * from jikeUser<where>id in <foreach collection="list" index="index" item="item" open="(" separator="," close=")">#{item}</foreach></where> </select>
@TestList<Integer> selectList = new ArrayList<>(); selectList.add(1); selectList.add(2); List<JikeUser> jikeUsers = sqlSession.selectList("selectForeach",selectList); for(JikeUser jikeUser : jikeUsers)System.out.println(jikeUser.getUserName());
类对象的list:where标记之后输出的sql语句WHERE (username like ? and password = ?) or (username like ? and password = ?)
<select id="selectForeach1" resultType="JikeUser" parameterType="list">select * from jikeUser<where><foreach collection="list" index="index" item="item" open="" separator="or" close="">(username like #{item.userName} and password = #{item.password})</foreach></where> </select>
@TestList<JikeUser> selectList = new ArrayList<>(); selectList.add(new JikeUser("jike00100", "666666")); selectList.add(new JikeUser("author001", "123456")); List<JikeUser> jikeUsers = sqlSession.selectList("selectForeach1",selectList); for(JikeUser jikeUser : jikeUsers)System.out.println(jikeUser.getUserName());
数组:where标记之后输出的sql语句WHERE id in ( ? , ? )
<select id="selectForeach" resultType="JikeUser" parameterType="java.util.ArrayList">select * from jikeUser<where>id in <foreach collection="array" index="index" item="item" open="(" separator="," close=")">#{item}</foreach></where> </select>
@Testint[] selectList = {1,2}; List<JikeUser> jikeUsers = sqlSession.selectList("selectForeach",selectList); for(JikeUser jikeUser : jikeUsers) {System.out.println(jikeUser.getUserName());
HashMap:where标记之后输出的sql语句WHERE userName like "%"?"%" and id in ( ? , ? )
<!-- #{name}中的name为HashMap中的键;collection="ids"中ids为HashMap中的键 --><select id="selectForeach2" resultType="JikeUser" parameterType="java.util.HashMap">select * from jikeUser<where>userName like "%"#{name}"%" and id in <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">#{item}</foreach></where> </select>
@TestList<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("ids", ids); hashMap.put("name", "jike00100"); List<JikeUser> jikeUsers = sqlSession.selectList("selectForeach2",hashMap); for(JikeUser jikeUser : jikeUsers) System.out.println(jikeUser.getUserName());
由以上例子可以得出foreach中collection的参数一定是集合或数组等
转载于:https://www.cnblogs.com/xiaobaizhiqian/p/8060067.html
MyBatis---动态SQL相关推荐
- MyBatis动态SQL之 set 和 trim标记的使用示例
2019独角兽企业重金招聘Python工程师标准>>> 和之前的where一样,set和trim也是智能标记 在之前的user.xml中添加 <update id=" ...
- MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...
- 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...
- MyBatis动态SQL,写SQL更爽
点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...
- 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 整理 ...
- MyBatis——动态SQL语句——if标签和where标签复合使用
功能需求 根据性别和名字查询用户 官方文档 MyBatis--动态 SQL SQL语句 SELECT id, username, birthday, sex, address FROM `user` ...
- Mybatis 动态sql语句(if标签和where标签)
功能:根据性别和名字查询用户 查询sql语句: SELECT id, username, birthday, sex, address FROM `user` WHERE sex = 1 AND us ...
- mybatis注解动态sql_超全MyBatis动态SQL详解
MyBatis 令人喜欢的一大特性就是动态 SQL.在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的.MyBatis 动态 SQL 的出现, 解决了这个麻烦. MyBa ...
- Mybatis 动态Sql语句《常用》
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...
最新文章
- 市场规模占全国4成,广东物联网市场发展强劲
- 企业开发中,git提交时屏蔽某些文件,怎么搞!【idea的处理方法】
- Linux LNMP 环境的搭建之【Nginx的安装】
- ASP.NET Core之跨平台的实时性能监控
- OSGI –模块化您的应用程序
- mysql中char,varchar与text类型的区别和选用
- tomcat配置自动服务器地址,修改eclipse部署tomcat时服务器部署地址
- 日均处理万亿数据!Flink在快手的应用实践与技术演进之路
- myeclipse左侧的目录树没了或不是竖向而是横向显示了
- 杭电4502吉哥系列故事——临时工计划
- 浙大 pat 1023题解
- 用matlab读pcap文件,libpcap读取本地pcap文件
- 程序员都需要学习什么
- 2021年度上海公务员考试公告(11月05日开启)
- 反欺诈之路——黑卡、养卡的识别
- html页面增加分页符
- Ubuntu中mininet的可视化界面
- fluent转载内容
- Unity Manual阅读记录——Animation(version 2019.4)
- Android 自定义Activity的主题