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 拼接时多余的 AND 或 OR 关键字,并去掉多余的 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>
相关推荐
深圳老胡1 分钟前
STM32F4 OTA 升级双 App 方案设计与实现
笔记·stm32·单片机·代码规范
HRTOS2 分钟前
HRTOS 4.0 内核资源配置优化:减少资源对象与消息队列数量
经验分享·单片机·系统架构·51单片机
APIshop3 分钟前
淘宝详情接口全解析:从官方开放平台到第三方数据服务
java·python·api
陈年老古董19 分钟前
Hive 分区表学习笔记:语法、操作、二级分区与动态分区
hive·笔记·学习
省钱兄--zs20 分钟前
24小时自助健身房系统软件开发实战:从架构设计到部署全指南
java·数据仓库·spring boot·系统架构·需求分析
IT研究室23 分钟前
最新计算机毕业设计选题推荐-基于spring boot的智慧教学资源管理与互动交流平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
蜗牛互联网25 分钟前
Java HttpClient 调用 Gemini 图像理解与金额字段校验
java·开发语言·人工智能·后端·python
开开心心就好26 分钟前
视频里的图片怎么提取?双击一下就导出
java·前端·人工智能·spring·智能手机·intellij-idea·excel
蜗牛互联网27 分钟前
Python Responses API视觉输入与本地金额校验最小实现
java·开发语言·人工智能·后端·python
程序猿_极客30 分钟前
【免费】分享一套优质的基于Java的智慧养老院管理系统的设计与实现(带可视化),源码+文档+视频详解(讲解)
java·spring boot·后端·养老院管理系统