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片段抽取

Mybatis – 动态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的主要内容,如果未能解决你的问题,请参考以下文章

通用Mapper

Mybatis之动态sql

SpringBoot框架之通用mapper插件(tk.mybatis)

Mybatis之动态构建SQL语句

MyBatis之动态 SQL

mybatis 之动态sql 增删改查