转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6908763.html

前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射

mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

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

1. if&where

1.2 需求

用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。

对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。

1.3 mapper.xml

  1. <select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.UserCustom">
  2. SELECT * FROM USER
  3. <!--where可以自动去掉条件中的第一个and -->
  4. <where>
  5. <if test="userCustom!=null">
  6. <if test="userCustom.sex!=null and userCustom.sex!=''">
  7. and user.sex=#{userCustom.sex}
  8. </if>
  9. <if test="userCustom.username!=null and userCustom.username!=''">
  10. and user.username LIKE '%${userCustom.username}%'
  11. </if>
  12. </if>
  13. </where>
  14. </select>
  15.  
  16. <select id="findUserCount" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="int">
  17. SELECT count(*) FROM USER
  18. <!--where可以自动去掉条件中的第一个and -->
  19. <where>
  20. <if test="userCustom!=null">
  21. <if test="userCustom.sex!=null and userCustom.sex!=''">
  22. and user.sex=#{userCustom.sex}
  23. </if>
  24. <if test="userCustom.username!=null and userCustom.username!=''">
  25. and user.username LIKE '%${userCustom.username}%'
  26. </if>
  27. </if>
  28. </where>
  29. </select>

1.4测试代码

  1. @Test
  2. public void findUserListTest() throws Exception{
  3. SqlSession sqlSession=sqlSessionFactory.openSession();
  4. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  5. //创建包装对象,设置查询条件
  6. UserQueryVo userQueryVo=new UserQueryVo();
  7. UserCustom userCustom=new UserCustom();
  8. //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
  9. // userCustom.setSex("1");
  10. userCustom.setUsername("张三丰");
  11. userQueryVo.setUserCustom(userCustom);
  12. List<UserCustom> list=userMapper.findUserList(userQueryVo);
  13. System.out.println(list);
  14. }

打印的sql:如果不设置sex的值,条件不会拼接在sql中

2.sql片段

2.1 需求

将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。

2.2 定义sql片段

  1. <!--定义sql片段
  2. id:sql片段的唯一标识
  3.  
  4. 经验:1.是基于单表来定义sql片段的,这样的话这个sql片段可重用性才高
  5. 2.在sql片段中不要包括where
  6. -->
  7. <sql id="query_user_where">
  8. <if test="userCustom!=null">
  9. <if test="userCustom.sex!=null and userCustom.sex!=''">
  10. and user.sex=#{userCustom.sex}
  11. </if>
  12. <if test="userCustom.username!=null and userCustom.username!=''">
  13. and user.username LIKE '%${userCustom.username}%'
  14. </if>
  15. </if>
  16. </sql>

2.3 引用sql片段

在mapper.xml中定义statement中引用sql片段:

  1. <select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.UserCustom">
  2. SELECT * FROM USER
  3. <!--where可以自动去掉条件中的第一个and -->
  4. <where>
  5. <!--引用sql片段的id,如果refid指定的id不在本mapper文件中,需要在前边加namespace -->
  6. <include refid="query_user_where"></include>
  7. <!--在这里还可以引用其它的sql片段 -->
  8. </where>
  9. </select>
  10.  
  11. <select id="findUserCount" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="int">
  12. SELECT count(*) FROM USER
  13. <!--where可以自动去掉条件中的第一个and -->
  14. <where>
  15. <!--引用sql片段的id,如果refid指定的id不在本mapper文件中,需要在前边加namespace -->
  16. <include refid="query_user_where"></include>
  17. <!--在这里还可以引用其它的sql片段 -->
  18. </where>
  19. </select>

3. foreach

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

3.1 需求

在用户查询列表和查询总数的statement中增加多个id输入查询。

sql语句如下,两种方法:

SELECT * FROM USER WHERE id=1 OR id=10 OR id=16

SELECT * FROM USER WHERE id IN(1,10,16)

3.2 在输入参数类型中添加List<Integer> ids传入多个id

3.3 修改mapper.xml

WHERE id=1 OR id=10 OR id=16

