通过mybatis提供的各种标签方法实现动态拼接sql。

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

  查询sql:

  SELECT id, username, birthday, sex, address FROM `user` WHERE sex = 1 AND username LIKE '%张%'

一、if标签

1.1 Mapper.xml文件

  UserMapper.xml配置sql,如下:

  1. <!-- 根据条件查询用户 -->
  2. <select id="queryUserByWhere" parameterType="user" resultType="user">
  3. SELECT id, username, birthday, sex, address FROM `user`
  4. WHERE sex = #{sex} AND username LIKE
  5. '%${username}%'
  6. </select>

1.2 Mapper接口

  1.   /**
  2. * 根据条件查询用户
  3. * @param user
  4. * @return
  5. */
  6. List<User> queryUserByWhere(User user);

1.3 测试方法

  1.   @Test
  2. public void testQueryUserByWhere() throws Exception {
  3. // mybatis和spring整合,整合之后,交给spring管理
  4. SqlSession sqlSession = sqlSessionFactory.openSession();
  5. // 创建Mapper接口的动态代理对象,整合之后,交给spring管理
  6. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  7. // 使用userMapper执行根据条件查询用户
  8. User user = new User();
  9. user.setSex("男");
  10. user.setUsername("张");
  11. List<User> list = userMapper.queryUserByWhere(user);
  12. for (User user2 : list) {
  13. System.out.println(user2);
  14. }
  15. // mybatis和spring整合,整合之后,交给spring管理
  16. sqlSession.close();
  17. }

1.4 效果

  

  如果注释掉 user.setSex("男"),测试结果如下图:

  

  测试结果二很显然不合理。

  按照之前所学的,要解决这个问题,需要编写多个sql,查询条件越多,需要编写的sql就更多了,显然这样是不靠谱的。

  解决方案,使用动态sql的if标签

1.5 使用if标签

  改造UserMapper.xml,如下:

  1. <!-- 根据条件查询用户 -->
  2. <select id="queryUserByWhere" parameterType="user" resultType="user">
  3. SELECT id, username, birthday, sex, address FROM `user`
  4. WHERE 1=1
  5. <if test="sex != null and sex != ''">
  6. AND sex = #{sex}
  7. </if>
  8. <if test="username != null and username != ''">
  9. AND username LIKE
  10. '%${username}%'
  11. </if>
  12. </select>

1.6 效果

  

  测试OK

  注意:判断是否为空字符串时,单(双)引号里面不能填空格,否则会报错

  

二、Where标签

  上面的sql还有where 1=1 这样的语句,很麻烦

  可以使用where标签进行改造

  改造UserMapper.xml,如下

  1.   <!-- 根据条件查询用户 -->
  2. <select id="queryUserByWhere" parameterType="user" resultType="user">
  3. SELECT id, username, birthday, sex, address FROM `user`
  4. <!-- where标签可以自动添加where,同时处理sql语句中第一个前AND关键字 -->
  5. <where>
  6. <if test="sex!=null and sex != ' '">
  7. AND sex = #{sex}
  8. </if>
  9. <if test="username!=null and username != ''">
  10. AND username LIKE
  11. '%${username}%'
  12. </if>
  13. </where>
  14. </select>

三、sql片段

  Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

  把上面例子中的id, username, birthday, sex, address提取出来,作为sql片段,如下:

  1. <!-- 声明sql片段 -->
  2. <sql id="userFields">
  3. id, username, birthday, sex, address
  4. </sql>
  5.  
  6. <!-- 根据条件查询用户 -->
  7. <select id="queryUserByWhere" parameterType="user" resultType="user">
  8. SELECT <include refid="userFields"/> FROM `user`
  9. <!-- where标签可以自动添加where,同时处理sql语句中第一个前AND关键字 -->
  10. <where>
  11. <if test="sex!=null and sex != ' '">
  12. AND sex = #{sex}
  13. </if>
  14. <if test="username!=null and username != ''">
  15. AND username LIKE
  16. '%${username}%'
  17. </if>
  18. </where>
  19. </select>

  如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace

  

四、foreach标签

  向sql传递数组或List,mybatis使用foreach解析

  需求:根据多个id查询用户信息

  查询sql:SELECT * FROM user WHERE id IN (1,10,24)

4.1 改造QueryVo

  1. public class QueryVo {
  2. // 包含其他的pojo
  3. private User user;
  4.  
  5. private List<Integer> ids;
  6.  
  7. get/set...
  8. }

4.2 Mapper.xml文件

  UserMapper.xml添加sql:

  1. <!-- 根据ids查询用户 -->
  2. <select id="queryUserByIds" parameterType="queryVo" resultType="user">
  3. SELECT * FROM `user`
  4. <where>
  5. <!-- foreach标签,进行遍历 -->
  6. <!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
  7. <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
  8. <!-- open:在前面添加的sql片段 -->
  9. <!-- close:在结尾处添加的sql片段 -->
  10. <!-- separator:指定遍历的元素之间使用的分隔符 -->
  11. <foreach collection="ids" item="item" open="id IN (" close=")"
  12. separator=",">
  13. #{item}
  14. </foreach>
  15. </where>
  16. </select>

