05.Mybatis动态sql
1.IF标签
需求:根据条件查询用户
在Mapper.xml中编写
<!-- 根据sex和username查询user -->
<select id="findbySexandUsername" parameterType="User" resultType="User">
select * from user where sex = #{sex} and username = #{username}
</select>
问题:当传入的参数中缺少需要的属性时,不能查出信息
使用IF标签解决:
<!-- 根据sex和username查询user -->
<select id="findbySexandUsername" parameterType="User" resultType="User">
select * from user
where 1=1
<if test="sex!=null and sex!='' ">
and sex = #{sex}
</if>
<if test="username!=null and username!='' ">
and username = #{username}
</if>
</select>
2.WHERE标签
问题:上面的IF标签 中 Where 1=1 显得很麻烦
使用where解决
<!-- 根据sex和username查询user -->
<select id="findbySexandUsername" parameterType="User"
resultType="User">
select * from user
<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
<where>
<if test="sex!=null and sex!='' ">
and sex = #{sex}
</if>
<if test="username!=null and username!='' ">
and username = #{username}
</if>
</where>
</select>
where标签可以自动添加where,同时处理sql语句中第一个and关键字
3.SQL标签
问题:在一个Mapper.xml中有许多重复的语句
使用SQL标签解决
<!-- 查询所有的orders -->
<select id="findAllOrders" resultMap="ordersResultMap">
select * from orders
</select>
<!-- 声明sql片段 -->
<sql id="selectUser">
select * from user
</sql>
<!-- 根据sex和username查询user -->
<select id="findbySexandUsername" parameterType="User" resultType="User">
<include refid="selectUser"/>
<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 -->
<where>
<if test="sex!=null and sex!='' ">
and sex = #{sex}
</if>
<if test="username!=null and username!='' ">
and username = #{username}
</if>
</where>
</select>
如果要使用别的namespace中的sql标签,在refid中加入namespace名字
4.FOREACH
当查询需要用到in时。例如:根据多个id查询用户信息
需要通道foreach标签
1.数组
接口
/**
* 根据ids来查询
*/
public List<User> findByIds(int[] ids);
映射
<!-- 根据ids来查询 -->
<select id="findByIds" parameterType="int[]" resultType="User">
select * from user
where
id in
<!-- foreach标签,进行遍历 -->
<!-- collection:遍历的集合 -->
<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
<!-- open:在前面添加的sql片段 -->
<!-- close:在结尾处添加的sql片段 -->
<!-- separator:指定遍历的元素之间使用的分隔符 -->
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
测试
/**
* 根据ids
*/
@Test
public void m05() {
// 获取sqlSession,和Spring整理后由Spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询
int[] ids = new int[3];
ids[0] = 10;
ids[1] = 16;
ids[2] = 22;
List<User> list = userMapper.findByIds(ids);
for (User user : list) {
System.out.println(user);
}
}
注意:这样写会报错

原因:这种情况映射中的collection必须按照规范写


ids 改为 array
再次测试:
2.集合
/**
* 根据ids
*/
@Test
public void m05() {
// 获取sqlSession,和Spring整理后由Spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 从sqlSession中获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 执行查询
List<Integer> ids = new ArrayList<>();
ids.add(10);
ids.add(16);
ids.add(22);
List<User> users = userMapper.findByIds(ids);
for (User user : users) {
System.out.println(user);
}
}
}
/**
* 根据ids来查询
*/
public List<User> findByIds(List ids);
<!-- 根据ids来查询 -->
<select id="findByIds" parameterType="List" resultType="User">
select * from user
where
id in
<!-- foreach标签,进行遍历 -->
<!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
<!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
<!-- open:在前面添加的sql片段 -->
<!-- close:在结尾处添加的sql片段 -->
<!-- separator:指定遍历的元素之间使用的分隔符 -->
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
注意:同样不能随意写collection

应该将 ids 改为 list

05.Mybatis动态sql的更多相关文章
- MyBatis 动态SQL(十二)
动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...
- mybatis动态sql以及分页
1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 1.mybatis动态sql If.trim.foreach If 标签判断某一字段是否为空 &l ...
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- Mybatis动态SQL单一基础类型参数用if标签
Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- Mybatis动态SQL简单了解 Mybatis简介(四)
动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ } Mybatis应用中,S ...
- mybatis原理分析学习记录,mybatis动态sql学习记录
以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...
随机推荐
- CocoaPods管理iOS项目 2018年11月06日
一.创建Test工程项目 二.打开终端 当前pod版本(1.6.0.beta.2最新版本2018年11月06日)和gem源路径(https://gems.ruby-china.com): 1.cd+当 ...
- socket的多线程实现
步骤: 1.服务端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建socket并请求与服务端对话: 3.服务端接收客户端的请求,创建socket与客户端进行专线连 ...
- python学习4—数据结构之列表、元组与字典
python学习4—数据结构之列表.元组与字典 列表(list)深灰魔法 1. 连续索引 li = [1,1,[1,["asdsa",4]]] li[2][1][1][0] 2. ...
- python 15 文件操作(一)
转自 http://www.cnblogs.com/BeginMan/p/3166644.html 一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. <Python ...
- 调用存储过程取到数据通过NPOI存到Excel中
//调用 public ActionResult GenerateExcel() { DataTable headerTable = new DataTable(); ...
- 5、Docker数据管理
为了能够存储持久化数据以及共享容器间的数据,Docker提出了Volume的概念.让我们通过类似mount的方式将宿主机的文件或者目录挂载到容器中. 在容器中管理数据主要有两种方式: 数据卷(Data ...
- iOS_iPhone App自动化测试
无线客户端的发展很快,特别针对是android和ios两款无线操作系统的客户端应用,相应的测试工具也应运而生,这里主要给大家介绍一些针对 iPhone App的自动化测试工具. 首先 ...
- JS,JQuery,获得选中的Radio值
1.HTML代码 <input type=" checked="checked" /><label for="a1">男< ...
- python_django_models模块中的查询
查询集:表示从数据库获取的对象集合,查询集可以有多个过滤器,过滤器就是一个函数(方法),基于所给参数限制查询集结果 从sql角度来说,查询集和select等价,过滤器和where等价 查询集特点: 惰 ...
- css---盒模型新增样式
box-shadow 以逗号分割列表来描述一个或多个阴影效果,可以用到几乎任何元素上. 如果元素同时设置了 border-radius ,阴影也会有圆角效果.多个阴影时和多个 text shadows ...