MyBatis 动态 SQL 之通用 where
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 动态 SQL 之通用 where相关的知识,希望对你有一定的参考价值。
参考技术A 使用MyBatis过程中无可避免的要用到动态SQL做查询;有关MyBatis动态SQL的基础不在此记录,需要的同学可以去MyBatis官网查手册。本文要解决的问题如下:
生成动态SQL时需要支持的内容:
通用 where 的 xml 配置段如下:
通用数据结构声明如下:
最好使用Builder来构造 Filter和List<Filter> 。
Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取
1. 动态Sql概述
2. 动态Sql之<if>
(包含<where>
)
我们根据实体类的不同取值,使用不同的SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username不为空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。
示例:
2.1 测试:
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--现在的namespace对应UserDao的全限定类名-->
<mapper namespace="com.tian.dao.UserDao">
<!--查询操作 id对象UserDao的方法名-->
<select id="findAll" resultType="user" parameterType="user">
select *
from user
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
<if test="password != null">
and username = #{password}
</if>
</where>
</select>
</mapper>
测试代码:
package com.tian.test;
import com.tian.dao.UserDao;
import com.tian.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class MyBatisTest {
@Test
//查询操作
public void test1() throws Exception {
// 获取SqlSession
InputStream resourceAsStream = Resources.getResourceAsStream("SqIMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用dao层方法
UserDao mapper = sqlSession.getMapper(UserDao.class);
// 后面2个参数我设置为了null
List<User> userList = mapper.findAll(new User(1, null, null));
System.out.println(userList);
}
}
运行结果:
3. 动态Sql之<foreach>
循环执行sql的拼接操作,例如:SELECT * FROM USER WHERE id lN (1,2,5)。
3.1 测试
现在新增一个根据ID集合查找数据的方法
UserMapper.xml
<!-- 根据ID查找 -->
<!-- select * from user where id in (?,?,?)-->
<select id="findByIds" parameterType="list" resultType="user">
select * from user
<where>
<foreach collection="list" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
说明:
测试代码:
@Test
//查询操作
public void test1() throws Exception {
// 获取SqlSession
InputStream resourceAsStream = Resources.getResourceAsStream("SqIMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 调用dao层方法
UserDao mapper = sqlSession.getMapper(UserDao.class);
ArrayList<Integer> integers = new ArrayList<>();
for (int i = 1; i <= 3; i++) {
integers.add(i);
}
List<User> userList = mapper.findByIds(integers);
System.out.println(userList);
}
4. sql片段抽取
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。
以上是关于MyBatis 动态 SQL 之通用 where的主要内容,如果未能解决你的问题,请参考以下文章