Mybatis中使用<SQL></SQL>公共引用

MyBatis中公共SQL引用的使用
博客介绍了MyBatis中公共引用的使用。SQL标签可抽取可重用的SQL片段,如查询或插入列名,通过include引用。在企业开发中,面对复杂SQL查询,可利用此方法实现公共SQL引用,还介绍了Mapper.xml定义、Mapper引用及测试输出结果。

Mybatis中使用<SQL></SQL>公共引用

简述: SQL 标签是用于抽取可重用的 SQL 片段,将相同的,使用频繁的 SQL 片段抽取出来,单独定义,方便多次引用。抽取可重用的sql片段。方便后面引用

  • sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
  • include来引用已经抽取的sql

使用场景: 在企业开发中,我们需要写一些复杂的SQL查询语句,可能在一个XML中会有多个SQL语句的条件不同但是查询条件的内容不同等,我们可以使用Mybatis中的<sql></sql>来实现公共的SQL引用


我们来简单演示一下如何使用SQL标签

一、Mapper.xml

定义公共<sql>

<?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="com.ywt.springboot.mapper.StudentMapper">
    <sql id="publicSQL">
        select * from student
    </sql>
</mapper>

二、Mapper

public interface StudentMapper {
    List<Student> queryOne(Integer id);
    List<Student> queryTwo(Integer id);
}

引用<sql>

<?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="com.ywt.springboot.mapper.StudentMapper">
    <sql id="publicSQL">
        select *
        from student
    </sql>

    <select id="queryOne" resultType="student">
        <include refid="publicSQL"/>
        where id = #{id}
    </select>
    <select id="queryTwo" resultType="student">
        <include refid="publicSQL"/>
        where id = #{id}
    </select>
</mapper>

<include>中的refid需要指向<sql>id的value

三.测试

@Test
    void select() {
        List<Student> listOne = studentMapper.queryOne(7);
        List<Student> listTwo = studentMapper.queryTwo(9);

        System.out.println("listOne:" + listOne.toString());
        System.out.println("listTwo:" + listTwo.toString());
    }

输出结果
在这里插入图片描述

### MyBatis XML `<sql>` 标签的使用方法 `<sql>` 标签在 MyBatis 中用于定义可复用的 SQL 片段,从而减少重复代码并提高维护效率。通过 `<include>` 标签可以将这些预定义的 SQL 片段嵌入到其他 SQL 语句中。 #### 定义 `<sql>` 标签 在一个 MyBatis 映射文件中,可以通过 `<sql>` 标签定义一段通用的 SQL 片段,并为其分配唯一的 `id` 属性作为标识符[^1]。例如: ```xml <sql id="userColumns"> id, username, email, phone </sql> ``` 上述代码定义了一个名为 `userColumns` 的 SQL 片段,它包含了用户表中的常用列名。 #### 使用 `<include>` 标签引用 `<sql>` 片段 当需要在其他 SQL 查询中重用此片段时,可以利用 `<include>` 标签来引用已定义的 `<sql>` 内容[^2]。以下是具体示例: ##### 示例 1:SELECT 查询中使用 `<include>` 假设有一个查询操作需要获取用户的多个字段,则可以直接调用之前定义好的 `userColumns`: ```xml <select id="selectUsers" resultType="User"> SELECT <include refid="userColumns"/> FROM users WHERE status = #{status} </select> ``` 此处通过 `<include refid="userColumns"/>` 将先前定义的列列表插入到了实际执行的 SQL 中。 ##### 示例 2:复杂查询中的动态拼接 除了静态引用外,在涉及动态条件的情况下也可以灵活运用 `<if>` 和 `<where>` 结合 `<include>` 实现更复杂的逻辑处理[^3]。如下所示: ```xml <select id="findActiveUsersByCondition" parameterType="map" resultType="User"> SELECT <include refid="userColumns"/> FROM users <where> <if test="username != null">AND username LIKE CONCAT('%',#{username},'%')</if> <if test="email != null">AND email = #{email}</if> </where> </select> ``` 在这个例子中,不仅实现了基本的数据检索功能,还加入了针对不同参数值有条件地附加过滤器的能力。 --- ### 注意事项 - **唯一性**:每个 `<sql>` 块都应具有全局唯一的 `id` 值以防止冲突。 - **作用域**:只有在同一 Mapper 文件内的其它节点才能访问由当前文件声明出来的 `<sql>` 资源;跨文件间无法共享未导出的内容除非采用特定配置方式(如继承机制或其他扩展手段)[^4]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值