动态sql

1.什么是动态sql
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。

2.需求

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

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

3.mapper.xml
原查询语句配置:

[html] view plaincopy
  1. <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
  2. <!-- 用户信息综合查询
  3. #{UserCustom.sex}取出包装对象中性别值
  4. ${UserCustom.username}取得pojo包装对象中用户名称
  5. -->
  6. <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
  7. resultType="cn.edu.hpu.mybatis.PO.UserCustom">
  8. select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
  9. </select>
  10. <!-- 用户信息综合查询总数 -->
  11. <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
  12. select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
  13. </select>
  14. ......
  15. </mapper>

修改后的查询语句配置:

[html] view plaincopy
  1. <!-- 用户信息综合查询
  2. #{UserCustom.sex}取出包装对象中性别值
  3. ${UserCustom.username}取得pojo包装对象中用户名称
  4. -->
  5. <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
  6. resultType="cn.edu.hpu.mybatis.PO.UserCustom">
  7. select * from user
  8. <!-- where标签可以自动去掉第一个and -->
  9. <where>
  10. <if test="userCustom!=null">
  11. <if test="userCustom.sex!=null and userCustom.sex!=''">
  12. and user.sex=#{userCustom.sex}
  13. </if>
  14. <if test="userCustom.username!=null and userCustom.username!=''">
  15. and user.username like '%${userCustom.username}%'
  16. </if>
  17. </if>
  18. </where>
  19. </select>
  20. <!-- 用户信息综合查询总数 -->
  21. <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
  22. select count(*) from user
  23. <!-- where标签可以自动去掉第一个and -->
  24. <where>
  25. <if test="userCustom!=null">
  26. <if test="userCustom.sex!=null and userCustom.sex!=''">
  27. and user.sex=#{userCustom.sex}
  28. </if>
  29. <if test="userCustom.username!=null and userCustom.username!=''">
  30. and user.username like '%${userCustom.username}%'
  31. </if>
  32. </if>
  33. </where>
  34. </select>

4.测试代码

[java] view plaincopy
  1. //用户信息综合查询
  2. @Test
  3. public void testFindUserList() throws Exception{
  4. SqlSession sqlSession=sqlSessionFactory.openSession();
  5. //创建UserMapper代理对象
  6. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  7. //创建包装对象,设置查询条件
  8. UserQueryVo userQueryVo=new UserQueryVo();
  9. UserCustom userCustom=new UserCustom();
  10. //由于这里使用动态sql,如果这里不设置某个值,条件不会拼接在sql中
  11. //userCustom.setSex("男");
  12. userCustom.setUsername("张三");
  13. userQueryVo.setUserCustom(userCustom);
  14. //调用userMapper的方法
  15. List<UserCustom> users=userMapper.findUserList(userQueryVo);
  16. for (int i = 0; i < users.size(); i++) {
  17. UserCustom user=(UserCustom)users.get(i);
  18. System.out.println(user.getId()+":"+user.getUsername());
  19. }
  20. }

测试结果:
1:张三
4:张三丰

输出日志:

[plain] view plaincopy
  1. DEBUG [main] - Opening JDBC Connection
  2. DEBUG [main] - Created connection 31761534.
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1e4a47e]
  4. DEBUG [main] - ==>  Preparing: select * from user WHERE user.username like '%张三%'
  5. DEBUG [main] - ==> Parameters:
  6. DEBUG [main] - <==      Total: 2

发现sql语句为select * from user WHERE user.username like '%张三%' ,并没有将sex拼接进去,说明我们的动态sql设置成功

相应的,把userCustom.setUsername("张三");也注释掉,发现输出日志:

[plain] view plaincopy
  1. DEBUG [main] - Opening JDBC Connection
  2. DEBUG [main] - Created connection 24027753.
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@16ea269]
  4. DEBUG [main] - ==>  Preparing: select * from user
  5. DEBUG [main] - ==> Parameters:
  6. DEBUG [main] - <==      Total: 5

发现sql语句为select * from user,并没有将sex和username拼接进去,说明我们的动态sql设置成功

5.sql片段

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

5.2定义sql片段

[html] view plaincopy
  1. <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
  2. <!-- 定义sql片段
  3. id:sql片段的唯一标识
  4. 在sql片段中不要加入where
  5. 经验:一般我们定义sql片段是为了可重用性,是基于单表来定义sql片段,
  6. 这样的话这个sql片段可重用性才高-->
  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>
  17. ......
  18. </mapper>

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

[html] view plaincopy
  1. <!-- 用户信息综合查询
  2. #{UserCustom.sex}取出包装对象中性别值
  3. ${UserCustom.username}取得pojo包装对象中用户名称
  4. -->
  5. <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
  6. resultType="cn.edu.hpu.mybatis.PO.UserCustom">
  7. select * from user
  8. <!-- where标签可以自动去掉第一个and -->
  9. <where>
  10. <!-- 应用sql片段的id,如果refid指定的id不再本mapper文件中,需要前边加namespace -->
  11. <include refid="query_user_where"></include>
  12. <!-- 在这里还可能要引用其他的sql片段 -->
  13. </where>
  14. </select>
  15. <!-- 用户信息综合查询总数 -->
  16. <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
  17. select count(*) from user
  18. <!-- where标签可以自动去掉第一个and -->
  19. <where>
  20. <!-- 应用sql片段的id,如果refid指定的id不再本mapper文件中,需要前边加namespace -->
  21. <include refid="query_user_where"></include>
  22. <!-- 在这里还可能要引用其他的sql片段 -->
  23. </where>
  24. </select>

