SpringBootWeb 篇-深入了解 Mybatis 中的 XML 映射文件、Mybatisx 插件与动态 SQL(if、foreach、sql & include 等)

🔥博客主页: 【小扳_-优快云博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 XML 映射文件概述

        1.1 XML 映射文件的配置

        2.0 Mybatisx 插件

        3.0 动态 SQL

        3.1 动态 SQL - if 标签

        3.2 动态 SQL - foreach 标签

        3.3 动态 SQL - sql 标签与 include 标签

        3.4 动态 SQL - set 标签


        1.0 XML 映射文件概述

        MyBatis 除了注解的方式来简化数据库操作外,还提供使用 XML 映射文件来描述对象与数据库表之间的映射关系和 SQL 查询语句了。注解可以减少 XML 配置文件的编写量,也可以更加方便地在 Java 代码中进行数据库操作。

        1.1 XML 映射文件的配置

        1)XML 映射文件的名称与 Mapper 接口名称要一致,并且将 XML 映射文件和 Mapper 接口放置在相同包下(同包同名)

        XML 映射文件通常都是放置在 resources 资源目录下,首先在 resources 资源目录下创建一个跟 Mapper 接口相同的包。

        使用 "/" 来分割,才能创建出分级目录,而使用 "." 来分割,创建不了分级目录。

 接着在资源目录下已经创建好的 Project 文件中来创建一个跟 Mapper 接口类名相同的 Mapper.xml 文件。

        再接着,对已经创建好的 Mapper.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">

        2)XML 映射文件的 namespace 属性为 Mapper 接口全类名。

        在 XML 文件中,<mapper> 标签有一个属性 namespace ,将 namespace 赋值为 Mapper 接口的全类名。

<?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="org.example.Project.Mapper">

</mapper>

        这就完成了 Mapper 接口映射到 XML 文件中了。

补充:全类名是什么?

        全类名指的是一个类的完整路径和名称,包括包名、子包名、类名等所有信息。通常以顶级包名开始,使用"."作为分隔符。如:ArrayList 类的全类名为 java.util.ArrayList 。

快速获取 Mapper 接口的全类名:

        3)XML 映射文件中的 SQL 语句的 id 与 Mapper 接口中的方法的全类名保持一致,并保持返回类型一致。

        SQL 语句就可以写在 <mapper> 标签里面了,SQL 基础操作都有特定的标签,如:< delete >、<update>、<insert>、<select> 。这四个标签都有一个 id 属性,用来指定映射到特定的接口中的抽象方法。

        <select> 标签还有一个 resultType 属性,用来指定查询结果的数据类型。简单理解为是一个返回值的类型。该类型必须是类型的全类名

代码演示:

<?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="org.example.Project.Mapper">

    <delete id="delete">
        delete from Student where id = #{id};
    </delete>

    <insert id="insert">
        insert into Student(id,name,gender) values (#{id},#{name},#{gender});
    </insert>

    <update id="update">
        update Student set name = #{name}, gender = #{gender} where id = #{id};
    </update>

    <select id="select" resultType="org.example.Project.Student">
        select * from Student where id = #{id};
    </select>

</mapper>
@org.apache.ibatis.annotations.Mapper
public interface  Mapper{

    //根据ID删除
    public void delete(int id);

    //新增数据
    public void insert(Student student);


    //根据id更新数据Mapper
    public void update(Student student);

    //根据ID查询数据
    public Student select(int id);

}

        XML 映射文件 SQL 语句中的标签中的属性 id 与接口中的抽象方法名一一对应,完成自动映射。

测试代码演示:

import junit.framework.TestCase;
import org.example.Project.Mapper;
import org.example.Project.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * Unit test for simple App.
 */
@SpringBootTest
public class AppTest extends TestCase {

    @Autowired
    Mapper mapper;

    //新增
    @Test
    public void testInsert(){
        Student student = new Student(5,"小童","女");
        mapper.insert(student);
    }

    //查询操作
    @Test
    public void testSelect(){
        Student student1 = mapper.select(5);
        System.out.println(student1);
    }

    //更新
    @Test
    public void testUpdate(){
        Student student = new Student(1,"小板","男");
        mapper.update(student);
    }

    //删除操作
    @Test
    public void testDelete(){
        mapper.delete(5);
    }

}

        2.0 Mybatisx 插件

        MyBatisX 是一款为 MyBatis 框架提供代码自动生成的插件,它可以帮助开发人员快速生成 MyBatis 的 Mapper XML 文件、Java 实体类以及对应的 DAO 接口。通过 MyBatisX 插件,可以极大地提高开发效率,减少重复性的代码编写工作。

        MyBatisX 插件提供了可视化的操作界面,可以通过简单的操作就能生成相应的代码模板,支持根据数据库表结构生成代码,自定义生成策略,以及生成代码后自动格式化等功能。同时,MyBatisX 也支持集成到主流的开发工具中,如 IntelliJ IDEA、Eclipse 等,方便开发人员直接在开发环境中使用。

        按住任意的一个“小鸟”,就可以快速跳到对应的 XML 映射文件中的标签。反过来也是没有问题的。

        3.0 动态 SQL

        在 MyBatis 中根据不同条件动态生成 SQL 语句的技术。通过使用动态 SQL,可以根据不同的情况生成不同的 SQL 语句,以满足各种查询条件下的需求,从而提高 SQL 语句的灵活性和可重用性。

        3.1 动态 SQL - if 标签

        动态 SQL 中的 if 标签用于在运行时根据条件决定是否执行特定的 SQL 语句。可以根据不同的条件执行不同的 SQL 语句,从而实现动态控制 SQL 语句的执行逻辑。

        <if test= "..."> 标签中的属性 test ,如果 test 为 true ,那么该 SQL 语句就能拼接起来;反则不成立。

        <where>:where 元素只会在子元素内容的情况下才插入 where 子句。而且会自动去除子句的开头 AND 或 OR。

        动态 SQL 中的 if 标签经常与 <where> 标签一起使用。

 代码演示:

    <select id="select2" resultType="org.example.Project.Student">
        select * from Student
        <where>

            <if test="id != null">
                id = #{id}
            </if>

            <if test="name != null">
                and name = #{name}
            </if>

            <if test="gender != null">
                and gender = #{gender}
            </if>

        </where>
    </select>
    //根据条件查询
    @Test
    public void testSelect2(){
        //根据任意条件来查询,比如说根据id和姓名来查询
        Student student = new Student();
        student.setId(5);
        student.setName("小童");
        mapper.select2(student);

    }

        3.2 动态 SQL - foreach 标签

        动态 SQL 中的 foreach 标签用来迭代集合中的元素,并把每个元素作为参数传入 SQL 语句中,实现对集合中所有元素进行相同操作的功能。

属性:

        1)collection属性:指定了要迭代的集合。

        2)item属性:指定了每次迭代的元素名。

        3)separator属性:表示每个元素之间的分隔符。

        4)open属性:表示在集合元素开始之前插入的内容。

        5)close属性:表示在集合元素结束之后插入的内容。

