Mybatis学习(四)

一、MyBatis 映射文件 SQL 深入

1. 动态 SQL 之 if 标签

动态sql常用于根据条件拼接查询语句。

1.1 UserMapper 接口方法
java 复制代码
package com.qcby.mapper;
import java.util.List;
import cnom.qcby.domain.User;
​
public interface UserMapper {
    
    // 条件查询
    public List<User> findByWhere(User user);
    
}

1.2 UserMapper.xml 配置(使用 if 标签)

java 复制代码
<select id="findByWhere" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">
    select * from user where 1 = 1
    <if test="username != null and username != ''">
        and username like #{username}
    </if>
    <if test="sex != null and sex != ''">
        and sex = #{sex}
    </if>
</select>

1.3 测试方法

java 复制代码
@Test
    public void testFindByWhere() throws IOException {
        // 先加载主配置文件,加载到输入流中
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 创建SqlSessionFactory对象,创建SqlSession对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        // 创建SqlSession对象
        SqlSession session = factory.openSession();
​
        User user = new User();
        user.setUsername("%熊%");
        user.setSex("女");
        
        // 条件查询
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> list = mapper.findByWhere(user);
        for (User user1 : list) {
            System.out.println(user1);
        }
        
        // 关闭资源
        session.close();
        inputStream.close();
    }

2. 动态 SQL 之 where 标签

<where>标签可以自动处理 SQL 拼接时多余的 ANDOR 关键字,并去掉多余的 where 1=1

2.1 UserMapper.xml

java 复制代码
<!-- 使用 where 标签,更优雅的条件查询 -->
<select id="findByWhere" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">
    select * from user
    <where>
        <if test="username != null and username != ''">
            and username like #{username}
        </if>
        <if test="sex != null and sex != ''">
            and sex = #{sex}
        </if>
    </where>
</select>

3. 动态 SQL 之 foreach 标签

<foreach> 标签用于遍历集合(如 List、数组),常用于构建 IN 语句或批量 OR 条件。

3.1 需求一:构建 id = 1 or id = 2 or id = 3 这样的查询

User 类中添加 List<Integer> ids 属性及 getter/setter。

java 复制代码
public class User implements Serializable{
    
    private static final long serialVersionUID = 525400707336671154L;
    
    // 主键
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    
    // 定义ids属性,用来存储所有的id
    private List<Integer> ids;
    
    // 提供get和set方法

在UserMapper接口中添加方法

java 复制代码
public List<User> findByIds(User user);

UserMapper.xml 配置

java 复制代码
<!-- foreach 实现 or 拼接 -->
<select id="findByIds" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">
    select * from user
    <where>
        <foreach collection="ids" open="id = " separator="or id = " item="i">
            #{i}
        </foreach>
    </where>
</select>

编写测试方法

java 复制代码
@Test
    public void testFindByIds() throws IOException {
        // 先加载主配置文件,加载到输入流中
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 创建SqlSessionFactory对象,创建SqlSession对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        // 创建SqlSession对象
        SqlSession session = factory.openSession();
​
        User user = new User();
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        user.setIds(ids);
​
        // 条件查询
        UserMapper mapper = session.getMapper(UserMapper.class);
        List<User> list = mapper.findByIds(user);
        for (User user1 : list) {
            System.out.println(user1);
        }
​
        // 关闭资源
        session.close();
        inputStream.close();
    }
3.2 需求二:构建 id in (1,2,3) 这样的查询

UserMapper.xml 配置

java 复制代码
<!-- foreach 实现 IN 查询 -->
<select id="findByIds" parameterType="com.qcby.domain.User" resultType="com.qcby.domain.User">
    select * from user
    <where>
        <foreach collection="ids" open="id in ( " separator="," close=")" item="i">
            #{i}
        </foreach>
    </where>
</select>

4. 提取公共的 SQL 语句

使用 <sql><include> 标签可以定义并重用公共的 SQL 片段。

java 复制代码
<!-- 定义公共 SQL -->
<sql id="findAllSql">
    select * from user
</sql>

<!-- 使用公共 SQL -->
<select id="findAll" resultType="com.qcby.domain.User">
    <include refid="findAllSql" />
</select>
相关推荐
.生产的驴2 小时前
SpringBoot 大文件分片上传 文件切片、断点续传与性能优化 切片技术与优化方案 文件高效上传
java·服务器·spring boot·后端·spring·spring cloud·状态模式
不灭锦鲤2 小时前
网络安全学习第171天
学习·安全·web安全
艾莉丝努力练剑2 小时前
剑指巅峰,磨砺芳华:我的 CSDN 创作一周年深度总结
linux·运维·服务器·c++·学习
Chunyyyen4 小时前
【第四十二周】论文阅读
论文阅读·学习
lwf00616410 小时前
导数学习日记
学习·算法·机器学习
yaoxin52112311 小时前
390. Java IO API - WatchDir 示例
java·前端·python
qeen8711 小时前
【编程日记】现阶段总结
学习
字节跳动的猫12 小时前
2026 四款 AI:AI 开发工具链对比
经验分享
daanpdf12 小时前
新视野大学英语视听说教程2第四版听力音频原文及答案
笔记