🚀 MyBatis快速入门
0️⃣ 入门准备
为了入门学习ORM框架MyBatis
,首先我们可以准备一个mybatis
数据库。初始化该数据库的sql
脚本如下。需要注意的是,本示例使用的数据库软件为 MySQL 8.3.0
。
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
中增加以下依赖。其中,lombok
和hutool-all
都是提高编码效率的工具库,junit
为一个Java的单元测试库,mysql-connector-java
为MySQL官方提供的JDBC驱动程序。
<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 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>
标签引入外部属性。具体来说,可以分成以下两个步骤。
在resouces目录下创建
properties/jdbc.properties
文件,并定义驱动类全限定路径、数据库地址、用户名及密码。propertiesjdbc.driverClass=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis jdbc.username=root jdbc.password=991229
在
mybatis-config.xml
文件中使用<properties>
标签引入刚创建的jdbc.properties
文件中的属性,按${key}
格式配置属性值,key
为属性键。
<?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层面的一个实体对象。在本次示例中,我们需要创建一个实体类User
与fg_user
表中的数据记录对应,代码如下。其中,@Data
与@Accessors
都是Lombok库提供的注解,用于简化实体类样板代码的书写。需要注意的是,User
实体类中的属性名称必须与数据库表fg_user
中定义的字段名称保持一致。
@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'
的用户。
public interface UserMapper {
User best();
}
4️⃣ 创建XML映射文件
在MyBatis中,我们通常会创建一个与Mapper接口相映射的XML文件,其中可以灵活编写SQL语句,并赋予对应的Mapper接口代理对象操作数据库的能力。
一般情况下,我们倾向于将XML映射文件的名称与Mapper接口的名称保持一致。比如,在本次示例中,由于Mapper接口文件的名称为UserMapper.java
,那么对应的XML映射文件的命名应该是UserMapper.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
中。
5️⃣ 创建测试类
每个MyBatis应用都以一个SqlSessionFactory
实例为核心的。SqlSessionFactory
是一个会话工厂,其可以生产一个个执行SQL操作的会话对象,即SqlSession
实例。会话工厂SqlSessionFactory
可以由SqlSessionFactoryBuilder
实例,根据一个Configuartion
实例来构建。Configuation
实例可以解析XML配置文件生成,也可以直接在Java层面预构建一个Configuation
配置类的对象。
本次示例选择通过解析XML配置文件来生成Configuation
实例,该文件已在前步骤中创建。同时,这也是最常见、方便的选项。
有了SqlSession
实例,我们就可以获得Mapper接口的代理对象来进行数据库交互了。
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的日志信息。