4.3 Mapper接口

  在UserMapper接口中添加方法:

  1. /**
  2. * 根据ids查询用户
  3. * @param queryVo
  4. * @return
  5. */
  6. List<User> queryUserByIds(QueryVo queryVo);

4.4 测试方法

  1. @Test
  2. public void testQueryUserByIds() throws Exception {
  3. // mybatis和spring整合,整合之后,交给spring管理
  4. SqlSession sqlSession = sqlSessionFactory.openSession();
  5. // 创建Mapper接口的动态代理对象,整合之后,交给spring管理
  6. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  7. QueryVo queryVo = new QueryVo();
  8.  
  9. List<Integer> ids = new ArrayList<>();
  10. ids.add(1);
  11. ids.add(10);
  12. ids.add(16);
  13. queryVo.setIds(ids);
  14. List<User> list = userMapper.queryUserByIds(queryVo);
  15. for (User user : list) {
  16. System.out.println(user);
  17. }
  18.  
  19. // mybatis和spring整合,整合之后,交给spring管理
  20. sqlSession.close();
  21. }

  效果:

  

Mybatis学习笔记(六) —— 动态sql的更多相关文章

  1. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL

  2. Mybatis学习笔记之---动态sql中标签的使用

    动态Sql语句中标签的使用 (一)常用标签 1.<if> if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段 ...

  3. 1.3(Mybatis学习笔记)动态SQL

    一.<if> 使用<if>可以根据具体情况来拼接SQL语句,使其更加灵活更加适应我们的需求. <if>的标签体中是需要拼接的语句,满足条件才会将其进行拼接. < ...

  4. Mybatis学习笔记14 - 动态sql之foreach标签

    一.查询给定集合中员工id对应的所有员工信息 示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import ...

  5. Mybatis学习笔记10 - 动态sql之if判断

    示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; import java.util.List; public ...

  6. Mybatis学习笔记13 - 动态sql之set标签

    示例代码: 接口定义: package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapp ...

  7. Mybatis学习笔记12 - 动态sql之choose(when otherwise)标签

    choose (when, otherwise):分支选择:带了break的swtich-case 示例代码: 接口定义: package com.mybatis.dao; import com.my ...

  8. Mybatis学习笔记11 - 动态sql之trim标签

    trim标签体中是整个字符串拼串后的结果.prefix="" 前缀: prefix给拼串后的整个字符串加一个前缀prefixOverrides="" 前缀覆盖: ...

  9. MyBatis:学习笔记(4)——动态SQL

    MyBatis:学习笔记(4)——动态SQL 如果使用JDBC或者其他框架,很多时候需要你根据需求手动拼装SQL语句,这是一件非常麻烦的事情.MyBatis提供了对SQL语句动态的组装能力,而且他只有 ...

随机推荐

  1. eclipse中maven的配置与使用

    以eclipse Juno版本为例 1.插件安装 eclipse==>help====>install new software===>add name :m2e location: ...

  2. HTML布局,插件的调用方法

  3. xUtils 源码解析

    1. 功能介绍 xUtils 一个 Android 公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块. View 模块主要的功能是通过注解绑定 UI,资源,事件. D ...

  4. day70-oracle 12-触发器

    查询是没有触发器的.trigger是一个数据库的对象.PL/SQL程序是在我插入之前执行还是在插入之后执行?触发器类似于java中的监听器. 监听插入操作,执行一段PLSQL程序. 禁止在非工作时间插 ...

  5. Cocos2d-js 热更新学习笔记

    转载至: http://blog.csdn.net/pt_xxj/article/details/68927705 为什么还要再写一篇关于cocos2d js热更新的笔记,最单纯的想法就是记录心得,另 ...

  6. 华为2013年西安java机试题目:如何过滤掉数组中的非法字符。

    这道题目为记忆版本: 题目2描述: 编写一个算法,过滤掉数组中的非法字符,最终只剩下正式字符. 示例:输入数组:“!¥@&HuaWei*&%123” 调用函数后的输出结果,数组:“Hu ...

  7. NIO、AIO

  8. 实现斗地主纸牌游戏---洗牌 发牌 看底牌的具体功能------Map集合存储方法 遍历的应用

    该Demo只是斗地主的游戏的一部分,实现的斗地主的组合牌  洗牌  发牌 看牌的功能,主要应用Map集合进行练习 package cn.lijun import java.util.ArrayList ...

  9. java全栈day04--方法

    day04内容介绍 1  方法基础知识 2  方法高级内容 3  方法案例 一  方法的概念 A:为什么要有方法 提高代码的复用性 B   什么是方法 完成特定功能的代码块 修饰符  返回值类型  方 ...

  10. Head First HTML与CSS(第2版) 中文pdf扫描版​

    是不是已经厌倦了那些深奥的HTML书?你可能在抱怨,只有成为专家之后才能读懂那些书.那么,找一本新修订的<Head First HTML与CSS(第2版)>吧,来真正学习HTML.你可能希 ...