测试:

[java] view plaincopy
  1. //用户信息综合查询
  2. @Test
  3. public void testFindUserList() throws Exception{
  4. SqlSession sqlSession=sqlSessionFactory.openSession();
  5. //创建UserMapper代理对象
  6. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  7. //创建包装对象,设置查询条件
  8. UserQueryVo userQueryVo=new UserQueryVo();
  9. UserCustom userCustom=new UserCustom();
  10. //由于这里使用动态sql,如果这里不设置某个值,条件不会拼接在sql中
  11. userCustom.setSex("男");
  12. userCustom.setUsername("张三");
  13. userQueryVo.setUserCustom(userCustom);
  14. //调用userMapper的方法
  15. List<UserCustom> users=userMapper.findUserList(userQueryVo);
  16. for (int i = 0; i < users.size(); i++) {
  17. UserCustom user=(UserCustom)users.get(i);
  18. System.out.println(user.getId()+":"+user.getUsername());
  19. }
  20. }

测试结果:
1:张三
4:张三丰

输出日志:

[plain] view plaincopy
  1. DEBUG [main] - Opening JDBC Connection
  2. DEBUG [main] - Created connection 17689439.
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@10deb5f]
  4. DEBUG [main] - ==>  Preparing: select * from user
  5. DEBUG [main] - ==> Parameters:
  6. DEBUG [main] - <==      Total: 5

说明sql片段引用成功

小结:

sql片段方便程序员进行开发

【MyBatis框架】mapper配置文件-关于动态sql相关推荐

  1. MyBatis框架(6)动态sql

    本次全部学习内容:MyBatisLearning 什么是动态sql: mybatis的核心,对sql进行灵活的操作,通过对表达式的判断,对sql灵活的拼接 在之前小案例的基础上我们先进行简单的实现一下 ...

  2. Mybatis的特性详解——动态SQL

    Mybatis的特性详解--动态SQL 前言 一.动态sql的元素 1.MyBatis if标签:条件判断 2.MyBatis choose.when和otherwise标签 3.MyBatis wh ...

  3. MyBatis框架知识点大全,从0到1(配置文件和使用、手动和全自动映射、lombok使用、Mybatis测试工具类、动态SQL、通过注解来实现动态SQL和手动一对一、一对多、多对多映射)

    MyBatis框架 这里写的感觉有点多,到时候拆开发,需要哪看目录就好

  4. Springboot框架整合Mybatis-plus实战动态SQL以及常见的Mybatis面试题

    目录 MyBatis的动态SQL是最令人喜欢的功能 if 标签 include标签 choose标签 ,配合when ,otherwise 标签使用 where 标签 foreach 标签 bind ...

  5. Mybatis的第三章动态sql总结

    我们来讲一下为什么要使用Mybatis的动态sql ? *因为动态sql之所以是Mybatis 的强大特性是因为我们在使用JDBC操作数据库的时候如果查询特别的多,将条件串联成sql字符串是一件很痛苦 ...

  6. Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?

    作者 | 稻草江南 来源 | https://juejin.cn/post/6883081187103866894 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,那么它是怎么 ...

  7. Mybatis中输入输出映射和动态Sql

    一.输入映射 我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型.POJO.HashMap等数据类型 1.简单类型 2.POJO包装类型 ①这是单表查询的时候传 ...

  8. mybatis学习笔记四(动态sql)

    直接贴图,注解在代码上,其他的配置文件在学习一中就不贴了 1 数据库 2 实体类 package com.home.entity;/*** 此类是: 用户实体类* @author hpc* @2017 ...

  9. JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句

    parameterType 传入多个参数 确切点是方法的输入参数,一般都是采用直接使用pojo类.此时在mapper.xml文件中的SQL语句不用再写parameterType属性,而是用arg0,a ...

最新文章

  1. Ninject(二)——Modules和Kernel
  2. Spring 的优点
  3. html body background color,HTML Style backgroundColor用法及代码示例
  4. Ajax实现页面加载等待
  5. [设想]增加比较的多元运算符
  6. 51单片机c语言开发工具keil安装
  7. java设计模式之组合设计模式
  8. 用Java实现美女选妃
  9. 智能客服搭建(5) - FreeSWITCH + mod_unimrcp + ESL 开发对接
  10. 【好东西】ACM在线模版-f-zyj
  11. 未来计算机图文,毕业图文集 |未来也要笑着走
  12. 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?
  13. android黑色背景图片,Android png透明图片转jpg时背景变黑的解决方法
  14. 富春山居图的幽默犀利台词
  15. dart pub私有仓库搭建、私有仓库上传方法、上传工具定制
  16. 针对电脑进行网络诊断显示“您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限”问题的解决方法
  17. MySQL的limit分页公式和总页数计算
  18. SEC起诉瑞波,中本聪早有论断
  19. 亚马逊测评培训,那些你不知道的事
  20. JVM -XX:CMSInitiatingOccupancyFraction=90 这个参数是有取值范围的

热门文章

  1. IT兄弟连 JavaWeb教程 JSP经典面试题
  2. arc073F Many Moves
  3. 20165318 结对编程项目-四则运算 阶段总结
  4. corosync+openais+pacemaker构建高可用性集群
  5. Web应用——焦点图自动浏览
  6. oracle trunc()函数用法
  7. centos关闭邮件提醒
  8. python步长为负时的情况
  9. [WinAPI] API 14 [获取、设置文件属性和时间]
  10. Android开发小技巧之商品属性筛选与商品筛选