Skip to content

🚀 MyBatis快速入门

0️⃣ 入门准备

​ 为了入门学习ORM框架MyBatis,首先我们可以准备一个mybatis数据库。初始化该数据库的sql脚本如下。需要注意的是,本示例使用的数据库软件为 MySQL 8.3.0

sql
drop database if exists mybatis;
create database if not exists mybatis;
use mybatis;
drop table if exists `fg_user`;
create table if not exists `fg_user`
(
    `id`       bigint primary key auto_increment comment '主键',
    `username` varchar(25) unique comment '用户名',
    `age`      int comment '年龄',
    `email`    varchar(50) comment '邮箱'
);
insert into `fg_user`(id, username, age, email)
values (100, 'fatgod', 18, 'fatgod888@163.com'),
       (200, 'fatbaby', 15, 'fatbaby135@163.com'),
       (300, 'fatdemon', 50, 'fatdemon555@163.com'),
       (400, 'shelby', 30, 'shelby1234@163.com');

​ 在初始化数据库后,我们需要创建一个maven项目,并在pom.xml中增加以下依赖。其中,lombokhutool-all都是提高编码效率的工具库,junit为一个Java的单元测试库,mysql-connector-java为MySQL官方提供的JDBC驱动程序。

xml
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.9</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.29</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.26</version>
    </dependency>
</dependencies>

1️⃣ 创建MyBatis核心配置文件

​ 在maven项目的resources目录下创建MyBatis应用的核心配置文件,通常命名为mybatis-config.xml,以下为该配置文件的一般结构与常用配置项。

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--xml文件的dtd约束-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 设置项 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="991229"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入xml映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

​ 为了提高应用的灵活性,我们可以将mybatis-config.xml中敏感的数据库连接信息抽取到外部的properties文件中,并使用<properties>标签引入外部属性。具体来说,可以分成以下两个步骤。

  1. 在resouces目录下创建properties/jdbc.properties文件,并定义驱动类全限定路径、数据库地址、用户名及密码。

    properties
    jdbc.driverClass=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/mybatis
    jdbc.username=root
    jdbc.password=991229
  2. mybatis-config.xml文件中使用<properties>标签引入刚创建的jdbc.properties文件中的属性,按${key}格式配置属性值,key为属性键。

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--xml文件的dtd约束-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--引入外部属性-->
    <properties resource="properties/jdbc.properties"/>
    <!-- 设置项 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClass}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入xml映射文件-->
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>

2️⃣ 创建实体类

​ 在MyBatis中,数据库表的一条数据记录通常会被映射为Java层面的一个实体对象。在本次示例中,我们需要创建一个实体类Userfg_user表中的数据记录对应,代码如下。其中,@Data@Accessors都是Lombok库提供的注解,用于简化实体类样板代码的书写。需要注意的是,User实体类中的属性名称必须与数据库表fg_user中定义的字段名称保持一致。

java
@Data
@Accessors(chain = true)
public class User {
    /**
     * 主键
     */
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 邮箱
     */
    private String email;
}

3️⃣ 创建Mapper接口

​ MyBatis中的Mapper接口位于三层架构中的数据访问层(DAO层),负责定义数据库操作的接口方法,并与数据库进行交互。Mapper接口不需要实现,这是因为MyBatis框架内部使用了JDK中的动态代理技术,Mapper接口代理对象能够通过映射XML配置文件或注解,将接口方法与具体的SQL语句进行绑定,实现数据访问逻辑的抽象和封装。

​ 在本次示例中,我们需要创建一个UserMapper接口来访问操作fg_user表,代码如下。其中,best方法需要查询出用户名为'fatgod'的用户。

java
public interface UserMapper {
    User best();
}

4️⃣ 创建XML映射文件

​ 在MyBatis中,我们通常会创建一个与Mapper接口相映射的XML文件,其中可以灵活编写SQL语句,并赋予对应的Mapper接口代理对象操作数据库的能力。

​ 一般情况下,我们倾向于将XML映射文件的名称与Mapper接口的名称保持一致。比如,在本次示例中,由于Mapper接口文件的名称为UserMapper.java,那么对应的XML映射文件的命名应该是UserMapper.xml

xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--xml文件的dtd约束-->
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.fatgod.learn.mybatis.mapper.UserMapper">
    <select id="best" resultType="cn.fatgod.learn.mybatis.entity.User">
        select *
        from fg_user
        where username = 'fatgod';
    </select>
</mapper>

<mapper>标签是该XML文件的根标签,命名空间namespace的值为对应Mapper接口类的全限定名。<select>标签用于编写查询语句,其id属性与Mapper接口中的某个特定方法相对应,值为该方法的名称。类似地,<select>标签的resultType属性与特定方法的返回值类型相对应,值为返回类的全限定名。

​ 需要注意的是,在创建XML映射文件后,我们需要将其注册在MyBatis的核心配置文件mybatis-config.xml中。

引入xml映射文件

5️⃣ 创建测试类

​ 每个MyBatis应用都以一个SqlSessionFactory实例为核心的。SqlSessionFactory是一个会话工厂,其可以生产一个个执行SQL操作的会话对象,即SqlSession实例。会话工厂SqlSessionFactory可以由SqlSessionFactoryBuilder实例,根据一个Configuartion实例来构建。Configuation实例可以解析XML配置文件生成,也可以直接在Java层面预构建一个Configuation配置类的对象。

重要对象关系

​ 本次示例选择通过解析XML配置文件来生成Configuation实例,该文件已在前步骤中创建。同时,这也是最常见、方便的选项。

​ 有了SqlSession实例,我们就可以获得Mapper接口的代理对象来进行数据库交互了。

java
public class MybatisTest {
    @Test
    public void test() {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(ResourceUtil.getStream("mybatis-config.xml"));
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User best = userMapper.best();
            System.out.println(best);
        }
    }
}

​ 最后,成功在控制台输出一个User实例的表示字符串,其它信息为MyBatis的日志信息。

成功输出

上次更新于: