MyBatis源码解读 | 来啊,手把手,使用MyBatis操作数据库

665 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

本篇文章主要介绍了使用MyBatis框架完成数据库的增、删、改、查操作。

准备工作

为了方便演示,我们需要先来创建一个数据表。我们这里创建的数据表是用户表(t_user)。

运行schema.sql脚本文件中的 SQL 语句创建t_user表。

schema.sql文件中创建表的语句如下:

DROP TABLE IF EXISTS `t_user`;
create table t_user
(
    id          int auto_increment primary key COMMENT '主键',
    username    varchar(64) null COMMENT '用户名',
    nick_name   varchar(64) null COMMENT '昵称',
    password    varchar(64) null COMMENT '密码',
    phone       varchar(32) null COMMENT '手机号',
    create_time varchar(64) null COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';

运行data.sql脚本文件中的 SQL 语句添加测试数据。

data.sql文件中添加测试数据的语句如下:

insert into t_user(`username`, `nick_name`, `password`, `phone`, `create_time`)
values ('user01', 'user01', '123456', '15900001111', '2022-07-14 16:00:00');
insert into t_user(`username`, `nick_name`, `password`, `phone`, `create_time`)
values ('user02', 'user02', '123456', '15900001111', '2022-07-14 16:00:00');
insert into t_user(`username`, `nick_name`, `password`, `phone`, `create_time`)
values ('user03', 'user03', '123456', '15900001111', '2022-07-14 16:00:00');
insert into t_user(`username`, `nick_name`, `password`, `phone`, `create_time`)
values ('user04', 'user04', '123456', '15900001111', '2022-07-14 16:00:00');

接下来,我们需要创建一个Maven项目。笔者这里创建的项目的信息如下:

  • groupId:org.example
  • artifactId:mybatis-demo

然后修改项目的pom.xml文件,添加如下依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>
<!-- Java JSON 类库 -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.7</version>
</dependency>
<!-- 工具类库,引用此类库后,不需要再写getter、setter或equals方法,只要有一个注解 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

Maven依赖说明:

(1)Lombok工具类库

Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等。

—— 引自《百度百科》

使用Lombok工具可以消除大量冗余代码。

(2)Gson

Gson(又称Google Gson)是Google公司发布的一个开放原始码的Java库,主要用途为序列化Java物件为JSON字串,或反序列化JSON字串成Java物件。

—— 引自《维基百科》

使用MyBatis操作数据库

使用MyBatis框架操作数据库步骤:

(1)定义Java实体

MyBatis属于半自动化的ORM框架,能够将数据库中的记录转换为Java实体。我们创建一个Java实体类与数据库中的表相对应。

User.java的代码如下:

@Data
public class User {
    private Integer id;
    private String username;
    private String nickName;
    private String password;
    private String phone;
    private String createTime;
}

(2)定义用于执行SQL的Mapper接口

UserDao.java的代码如下:

public interface UserDao {
    void insert(User user);
    void update(User user);
    User findByUsername(String username);
    void deleteById(Integer id);
}

Mapper接口定义完毕后,需要通过XML或者注解的方式配置SQL语句。

XML映射文件——UserDao.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">
<mapper namespace="com.jasmine.mybatis.demo.dao.UserDao">
    <insert id="insert" parameterType="User">
        insert into t_user(`username`, `nick_name`, `password`, `phone`, `create_time`)
        values(#{username}, #{nickName}, #{password}, #{phone}, #{createTime})
    </insert>
    <update id="update" parameterType="User">
        update t_user
        set 
        	username = #{username}, 
        	nick_name = #{nickName}, 
        	password = #{password}, 
        	phone = #{phone}, 
        	create_time = #{createTime}
        where 
        	id = #{id}
    </update>
    <select id="findByUsername" parameterType="String" resultType="User">
        select 
        	id, username, nick_name as nickName, 
        	password, phone, create_time as createTime
        from 
        	t_user 
        where 
        	username = #{username}
    </select>
    <delete id="deleteById" parameterType="Integer">
        delete from t_user where id = #{id}
    </delete>
</mapper>

namespace属性的值对应相关Mapper接口的完整类名(即含包名)。

(3)编写MyBatis主配置文件

MyBatis使用 XML 文件格式描述配置信息,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="User" type="com.jasmine.mybatis.demo.entity.User" />
    </typeAliases>
    <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="abc123" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/UserDao.xml" />
    </mappers>
</configuration>

<typeAliases>用于注册类型别名。

<environment>标签用于配置环境信息,包括事务管理器、数据源等信息。

<mappers>标签用于指定Mapper文件的位置。

(5)编写测试类

所有的工作准备好后,我们就可以使用MyBatis提供的API执行Mapper中配置的SQL语句了。示例代码如下:

public class Demo {
    public static void main(String[] args) throws IOException {
        // 获取配置文件输入流
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 创建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 获取 SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 获取 Mapper 接口
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        // 新增一个用户
        User newUser = new User();
        newUser.setUsername("new-user");
        newUser.setNickName("新建的用户(修改前)");
        newUser.setPassword("123123");
        newUser.setPhone("13900001111");
        newUser.setCreateTime("2022-07-14 16:00:00");
        userDao.insert(newUser);
        // 根据用户名获取用户信息
        User user = userDao.findByUsername("new-user");
        System.out.println("########## 修改前用户信息 ##########");
        System.out.println(new Gson().toJson(user));
        // 修改用户信息
        user.setUsername("update-user");
        user.setNickName("新建的用户(修改后)");
        userDao.update(user);
        user = userDao.findByUsername("update-user");
        System.out.println("########## 修改后用户信息 ##########");
        System.out.println(new Gson().toJson(user));
        // 删除用户
        userDao.deleteById(user.getId());
    }
}

运行输出结果:

########## 修改前用户信息 ##########
{"id":5,"username":"new-user","nickName":"新建的用户(修改前)","password":"123123","phone":"13900001111","createTime":"2022-07-14 16:00:00"}
########## 修改后用户信息 ##########
{"id":5,"username":"update-user","nickName":"新建的用户(修改后)","password":"123123","phone":"13900001111","createTime":"2022-07-14 16:00:00"}

执行流程简要说明:

我们首先通过Resources.getResourceAsStream(...)方法获取到配置文件输入流,然后把配置文件输入流作为参数,使用SqlSessionFactoryBuilder创建SqlSessionFactory,通过SqlSessionFactory获取到SqlSessionSqlSession是MyBatis中提供的与数据库交互的接口。通过SqlSession我们就能获取到所有我们预先定义的Mapper接口的动态代理对象,最后调用UserMapper代理实例的方法即可完成与数据库的交互。