mybatis入门基础(五)----动态SQL
来源:互联网 发布:超级基因优化液毛球 编辑:程序博客网 时间:2024/06/06 01:59
本文转自http://www.cnblogs.com/selene/p/4613035.html
一:动态SQL
1.1.定义
mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
1.2.案例需求
用户信息综合查询列表这个statement的定义使用动态sql,对查询条件进行判断,如果输入参数不为空才进行查询拼接。
1.3.UserMapper.xml
<!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值 ${userCustom.username}:取出pojo对象中用户名称--> <select id="findUserList" parameterType="com.mybatis.entity.UserQueryVo" resultType="com.mybatis.entity.UserCustom"> select * from t_user <!-- 动态sql查询:where可以自动去掉第一个and --> <where> <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!='' "> and sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!='' "> and username=#{userCustom.username} </if> </if> </where><!-- where sex=#{userCustom.sex} and username LIKE '%${userCustom.username}%' --> </select>
1.4.测试代码
@Test public void testFindUserList() { SqlSession sqlSession = sqlSessionFactory.openSession(); //创造查询条件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom();// userCustom.setSex("2"); //这里使用动态sql,如果不设置某个值,条件不会拼接sql中 userCustom.setUsername("小"); userQueryVo.setUserCustom(userCustom); // 创建Usermapper对象,mybatis自动生成mapper代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<UserCustom>list=mapper.findUserList(userQueryVo); //测试动态sql,属性的非空判断测试// List<UserCustom>list=mapper.findUserList(null); System.out.println(list); sqlSession.commit(); sqlSession.close(); }
二:SQL片段
2.1.需求
将上边的动态sql判断代码抽取出来,组成一个sql片段,其它的statement中就可以引用sql片段,方便开发。
2.2.定义sql片段
<!-- 定义sql片段,Id是唯一标识 建议:是基于单表来定义sql片段,这样的话sql片段的可重用性才高,在sql片段中不要包含where --> <sql id="query_user_where" > <if test="userCustom!=null"> <if test="userCustom.sex!=null and userCustom.sex!='' "> and sex=#{userCustom.sex} </if> <if test="userCustom.username!=null and userCustom.username!='' "> and username=#{userCustom.username} </if> </if> </sql>
2.3.在mapper.xml中定义的statement中引用sql片段
<!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值 ${userCustom.username}:取出pojo对象中用户名称--> <select id="findUserList" parameterType="com.mybatis.entity.UserQueryVo" resultType="com.mybatis.entity.UserCustom"> select * from t_user <!-- 动态sql查询:where可以自动去掉第一个and --> <where> <!-- 引用sql片段的id,如果refid指定的不在本mapper.xml中,需要前边加namespace --> <include refid="query_user_where"></include> <!-- 这里可以引用其它的sql片段 --> </where> </select>
三:foreach
作用:向sql传递数组或者list,mybatis使用foreach解析
在用户查询列表和查询总数的statement中增加多个id输入查询。
3.1.需求
sql语句如下:
两种方法:
SELECT * FROM t_user WHERE id=1 OR id=10 OR id=16
SELECT * FROM t_user WHERE id IN(1,10,16)
3.2.在输入参数包装类型中添加List ids 传入多个id
package com.mybatis.entity;import java.util.List;/** * * @ClassName: UserQueryVo * @Description: TODO(包装类型) * @author warcaft * */public class UserQueryVo { public List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; }}
3.3.mapper.xml代码
<!-- 实现下边的sql拼接 select * from t_user where id=1 OR id=2 OR id=3 --> <select id="findUserByIds" parameterType="com.mybatis.entity.UserQueryVo" resultType="com.mybatis.entity.User"> select * from t_user <where> <if test="ids!=null"> <!-- 使用foreach遍历ids collection:指定输入对象的集合属性 item:每个遍历生成对象中 open:开始遍历时拼接的串 close:技术遍历时拼接的串 separator:遍历的两个对象中需要拼接的串 --> <foreach collection="ids" item="user_id" open="AND (" close=")" separator="or"> id=#{user_id} </foreach> </if> </where> </select>
select * from t_user where id in(1,2,3)的mapper.xml配置
<select id="findUserByIds" parameterType="com.mybatis.entity.UserQueryVo" resultType="com.mybatis.entity.User"> select * from t_user <where> <if test="ids!=null"> <!-- 使用foreach遍历ids collection:指定输入对象的集合属性 item:每个遍历生成对象中 open:开始遍历时拼接的串 close:技术遍历时拼接的串 separator:遍历的两个对象中需要拼接的串 --> <!-- 实现“ select * from t_user where id in(1,2,3)”拼接 --> <foreach collection="ids" item="user_id" open="AND id in (" close=")" separator=","> id=#{user_id} </foreach> </if> </where> </select>
userMapper.java代码
public interface UserMapper { //ids查询用户数据 public List<User> findUserByIds(UserQueryVo userQueryVo); }
Junit测试代码
@Test public void findUserByIdsTest() { SqlSession sqlSession = sqlSessionFactory.openSession(); // 创建Usermapper对象,mybatis自动生成mapper代理对象 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //创造查询条件 UserQueryVo userQueryVo = new UserQueryVo(); //传入多个id List<Integer> ids=new ArrayList<Integer>(); ids.add(1); ids.add(2); ids.add(3); //将ids通过userQueryVo传入statement中 userQueryVo.setIds(ids); //调用userMapper的代码 List<UserCustom> userList= mapper.findUserList(userQueryVo); System.out.println(userList); sqlSession.close(); }
阅读全文
0 0
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- mybatis入门基础(五)----动态SQL
- 五,MyBatis动态SQL
- mybatis入门基础--纯sql和自定义的动态sql
- mybatis入门-动态sql
- mybatis-动态 SQL(五)
- mybatis基础教程之五:动态SQL
- Mybatis系列(五)动态SQL
- mybatis学习笔记(五) 动态SQL
- Mybatis深入了解(五)----动态SQL
- Mybatis深入了解(五)----动态SQL
- Mybatis深入了解(五)----动态SQL
- MyBatis(一) 为什么使用框架。
- Redis 主从复制、读写分离、高可用(七)-part 1
- Drop it
- React Native 组件之Touchable*源码解析
- mongodb无法注册windows服务
- mybatis入门基础(五)----动态SQL
- SSL、TLS协议格式、HTTPS通信过程、RDP SSL通信过程
- 正则表达式验证用户名、密码、手机号码、身份证
- Java调用C++编写的动态库(JNI)
- 自定义欢迎界面跳过按钮
- Permutations(主要谈谈如何做全排列,组合等回溯的使用)
- ZOJ 3819 Average Score【水题】
- 端口号及分类
- 设置TextView滚动效果