代码演示:

接口代码:

    //范围范围查询
    public List<Student> select3(List<Integer> list);

XML 映射文件:

    <select id="select3" resultType="org.example.Project.Student">
        select * from Student where id in
            <foreach collection="list" item="l" separator="," open="(" close=")">
                #{l}
            </foreach>
    </select>

测试代码:

    //范围查询
    @Test
    public void testSelect3(){

        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<Student> students = mapper.select3(list);
        System.out.println(students);
    }

运行结果:

        3.3 动态 SQL - sql 标签与 include 标签

        1)sql 标签:sql 标签用于定义可重用的 SQL 代码片段,可以在任何地方引用这段 SQL 代码。在 sql 标签中定义的 SQL 语句可以包含变量和条件,使得生成的 SQL 查询语句更加灵活和动态。通过 id 属性用来标识当前的 sql 语句。

        2)include 标签:include 标签用于引用 sql 标签中定义的 SQL 代码片段,并插入到当前 SQL 查询语句中。通过 include 标签,我们可以重用之前定义好的SQL代码,简化查询语句的编写。通过 refid 属性来映射 sql 语句。

代码演示:

未使用 sql 标签与 include 标签之前:

    <select id="select" resultType="org.example.Project.Student">
        select * from Student 
        where id = #{id};
    </select>

    <select id="select2" resultType="org.example.Project.Student">
        select * from Student
        <where>

            <if test="id != null">
                id = #{id}
            </if>

            <if test="name != null">
                and name = #{name}
            </if>

            <if test="gender != null">
                and gender = #{gender}
            </if>

        </where>
    </select>

    <select id="select3" resultType="org.example.Project.Student">
        select * from Student 
        where id in
            <foreach collection="list" item="l" separator="," open="(" close=")">
                #{l}
            </foreach>
    </select>

        可以看到有重复出现的 sql 语句:"select * from student",那么就可以使用 sql 与 include 标签来简化代码。

使用 sql 标签与 include 标签后: 

    <sql id="selectPre">
        select * from Student
    </sql>

    <select id="select" resultType="org.example.Project.Student">
        <include refid="selectPre"/>
        where id = #{id};
    </select>

    <select id="select2" resultType="org.example.Project.Student">
        <include refid="selectPre"/>
        <where>

            <if test="id != null">
                id = #{id}
            </if>

            <if test="name != null">
                and name = #{name}
            </if>

            <if test="gender != null">
                and gender = #{gender}
            </if>

        </where>
    </select>

    <select id="select3" resultType="org.example.Project.Student">
        <include refid="selectPre"/>
        where id in
            <foreach collection="list" item="l" separator="," open="(" close=")">
                #{l}
            </foreach>
    </select>

        3.4 动态 SQL - set 标签

        set 标签用于设置查询语句中的动态属性值。通过 set 标签,我们可以动态地设置多个属性值,使得 SQL 查询语句的构建更加灵活和可维护,搭配 if 标签使用。

        简单来说:set 标签用在 update 的 SQL 语句中,动态地在行首插入 set 关键字,并会删掉额外的逗号。

代码演示:

更新之前的结果:

接口代码:

    //根据id动态更新数据
    public void update2(Student student);

xml 文件:

    <update id="update2">
        update Student
        <set>
            <if test="name != null">
                name = #{name},
            </if>

            <if test="gender != null" >
                gender = #{gender},
            </if>

        </set>
        where id = #{id};

    </update>

测试代码:

    //动态更新
    @Test
    public void testUpdate2(){
        Student student = new Student();
        //只更新id=1的学生的名字
        student.setName("小扳手");
        student.setId(1);
        mapper.update2(student);
    }

运行结果:

评论 72
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小扳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值