在前面的查询条件中,查询条件定义成了一个sql片段,现在我们需要修改sql片段。

  1. <!--定义sql片段
  2. id:sql片段的唯一标识
  3.  
  4. 经验:1.是基于单表来定义sql片段的,这样的话这个sql片段可重用性才高
  5. 2.在sql片段中不要包括where
  6. -->
  7. <sql id="query_user_where">
  8. <if test="userCustom!=null">
  9. <if test="userCustom.sex!=null and userCustom.sex!=''">
  10. and user.sex=#{userCustom.sex}
  11. </if>
  12. <if test="userCustom.username!=null and userCustom.username!=''">
  13. and user.username LIKE '%${userCustom.username}%'
  14. </if>
  15. <if test="ids!=null">
  16. <!--使用foreach遍历传入的ids
  17. collection:指定输入对象中集合属性
  18. item:每个遍历生成的对象名
  19. open:开始遍历时拼接的串
  20. close:结束遍历时拼接的串
  21. separator:遍历的两个对象中需要拼接的串
  22. -->
  23. <!--是要实现下边的sql拼接:
  24. AND (id=1 OR id=10 OR id=16)
  25. -->
  26. <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
  27. <!--每个遍历需要拼接的串 -->
  28. id=#{user_id}
  29. </foreach>
  30. </if>
  31. </if>
  32. </sql>

3.4 测试代码

  1. @Test
  2. public void findUserListTest() throws Exception{
  3. SqlSession sqlSession=sqlSessionFactory.openSession();
  4. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  5. //创建包装对象,设置查询条件
  6. UserQueryVo userQueryVo=new UserQueryVo();
  7. UserCustom userCustom=new UserCustom();
  8. //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
  9. // userCustom.setSex("1");
  10. userCustom.setUsername("小明");
  11. //传入多个id
  12. List<Integer> ids=new ArrayList<>();
  13. ids.add(1);
  14. ids.add(10);
  15. ids.add(16);
  16. userQueryVo.setIds(ids);
  17. userQueryVo.setUserCustom(userCustom);
  18. List<UserCustom> list=userMapper.findUserList(userQueryVo);
  19. System.out.println(list);
  20. }

如果此文对您有帮助,微信打赏我一下吧~

Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...

  2. Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...

  3. Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...

  4. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6953005.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(六)——My ...

  8. Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...

随机推荐

  1. Xamarin.Forms+Prism(1)—— 开发准备

    本次随笔连载,主要用于记录本人在项目中,用Xamarin.Forms开发APP中所使用的第三方技术或一些技巧. 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xama ...

  2. while循环语句的几种方式

    我们知道,在Python中经常我们要使用循环,其中最常用的是while循环,while有很多结合方式,我们知道,如果一个循环没有结束语句那么就失去了意义,所以我们一定要有结束语句,下面来看看while ...

  3. ASP.NET MVC4 微信公众号开发之网页授权(二):通过公众号AppID(应用ID)和AppSecret(应用密钥)取得网页授权openid

    ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境 通过了上一篇文章我们已经搭建好了基础开发大环境,现在打开开发环境这里我用的是 vs2013,通过如下方式: 拼接请求链接重定向到 ...

  4. JS中的循环嵌套 BOM函数

    [嵌套循环特点]                           外层循环转一次,内层循环转一圈              外层循环控制行数,内层循环控制每行元素个数             [做 ...

  5. Hive 的简单使用及调优参考文档

    Hive 的简单使用及调优参考文档   HIVE的使用 命令行界面 使用一下命令查看hive的命令行页面, hive --help --service cli 简化命令为hive –h 会输出下面的这 ...

  6. Python数据处理——numpy_3

    通过前面两次的学习,基本上对numpy有了一定的认识,所以,接下来进一步对numpy学习.同时,最后以一个有趣的例子加深对numpy的理解. import numpy as np xarr = np. ...

  7. DirectFB环境搭建

    一.下载安装包 http://www.directfb.org/index.php?path=Main%2FDownloads git clone git://git.directfb.org/git ...

  8. Flask 学习笔记

    Flask 是一个Web应用框架,我也就是一边看书,一边写博文做记录 这本书: 首先安装Flask ,和配置环境,参考这边博客: 然后就开始学习Flask 了. 1.Application and R ...

  9. SQLiteServer+SQLiteClient 用于.Net项目的SQLite服务端程序和客户端类库

    SQLite没有官方的支持CS方式调用的方式,因项目需要我自行开发了一个简易的版本. 当前版本支持的方法 SQLiteOpen(fileName):bool SQLiteClose():void SQ ...

  10. 如何使用HTML5自定义数据属性

    在本文中,我将向你介绍如何使用HTML5自定义数据属性.我还将向你介绍一些开发人员在工作中经常使用的优秀实例. 为什么需要自定义数据属性? 很多时候我们需要存储一些与不同DOM元素相关联的信息.这些信 ...