Dynamic sql (sql-if, sql-foreach)

say sth..
每当我回顾以前写jdbc分页,多条件查询时,我那是有多痛苦。
特别是当我拼接条件时,对象.getName 又是判断null,又是判断空字符串的。
还得拿一个集合来装条件。以及列名后面的逗号,where 条件的空格。
我/(ㄒoㄒ)/~~
搞得我特别压抑,好了,现在mybatis的sql标签来甜我了。\( ̄︶ ̄*\))

Dynamic query under jdbc specification

1. UserMapper interface

user表字段userId userName userPassword
查询涉及到
 - where不确定条件查询 sql-if
 - in 多条件查询
 - 不提供实体类
package cn.bitqian.dao;

import cn.bitqian.entity.User;

import java.util.List;

/**
 * @author echo lovely
 * @date 2020/9/11 15:36
 */
public interface UserMapper {
    
    

    public List<User> queryUserByCondition(User user);

    public List<User> queryUserByIds(List<Integer> ids);
}

1. sql-if

<?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">
        
<mapper namespace="cn.bitqian.dao.UserMapper">

    <!--sql 片段的抽取 statement标签内使用include标签进行引用-->
    <sql id="selectUserPart">
        select * from users1
    </sql>

    <!-- 根据id or name or pwd 查询 -->
    <select id="queryUserByCondition" parameterType="user" resultType="user">
        <include refid="selectUserPart"></include>
        <where>
            <if test="userId != 0 and userId != null">
                and userid = #{userId}
            </if>
            <if test="userName != null">
                and username = #{userName}
            </if>
            <if test="userPassword != null">
                and userpassword = #{userPassword}
            </if>
        </where>
    </select>
</mapper>

2. sql-foreach

<?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">

<mapper namespace="cn.bitqian.dao.UserMapper">

    <select id="queryUserByIds" parameterType="list" resultType="user">
        select * from users1 <!-- where userid in (1, 2, 3) -->
        <where>
            <!--
                collection=array
                open, end 拼接sql写死的片段
                separator 为分隔符
                item 为list中的每个元素
             -->
            <foreach collection="list" open="userid in (" close=")" separator="," item="userId">
                #{userId}
            </foreach>
        </where>
    </select>

</mapper>

3. Multi-condition query and query test based on multiple id

import cn.bitqian.dao.UserMapper;
import cn.bitqian.entity.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.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 动态sql测试
 * @author echo lovely
 * @date 2020/9/11 15:50
 */
public class DynamicDemoTest {
    
    

    public SqlSession getSqlSession() {
    
    
        try {
    
    
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            // 默认提交事务
            return sqlSessionFactory.openSession(true);
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

        return null;
    }

    @Test
    public void test1() {
    
    
        SqlSession sqlSession = getSqlSession();

        if (sqlSession != null) {
    
    
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

            User user = new User();
            // user.setUserId(1);
            user.setUserName("rose");
            user.setUserPassword("love jack");
            List<User> userList = userMapper.queryUserByCondition(user);

            System.out.println(userList);

            sqlSession.close();
        }

    }

    @Test
    public void test2() {
    
    
        SqlSession sqlSession = getSqlSession();

        if (sqlSession != null) {
    
    
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            ArrayList<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(3);

            // 查询user id 为1或者为2的数据记录
            System.out.println(userMapper.queryUserByIds(list));
            sqlSession.close();
        }
    }

}

Guess you like

Origin blog.csdn.net/qq_44783283/article/details/108538736