【MyBatis框架】mapper配置文件-关于动态sql
动态sql
1.什么是动态sql
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
2.需求
用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。
对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
3.mapper.xml
原查询语句配置:
- <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
- <!-- 用户信息综合查询
- #{UserCustom.sex}取出包装对象中性别值
- ${UserCustom.username}取得pojo包装对象中用户名称
- -->
- <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
- resultType="cn.edu.hpu.mybatis.PO.UserCustom">
- select * from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
- </select>
- <!-- 用户信息综合查询总数 -->
- <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
- select count(*) from user where user.sex=#{userCustom.sex} and user.username like '%${userCustom.username}%'
- </select>
- ......
- </mapper>
修改后的查询语句配置:
- <!-- 用户信息综合查询
- #{UserCustom.sex}取出包装对象中性别值
- ${UserCustom.username}取得pojo包装对象中用户名称
- -->
- <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
- resultType="cn.edu.hpu.mybatis.PO.UserCustom">
- select * from user
- <!-- where标签可以自动去掉第一个and -->
- <where>
- <if test="userCustom!=null">
- <if test="userCustom.sex!=null and userCustom.sex!=''">
- and user.sex=#{userCustom.sex}
- </if>
- <if test="userCustom.username!=null and userCustom.username!=''">
- and user.username like '%${userCustom.username}%'
- </if>
- </if>
- </where>
- </select>
- <!-- 用户信息综合查询总数 -->
- <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
- select count(*) from user
- <!-- where标签可以自动去掉第一个and -->
- <where>
- <if test="userCustom!=null">
- <if test="userCustom.sex!=null and userCustom.sex!=''">
- and user.sex=#{userCustom.sex}
- </if>
- <if test="userCustom.username!=null and userCustom.username!=''">
- and user.username like '%${userCustom.username}%'
- </if>
- </if>
- </where>
- </select>
4.测试代码
- //用户信息综合查询
- @Test
- public void testFindUserList() throws Exception{
- SqlSession sqlSession=sqlSessionFactory.openSession();
- //创建UserMapper代理对象
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo=new UserQueryVo();
- UserCustom userCustom=new UserCustom();
- //由于这里使用动态sql,如果这里不设置某个值,条件不会拼接在sql中
- //userCustom.setSex("男");
- userCustom.setUsername("张三");
- userQueryVo.setUserCustom(userCustom);
- //调用userMapper的方法
- List<UserCustom> users=userMapper.findUserList(userQueryVo);
- for (int i = 0; i < users.size(); i++) {
- UserCustom user=(UserCustom)users.get(i);
- System.out.println(user.getId()+":"+user.getUsername());
- }
- }
测试结果:
1:张三
4:张三丰
输出日志:
- DEBUG [main] - Opening JDBC Connection
- DEBUG [main] - Created connection 31761534.
- DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1e4a47e]
- DEBUG [main] - ==> Preparing: select * from user WHERE user.username like '%张三%'
- DEBUG [main] - ==> Parameters:
- DEBUG [main] - <== Total: 2
发现sql语句为select * from user WHERE user.username like '%张三%' ,并没有将sex拼接进去,说明我们的动态sql设置成功
相应的,把userCustom.setUsername("张三");也注释掉,发现输出日志:
- DEBUG [main] - Opening JDBC Connection
- DEBUG [main] - Created connection 24027753.
- DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@16ea269]
- DEBUG [main] - ==> Preparing: select * from user
- DEBUG [main] - ==> Parameters:
- DEBUG [main] - <== Total: 5
发现sql语句为select * from user,并没有将sex和username拼接进去,说明我们的动态sql设置成功
5.sql片段
5.1需求
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。
方便程序员进行开发。
5.2定义sql片段
- <mapper namespace="cn.edu.hpu.mybatis.mapper.UserMapper">
- <!-- 定义sql片段
- id:sql片段的唯一标识
- 在sql片段中不要加入where
- 经验:一般我们定义sql片段是为了可重用性,是基于单表来定义sql片段,
- 这样的话这个sql片段可重用性才高-->
- <sql id="query_user_where">
- <if test="userCustom!=null">
- <if test="userCustom.sex!=null and userCustom.sex!=''">
- and user.sex=#{userCustom.sex}
- </if>
- <if test="userCustom.username!=null and userCustom.username!=''">
- and user.username like '%${userCustom.username}%'
- </if>
- </if>
- </sql>
- ......
- </mapper>
5.3引用sql片段
在mapper.xml中定义的statement中引用sql片段:
- <!-- 用户信息综合查询
- #{UserCustom.sex}取出包装对象中性别值
- ${UserCustom.username}取得pojo包装对象中用户名称
- -->
- <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
- resultType="cn.edu.hpu.mybatis.PO.UserCustom">
- select * from user
- <!-- where标签可以自动去掉第一个and -->
- <where>
- <!-- 应用sql片段的id,如果refid指定的id不再本mapper文件中,需要前边加namespace -->
- <include refid="query_user_where"></include>
- <!-- 在这里还可能要引用其他的sql片段 -->
- </where>
- </select>
- <!-- 用户信息综合查询总数 -->
- <select id="findUserCount" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" resultType="int">
- select count(*) from user
- <!-- where标签可以自动去掉第一个and -->
- <where>
- <!-- 应用sql片段的id,如果refid指定的id不再本mapper文件中,需要前边加namespace -->
- <include refid="query_user_where"></include>
- <!-- 在这里还可能要引用其他的sql片段 -->
- </where>
- </select>
测试:
- //用户信息综合查询
- @Test
- public void testFindUserList() throws Exception{
- SqlSession sqlSession=sqlSessionFactory.openSession();
- //创建UserMapper代理对象
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo=new UserQueryVo();
- UserCustom userCustom=new UserCustom();
- //由于这里使用动态sql,如果这里不设置某个值,条件不会拼接在sql中
- userCustom.setSex("男");
- userCustom.setUsername("张三");
- userQueryVo.setUserCustom(userCustom);
- //调用userMapper的方法
- List<UserCustom> users=userMapper.findUserList(userQueryVo);
- for (int i = 0; i < users.size(); i++) {
- UserCustom user=(UserCustom)users.get(i);
- System.out.println(user.getId()+":"+user.getUsername());
- }
- }
测试结果:
1:张三
4:张三丰
输出日志:
- DEBUG [main] - Opening JDBC Connection
- DEBUG [main] - Created connection 17689439.
- DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@10deb5f]
- DEBUG [main] - ==> Preparing: select * from user
- DEBUG [main] - ==> Parameters:
- DEBUG [main] - <== Total: 5
说明sql片段引用成功
小结:
sql片段方便程序员进行开发
【MyBatis框架】mapper配置文件-关于动态sql相关推荐
- MyBatis框架(6)动态sql
本次全部学习内容:MyBatisLearning 什么是动态sql: mybatis的核心,对sql进行灵活的操作,通过对表达式的判断,对sql灵活的拼接 在之前小案例的基础上我们先进行简单的实现一下 ...
- Mybatis的特性详解——动态SQL
Mybatis的特性详解--动态SQL 前言 一.动态sql的元素 1.MyBatis if标签:条件判断 2.MyBatis choose.when和otherwise标签 3.MyBatis wh ...
- MyBatis框架知识点大全,从0到1(配置文件和使用、手动和全自动映射、lombok使用、Mybatis测试工具类、动态SQL、通过注解来实现动态SQL和手动一对一、一对多、多对多映射)
MyBatis框架 这里写的感觉有点多,到时候拆开发,需要哪看目录就好
- Springboot框架整合Mybatis-plus实战动态SQL以及常见的Mybatis面试题
目录 MyBatis的动态SQL是最令人喜欢的功能 if 标签 include标签 choose标签 ,配合when ,otherwise 标签使用 where 标签 foreach 标签 bind ...
- Mybatis的第三章动态sql总结
我们来讲一下为什么要使用Mybatis的动态sql ? *因为动态sql之所以是Mybatis 的强大特性是因为我们在使用JDBC操作数据库的时候如果查询特别的多,将条件串联成sql字符串是一件很痛苦 ...
- Mybatis Plus 是如何实现动态 SQL 语句的?原理你懂吗?
作者 | 稻草江南 来源 | https://juejin.cn/post/6883081187103866894 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,那么它是怎么 ...
- Mybatis中输入输出映射和动态Sql
一.输入映射 我们通过配置parameterType的值来指定输入参数的类型,这些类型可以是简单数据类型.POJO.HashMap等数据类型 1.简单类型 2.POJO包装类型 ①这是单表查询的时候传 ...
- mybatis学习笔记四(动态sql)
直接贴图,注解在代码上,其他的配置文件在学习一中就不贴了 1 数据库 2 实体类 package com.home.entity;/*** 此类是: 用户实体类* @author hpc* @2017 ...
- JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
parameterType 传入多个参数 确切点是方法的输入参数,一般都是采用直接使用pojo类.此时在mapper.xml文件中的SQL语句不用再写parameterType属性,而是用arg0,a ...
最新文章
- Ninject(二)——Modules和Kernel
- Spring 的优点
- html body background color,HTML Style backgroundColor用法及代码示例
- Ajax实现页面加载等待
- [设想]增加比较的多元运算符
- 51单片机c语言开发工具keil安装
- java设计模式之组合设计模式
- 用Java实现美女选妃
- 智能客服搭建(5) - FreeSWITCH + mod_unimrcp + ESL 开发对接
- 【好东西】ACM在线模版-f-zyj
- 未来计算机图文,毕业图文集 |未来也要笑着走
- 随手记录第二话 -- 高并发情况下秒杀、抢红包都有哪些实现方式?
- android黑色背景图片,Android png透明图片转jpg时背景变黑的解决方法
- 富春山居图的幽默犀利台词
- dart pub私有仓库搭建、私有仓库上传方法、上传工具定制
- 针对电脑进行网络诊断显示“您可能需要与该网络的Internet服务提供商ISP签署协议才能获得访问Internet的权限”问题的解决方法
- MySQL的limit分页公式和总页数计算
- SEC起诉瑞波,中本聪早有论断
- 亚马逊测评培训,那些你不知道的事
- JVM -XX:CMSInitiatingOccupancyFraction=90 这个参数是有取值范围的