Mybatis框架五:动态SQL
1.if where
实现一个简单的需求:
根据性别和名字查询用户:
正常来写:
- <select id="selectUserBySexAndUsername" parameterType="pojo.User"
- resultType="pojo.User">
- select * from user where sex = #{sex} and username = #{username}
- </select>
弊端:传入参数user必须要有性别和姓名,缺一不可
于是我稍做修改:
- <select id="selectUserBySexAndUsername" parameterType="pojo.User"
- resultType="pojo.User">
- select * from user
- where
- <if test="sex != null and sex != ''">
- sex = #{sex}
- </if>
- <if test="username != null and username != ''">
- and username = #{username}
- </if>
- </select>
看似可以了,但是,如果sex不存在而username存在,SQL语句错误
这时候,只需要加入一个Where标签即可:
- <select id="selectUserBySexAndUsername" parameterType="pojo.User"
- resultType="pojo.User">
- select * from user
- <where>
- <if test="sex != null and sex != ''">
- sex = #{sex}
- </if>
- <if test="username != null and username != ''">
- and username = #{username}
- </if>
- </where>
- </select>
现在就可以满足需求了,只要至少存在一个条件即可查询成功
2.SQL片段:
很多的SQL标签内SQL语句重复,那么我们可以提出来共用吗?
可以:
- <sql id="selector">
- select * from user
- </sql>
- <select id="selectUser">
- <include refid="selector" />
- <where>
- <if test="sex != null and sex != ''">
- sex = #{sex}
- </if>
- <if test="username != null and username != ''">
- and username = #{username}
- </if>
- </where>
- </select>
这种设计思想值得学习,不过实际开发种并不会使用
3.foreach
情景:根据多个ID查询用户:
先写个包装类,里面有一个存用户ID的List
(先展示包装类的方法是因为直接用数组或者List会有坑,下边会解释)
- package pojo;
- import java.io.Serializable;
- import java.util.List;
- public class QueryVo implements Serializable {
- private static final long serialVersionUID = 1L;private List<Integer> idsList;public List<Integer> getIdsList() {
- return idsList;
- }
- public void setIdsList(List<Integer> idsList) {
- this.idsList = idsList;
- }
- }
查询:
- <select id="selectUserByIds" parameterType="pojo.QueryVo"
- resultType="pojo.User">
- select * from user
- <where>
- <foreach collection="idsList" item="id" separator="," open="id in ("
- close=")">
- #{id}
- </foreach>
- </where>
- </select>
不过这里要特别注意:如果foreach循环的不是List集合,而是简单的数组:
collection不能写成属性名(如这里的idsList),而是要写成array
因此可见,如果我们foreach循环的不是包装类属性,而直接是List集合,
Collection也应该写成list。
Mybatis框架五:动态SQL的更多相关文章
- mybatis框架(5)---动态sql
那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态S ...
- mybatis 学习五 动态SQL语句
3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...
- mybatis框架中动态SQL的编写
1.动态SQL:在SQL语句中加入流程控制.比如加入if,foreach等. 重点掌握if语句: 案例1: <update id="updateItem" parameter ...
- JavaWeb_(Mybatis框架)Mapper动态代理开发_三
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- mybatis中的动态SQL
在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
随机推荐
- “无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。”的一种解决方式
通过以下几个步骤解决: 1.install-package entityFramework: 2.更新 nuget: 3.更新 visual studio: 我是通过第三个步骤解决的.
- linux下编译protobuf(可以编译成pb.go)
编译前需要安装gtest $ cd googletest $ cmake -DBUILD_SHARED_LIBS=ON . $ make $ sudo cp -a include/gtest /hom ...
- Matting任务里的Gradient与Connectivity指标
Matting任务里的Gradient与Connectivity指标 主要背景 Matting任务就是把α(不透明度, 也就是像素属于前景的概率).F(前景色)和B(背景色)三个变量给解出来. C为图 ...
- js 内置对象参考 (Array,String, Math, Data, Number)
var str = "helloWorld"; var strOne = "helloWorld"; // charAt() 返回在指定位置的字符. var a ...
- python 数据可视化 -- 清理异常值
中位数绝对偏差(Median Absolute Deviation, MAD)用来描述单变量(包含一个变量)样本在定量数据中可变性的一种标准.常用来度量统计分布,因为它会落在一组稳健的统计数据中,因此 ...
- TwinStickShooter的一些问题
TwinStickShooter模板应该是比较好的了解UE基本Pawn和Projectile的一个C++例子.以下是一些问题. 一.这个模板以纯C++编写,没有蓝图,所以第一步,我想测试下如何引用蓝图 ...
- 实验十五 GUI编程练习与应用程序部署
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...
- TestNG的使用方法
本文转载自于:https://blog.csdn.net/qq_24373725/article/category/7432624 TestNG介绍 TestNG是Java中的一个测试 ...
- 81、iOS本地推送与远程推送详解
一.简介 分为本地推送和远程推送2种.可以在应用没打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户石否同意,如果同意则正常使用:如果用户不同意则下次打开程序 ...
- java下载Excel模板(工具类)
一次文件下载记录 一次不成熟的文件下载操作记录,希望能对需要的人有所帮助. 1.前端代码 $("#downloadModel").click(function(){ var mod ...