Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql
转载请注明出处: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
- <select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.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="joanna.yan.mybatis.entity.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>
1.4测试代码
- @Test
- public void findUserListTest() throws Exception{
- SqlSession sqlSession=sqlSessionFactory.openSession();
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo=new UserQueryVo();
- UserCustom userCustom=new UserCustom();
- //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
- // userCustom.setSex("1");
- userCustom.setUsername("张三丰");
- userQueryVo.setUserCustom(userCustom);
- List<UserCustom> list=userMapper.findUserList(userQueryVo);
- System.out.println(list);
- }
打印的sql:如果不设置sex的值,条件不会拼接在sql中
2.sql片段
2.1 需求
将上边实现的动态sql判断代码块抽取出来,组成一个sql片段。其它的statement中就可以引用sql片段。方便程序员进行开发。
2.2 定义sql片段
- <!--定义sql片段
- id:sql片段的唯一标识
- 经验:1.是基于单表来定义sql片段的,这样的话这个sql片段可重用性才高
- 2.在sql片段中不要包括where
- -->
- <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>
2.3 引用sql片段
在mapper.xml中定义statement中引用sql片段:
- <select id="findUserList" parameterType="joanna.yan.mybatis.entity.UserQueryVo" resultType="joanna.yan.mybatis.entity.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="joanna.yan.mybatis.entity.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>
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片段。
- <!--定义sql片段
- id:sql片段的唯一标识
- 经验:1.是基于单表来定义sql片段的,这样的话这个sql片段可重用性才高
- 2.在sql片段中不要包括where
- -->
- <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 test="ids!=null">
- <!--使用foreach遍历传入的ids
- collection:指定输入对象中集合属性
- item:每个遍历生成的对象名
- open:开始遍历时拼接的串
- close:结束遍历时拼接的串
- separator:遍历的两个对象中需要拼接的串
- -->
- <!--是要实现下边的sql拼接:
- AND (id=1 OR id=10 OR id=16)
- -->
- <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or">
- <!--每个遍历需要拼接的串 -->
- id=#{user_id}
- </foreach>
- </if>
- </if>
- </sql>
3.4 测试代码
- @Test
- public void findUserListTest() throws Exception{
- SqlSession sqlSession=sqlSessionFactory.openSession();
- UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
- //创建包装对象,设置查询条件
- UserQueryVo userQueryVo=new UserQueryVo();
- UserCustom userCustom=new UserCustom();
- //由于这里使用动态sql,如果不设置某个值,条件不会拼接在sql中
- // userCustom.setSex("1");
- userCustom.setUsername("小明");
- //传入多个id
- List<Integer> ids=new ArrayList<>();
- ids.add(1);
- ids.add(10);
- ids.add(16);
- userQueryVo.setIds(ids);
- userQueryVo.setUserCustom(userCustom);
- List<UserCustom> list=userMapper.findUserList(userQueryVo);
- System.out.println(list);
- }
如果此文对您有帮助,微信打赏我一下吧~
Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql的更多相关文章
- Spring+SpringMVC+MyBatis深入学习及搭建(六)——MyBatis关联查询
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6923464.html 前面有将到:Spring+SpringMVC+MyBatis深入学习及搭建(五)--动 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十五)——SpringMVC注解开发(基础篇)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7065294.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十四)--S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十六)——SpringMVC注解开发(高级篇)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7085268.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十五)——S ...
- Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6869133.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(四)——MyBatis输入映射与输出映射
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6878529.html 前面有讲到Spring+SpringMVC+MyBatis深入学习及搭建(三)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(七)——MyBatis延迟加载
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6953005.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(六)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...
- Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...
随机推荐
- Xamarin.Forms+Prism(1)—— 开发准备
本次随笔连载,主要用于记录本人在项目中,用Xamarin.Forms开发APP中所使用的第三方技术或一些技巧. 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xama ...
- while循环语句的几种方式
我们知道,在Python中经常我们要使用循环,其中最常用的是while循环,while有很多结合方式,我们知道,如果一个循环没有结束语句那么就失去了意义,所以我们一定要有结束语句,下面来看看while ...
- ASP.NET MVC4 微信公众号开发之网页授权(二):通过公众号AppID(应用ID)和AppSecret(应用密钥)取得网页授权openid
ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境 通过了上一篇文章我们已经搭建好了基础开发大环境,现在打开开发环境这里我用的是 vs2013,通过如下方式: 拼接请求链接重定向到 ...
- JS中的循环嵌套 BOM函数
[嵌套循环特点] 外层循环转一次,内层循环转一圈 外层循环控制行数,内层循环控制每行元素个数 [做 ...
- Hive 的简单使用及调优参考文档
Hive 的简单使用及调优参考文档 HIVE的使用 命令行界面 使用一下命令查看hive的命令行页面, hive --help --service cli 简化命令为hive –h 会输出下面的这 ...
- Python数据处理——numpy_3
通过前面两次的学习,基本上对numpy有了一定的认识,所以,接下来进一步对numpy学习.同时,最后以一个有趣的例子加深对numpy的理解. import numpy as np xarr = np. ...
- DirectFB环境搭建
一.下载安装包 http://www.directfb.org/index.php?path=Main%2FDownloads git clone git://git.directfb.org/git ...
- Flask 学习笔记
Flask 是一个Web应用框架,我也就是一边看书,一边写博文做记录 这本书: 首先安装Flask ,和配置环境,参考这边博客: 然后就开始学习Flask 了. 1.Application and R ...
- SQLiteServer+SQLiteClient 用于.Net项目的SQLite服务端程序和客户端类库
SQLite没有官方的支持CS方式调用的方式,因项目需要我自行开发了一个简易的版本. 当前版本支持的方法 SQLiteOpen(fileName):bool SQLiteClose():void SQ ...
- 如何使用HTML5自定义数据属性
在本文中,我将向你介绍如何使用HTML5自定义数据属性.我还将向你介绍一些开发人员在工作中经常使用的优秀实例. 为什么需要自定义数据属性? 很多时候我们需要存储一些与不同DOM元素相关联的信息.这些信 ...