本文总结最原始Mybatis框架的搭建和最基本使用(不涉及Spring框架体系)。
1 依赖
首先,我们要引入Mybatis依赖:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
Java操作数据库需要引入对应的数据库驱动依赖。本文使用MySQL数据库作为示例,引入如下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
2 项目结构
在使用Mybatis之前,我们先约定好项目结构,主要有两种方式。
第一种,Mybatis的映射接口和映射文件分开存放:
├── java
│ ├── org.example
│ │ ├── Main.java # 启动类
│ │ ├── entity # 存放数据库实体
│ │ ├── mapper # 存放Mybatis的映射接口
│ │ └── ... # 其他业务代码
├── resources
│ ├── org.example.mapper 存放Mybatis的映射文件
│ └── ...
第二种,Mybatis映射接口和映射文件一起存放:
├── java
│ ├── org.example
│ │ ├── Main.java # 启动类
│ │ ├── entity # 存放数据库实体
│ │ ├── mapper # 存放Mybatis的映射接口和映射文件
│ │ └── ... # 其他业务代码
├── resources
│ └── ...
对于第二种方式,由于Maven build项目时默认忽略java目录下的xml文件,因此需要在pom.xml中添加如下配置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
需要注意的是,无论是上述哪种方式,Mybatis的映射接口和映射文件必须存放在同一个包名下。
3 数据准备
为了更好的代码演示,我们需要先创建一些数据库演示数据。
创建数据库:
create database demo;
创建表:
CREATE TABLE `tb_blog` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`author` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
4 基本使用
4.1 数据库实体
我们需要根据数据库表结构,定义对应的Java类。
org.example.entity.Blog(省略setter、getter和toString方法):
public class Blog {
private int id;
private String name;
private String author;
}
4.2 映射接口
根据业务,我们需要定义数据库操作的对应方法。
org.example.mapper.BlogMapper:
public interface BlogMapper {
int createBlog(Blog blog);
int deleteBlog(@Param("id") Integer id);
int updateBlog(Blog blog);
Blog selectBlog(@Param("id") Integer id);
}
4.3 映射文件
根据映射接口,编写对应的映射文件。
org/example/mapper/BlogMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mapper.BlogMapper">
<insert id="createBlog">
insert into tb_blog (name, author) value (#{name}, #{author})
</insert>
<delete id="deleteBlog">
delete from tb_blog where id =#{id}
</delete>
<update id="updateBlog">
update tb_blog set name = #{name}, author = #{author} where id =#{id}
</update>
<select id="selectBlog" resultType="org.example.entity.Blog">
select * from tb_blog where id = #{id}
</select>
</mapper>
4.4 使用Mybatis
使用Myatis主要有4个步骤:
- 创建Configuration
- 添加mapper
- 创建SqlSessionFactory
- 操作数据库
4.4.1 创建Configuration
我们使用Configuration的构造函数进行创建,需要注入environment对象:
Configuration configuration = new Configuration(environment);
environment对象表示数据库环境,它主要依赖数据源DataSource和事务工厂TransactionFactory,并且还需要为它设置一个id(用于区分不同的数据库环境):
Environment environment = new Environment("development", transactionFactory, dataSource);
DataSource和TransactionFactory都只是接口,我们可以根据业务场景选择不同的实现类。
例如,TransactionFactory实现类我们可以使用Mybatis自带的JdbcTransactionFactory:
TransactionFactory transactionFactory = new JdbcTransactionFactory();
由于我们选用的是MySQL数据库,数据源可以直接选用MySQL数据库驱动自带的MysqlDataSource,并设置数据源基本参数(url、username和password等):
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf-8&createDatabaseIfNotExist=true&serverTimezone=Asia%2FShanghai");
dataSource.setUser("root");
dataSource.setPassword("root");
因此,整体创建Configuration的代码如下:
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf-8&createDatabaseIfNotExist=true&serverTimezone=Asia%2FShanghai");
dataSource.setUser("root");
dataSource.setPassword("root");
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
4.4.2 添加mapper
接下来,需要将映射接口和映射文件添加到Configuration对象中。
Configuration提供了三个方法:
// 将指定包路径下的所有Object子类作为映射接口,并加载对应映射文件
configuration.addMappers("packageName");
// 将指定包路径下的所有supperType的子类作为映射接口,并加载对应映射文件
configuration.addMappers("packageName", supperType);
// 将指定type类作为映射接口,并加载对应映射文件
configuration.addMapper(type);
本质上来说,这三种方法添加mapper的业务逻辑没有本质上区别,步骤如下:
- 扫描指定包下的.class文件
- 过滤出指定superType的子类
- 根据全限定类名查找.xml文件
- 解析XML节点,将映射信息保存到Configuration对象
为了方便,我们通常会直接扫描mapper包路径:
configuration.addMappers("org.example.mapper");
4.4.3 创建SqlSessionFactory
通过上述两个步骤,完成了Mybatis配置和映射信息的读取和保存。
为了方便从Configuration创建操作数据库的会话,Mybatis提供了SqlSessionFactory。它的创建方式也很简单:
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
4.4.4 操作数据库
操作数据库的第一步是要创建SqlSession(会话),由于SqlSession是数据库连接资源,使用完之后要及时关闭,避免资源泄露。因此,通常会使用如下方式:
try (SqlSession session = sqlSessionFactory.openSession(true)) {
// 操作数据库
}
操作数据库实际上就是执行我们编写好的SQL,主要有两种方式。
第一种方式是,根据id执行对应的SQL:
Blog blog = session.selectOne("org.example.mapper.BlogMapper.selectBlog", 1);
第二种方式是,获取映射接口,使用映射接口对应的方法执行对应的SQL:
BlogMapper blogMapper = session.getMapper(BlogMapper.class);
Blog blog = blogMapper.selectBlog(1);
5 总结
以上就是Mybatis框架的最基本使用了。
在实际项目开发中,我们只需要一次搭建Mybatis的启动流程,后续基本都是在跟映射接口和映射文件打交道:
- 创建数据库实体
- 创建映射接口
- 创建映射文件
其中,最核心的工作在于如何编写映射文件,可以查看官方文档: