1.if   where

实现一个简单的需求:

根据性别和名字查询用户:

正常来写:

  1. <select id="selectUserBySexAndUsername" parameterType="pojo.User"
  2. resultType="pojo.User">
  3. select * from user where sex = #{sex} and username = #{username}
  4. </select>

弊端:传入参数user必须要有性别和姓名,缺一不可

于是我稍做修改:

  1. <select id="selectUserBySexAndUsername" parameterType="pojo.User"
  2. resultType="pojo.User">
  3. select * from user
  4. where
  5. <if test="sex != null and sex != ''">
  6. sex = #{sex}
  7. </if>
  8. <if test="username != null and username != ''">
  9. and username = #{username}
  10. </if>
  11. </select>

看似可以了,但是,如果sex不存在而username存在,SQL语句错误

这时候,只需要加入一个Where标签即可:

  1. <select id="selectUserBySexAndUsername" parameterType="pojo.User"
  2. resultType="pojo.User">
  3. select * from user
  4. <where>
  5. <if test="sex != null and sex != ''">
  6. sex = #{sex}
  7. </if>
  8. <if test="username != null and username != ''">
  9. and username = #{username}
  10. </if>
  11. </where>
  12. </select>

现在就可以满足需求了,只要至少存在一个条件即可查询成功

2.SQL片段:

很多的SQL标签内SQL语句重复,那么我们可以提出来共用吗?

可以:

  1. <sql id="selector">
  2. select * from user
  3. </sql>
  4.  
  5. <select id="selectUser">
  6. <include refid="selector" />
  7. <where>
  8. <if test="sex != null and sex != ''">
  9. sex = #{sex}
  10. </if>
  11. <if test="username != null and username != ''">
  12. and username = #{username}
  13. </if>
  14. </where>
  15. </select>

这种设计思想值得学习,不过实际开发种并不会使用

3.foreach

情景:根据多个ID查询用户:

先写个包装类,里面有一个存用户ID的List

(先展示包装类的方法是因为直接用数组或者List会有坑,下边会解释)

  1. package pojo;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5.  
  6. public class QueryVo implements Serializable {
  7.  
  8. private static final long serialVersionUID = 1L;private List<Integer> idsList;public List<Integer> getIdsList() {
  9. return idsList;
  10. }
  11.  
  12. public void setIdsList(List<Integer> idsList) {
  13. this.idsList = idsList;
  14. }
  15.  
  16. }

查询:

  1. <select id="selectUserByIds" parameterType="pojo.QueryVo"
  2. resultType="pojo.User">
  3. select * from user
  4. <where>
  5. <foreach collection="idsList" item="id" separator="," open="id in ("
  6. close=")">
  7. #{id}
  8. </foreach>
  9. </where>
  10. </select>

不过这里要特别注意:如果foreach循环的不是List集合,而是简单的数组:

collection不能写成属性名(如这里的idsList),而是要写成array

因此可见,如果我们foreach循环的不是包装类属性,而直接是List集合,

Collection也应该写成list

Mybatis框架五:动态SQL的更多相关文章

  1. mybatis框架(5)---动态sql

    那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态S ...

  2. mybatis 学习五 动态SQL语句

    3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...

  3. mybatis框架中动态SQL的编写

    1.动态SQL:在SQL语句中加入流程控制.比如加入if,foreach等. 重点掌握if语句: 案例1: <update id="updateItem" parameter ...

  4. JavaWeb_(Mybatis框架)Mapper动态代理开发_三

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  5. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  6. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  7. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  8. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  9. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  10. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

随机推荐

  1. “无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。”的一种解决方式

    通过以下几个步骤解决: 1.install-package entityFramework: 2.更新 nuget: 3.更新 visual studio: 我是通过第三个步骤解决的.

  2. linux下编译protobuf(可以编译成pb.go)

    编译前需要安装gtest $ cd googletest $ cmake -DBUILD_SHARED_LIBS=ON . $ make $ sudo cp -a include/gtest /hom ...

  3. Matting任务里的Gradient与Connectivity指标

    Matting任务里的Gradient与Connectivity指标 主要背景 Matting任务就是把α(不透明度, 也就是像素属于前景的概率).F(前景色)和B(背景色)三个变量给解出来. C为图 ...

  4. js 内置对象参考 (Array,String, Math, Data, Number)

    var str = "helloWorld"; var strOne = "helloWorld"; // charAt() 返回在指定位置的字符. var a ...

  5. python 数据可视化 -- 清理异常值

    中位数绝对偏差(Median Absolute Deviation, MAD)用来描述单变量(包含一个变量)样本在定量数据中可变性的一种标准.常用来度量统计分布,因为它会落在一组稳健的统计数据中,因此 ...

  6. TwinStickShooter的一些问题

    TwinStickShooter模板应该是比较好的了解UE基本Pawn和Projectile的一个C++例子.以下是一些问题. 一.这个模板以纯C++编写,没有蓝图,所以第一步,我想测试下如何引用蓝图 ...

  7. 实验十五 GUI编程练习与应用程序部署

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...

  8. TestNG的使用方法

      本文转载自于:https://blog.csdn.net/qq_24373725/article/category/7432624       TestNG介绍 TestNG是Java中的一个测试 ...

  9. 81、iOS本地推送与远程推送详解

    一.简介 分为本地推送和远程推送2种.可以在应用没打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户石否同意,如果同意则正常使用:如果用户不同意则下次打开程序 ...

  10. java下载Excel模板(工具类)

    一次文件下载记录 一次不成熟的文件下载操作记录,希望能对需要的人有所帮助. 1.前端代码 $("#downloadModel").click(function(){ var mod ...