很多时候查询/修改会根据不同数据执行不同的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相关推荐

  1. MyBatis动态SQL之 set 和 trim标记的使用示例

    2019独角兽企业重金招聘Python工程师标准>>> 和之前的where一样,set和trim也是智能标记 在之前的user.xml中添加 <update id=" ...

  2. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...

  3. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  4. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...

  5. MyBatis动态SQL,写SQL更爽

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  6. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 整理 ...

  7. MyBatis——动态SQL语句——if标签和where标签复合使用

    功能需求 根据性别和名字查询用户 官方文档 MyBatis--动态 SQL SQL语句 SELECT id, username, birthday, sex, address FROM `user` ...

  8. Mybatis 动态sql语句(if标签和where标签)

    功能:根据性别和名字查询用户 查询sql语句: SELECT id, username, birthday, sex, address FROM `user` WHERE sex = 1 AND us ...

  9. mybatis注解动态sql_超全MyBatis动态SQL详解

    MyBatis 令人喜欢的一大特性就是动态 SQL.在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的.MyBatis 动态 SQL 的出现, 解决了这个麻烦. MyBa ...

  10. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

最新文章

  1. 市场规模占全国4成,广东物联网市场发展强劲
  2. 企业开发中,git提交时屏蔽某些文件,怎么搞!【idea的处理方法】
  3. Linux LNMP 环境的搭建之【Nginx的安装】
  4. ASP.NET Core之跨平台的实时性能监控
  5. OSGI –模块化您的应用程序
  6. mysql中char,varchar与text类型的区别和选用
  7. tomcat配置自动服务器地址,修改eclipse部署tomcat时服务器部署地址
  8. 日均处理万亿数据!Flink在快手的应用实践与技术演进之路
  9. myeclipse左侧的目录树没了或不是竖向而是横向显示了
  10. 杭电4502吉哥系列故事——临时工计划
  11. 浙大 pat 1023题解
  12. 用matlab读pcap文件,libpcap读取本地pcap文件
  13. 程序员都需要学习什么
  14. 2021年度上海公务员考试公告(11月05日开启)
  15. 反欺诈之路——黑卡、养卡的识别
  16. html页面增加分页符
  17. Ubuntu中mininet的可视化界面
  18. fluent转载内容
  19. Unity Manual阅读记录——Animation(version 2019.4)
  20. Android 自定义Activity的主题

热门文章

  1. 【渝粤教育】国家开放大学2018年秋季 2245T社会福利与保障 参考试题
  2. Lecture 5:无模型控制
  3. Qt 学习之路 2(2):Qt 简介 笔记
  4. Web API 路由 [二] Attribute Routing
  5. [转]老婆还是自己好
  6. 看电影(movie):组合数
  7. java框架之SpringBoot(16)-分布式及整合Dubbo
  8. matlab 按照某列以行为单位进行排序
  9. 转liunx 常用命令
  10. Oracle case用法