动态SQL
一、动态SQL概述
在项目开发中,经常需要根据不同的条件拼接SQL语句,而MyBatis提供了对SQL语句动态的组装能力。MyBatis采用功能强大的基于OGNL(Object Graph Navigation Language,对象导航图语言)的表达式来动态完成SQL
属性名称 | 描述 |
if | 单条件分支判断语句 |
choose,when,otherwise | 多条件分支判断语句,相当于Java中的case when语句 |
trim,where,set | 用于处理SQL拼装问题、辅助元素 |
foreach | 循环语句 |
if语句
IUserDao.java
/** * 根据传入的参数条件来查询 * @param user 查询条件,有可能有用户名、有可能有密码、有可能有编号,有可能都有 * @return */ List<User> findUserByCondition(User user);
SqlMapConfig.xml
<select id="findUserByCondition" parameterType="cn.zhongger.daomain.User" resultType="cn.zhongger.daomain.User"> select * from users where 1=1 <if test="user_name != null"> and user_name=#{user_name} </if> </select>
测试类中
@Test public void testFindByCondition(){ User user = new User(); user.setUser_name("Zhongger"); List<User> userList = mapper.findUserByCondition(user); for (User u:userList ) { System.out.println(u); } }
运行结果如下:
where语句
IUserDao.java
/** * 根据传入的参数条件来查询 * @param user 查询条件,有可能有用户名、有可能有密码、有可能有编号,有可能都有 * @return */ List<User> findUserByCondition1(User user);
IUserDao.xml
<select id="findUserByCondition1" parameterType="cn.zhongger.daomain.User" resultType="cn.zhongger.daomain.User"> select * from users <where> <if test="user_name!=null"> and user_name=#{user_name} </if> <if test="pass_word!=null"> and pass_word=#{pass_word} </if> </where> </select>
测试类
@Test public void testFindByCondition1(){ User user = new User(); user.setUser_name("Zhongger"); user.setPass_word("211"); List<User> userList = mapper.findUserByCondition1(user); for (User u:userList ) { System.out.println(u); } }
查询结果
foreach语句
元素配置信息如下表:
属性名称 | 描述 |
collection | 接口传进来的参数,可以是数组、List、Set等集合 |
item | 循环中当前的元素 |
open | 以什么符号将集合中的元素包装起来,如"(" |
separator | 各个元素的分隔符 |
close | 以什么符号将集合中的元素包装起来,如")" |
index | 配置的是当前元素在集合的位置下标 |
IUserDao.java
List<User> findUserByIds(QueryVo qv);
QueryVo.java
package cn.zhongger.daomain; import java.util.List; /** * 用于包装多个对象 * 来作为查询条件的POJO类 */ public class QueryVo { private User user; private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
IUserDao.xml
<select id="findUserByIds" resultType="cn.zhongger.daomain.User" parameterType="cn.zhongger.daomain.QueryVo"> select * from users <where> <if test="ids!=null and ids.size()>0"> <foreach collection="ids" open="and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
测试类
@Test public void testFindUserByIds(){ QueryVo queryVo = new QueryVo(); List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(3); list.add(5); list.add(8); queryVo.setIds(list); List<User> userList = mapper.findUserByIds(queryVo); for (User u:userList ) { System.out.println(u); } }
查询结果