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语句之间的相互转 ...
随机推荐
- NX二次开发-C++的vector排序去重用法
#include <algorithm> //vector排序去重 sort( BoxNum.begin(), BoxNum.end()); BoxNum.erase(unique(Box ...
- csp-s模拟测试91
csp-s模拟测试91 倒悬吃屎的一套题. $T1$认真(?)分析题意发现复杂度不能带$n$(?),计划直接维护答案,考虑操作对答案的影响,未果.突然发现可以动态开点权值线段树打部分分,后来$Tm$一 ...
- Dll注入技术之注册表注入
DLL注入技术之REG注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EX ...
- JVM虚拟机瓜分内存原则
操作系统分配给每个进程的内存是有限制的,例如32位的Windows限制为2GB.虚拟机提供了参数来控制java堆和方法区(非堆)这两部分内存的最大值.则剩余的内存为2GB(操作系统限制)减去Xmx(最 ...
- java执行spark查询hbase的jar包出现错误提示:ob aborted due to stage failure: Master removed our application: FAILED
执行java调用scala 打包后的jar时候出现异常 /14 23:57:08 WARN TaskSchedulerImpl: Initial job has not accepted any re ...
- 使用R语言 SDK调取tushare数据
安装Tushare 打开RStudio,在控制台输入命令: > install.packages('Tushare') Tushare的R包需要依赖httr.tidyverse.forecast ...
- C++之关键字&标识符命名规则
关键字 **作用:**关键字是C++中预先保留的单词(标识符) * **在定义变量或者常量时候,不要用关键字** C++关键字如下: 提示:在给变量或者常量起名称时候,不要用C++得关键字,否则会产生 ...
- 22-MySQL-Ubuntu-备份与恢复
案例: 将数据库jing_dong_1的数据库备份,然后恢复到数据库jing_dong_2; 步骤如下: 1.备份 注意: mysqldump 不是 mysql; 尖括号的方向; python.sql ...
- selenium基础(滚动条操作)
滚动条操作:当待操作的元素在页面可是区域外时,要将待操作的元素滚动到可视区域当中 步骤:1.先找要将要操作的元素element = driver.find_element_by_xxxx(" ...
- javascript字符串方法学习汇总
1.charAt(index) charAt(index):返回字符串中指定位置的字符 var str = 'abcdefghi'; console.log(str.charAt()); // 输出 ...