MyBatis架构原理&主要组件
MyBatis的架构设计
mybatis架构四层作用是什么呢?
- Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作。
- 数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作。
- 框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑。
- 引导层:引导层是配置和启动MyBatis配置信息的方式。
MyBatis主要组件及其相互关系
组件关系如下图所示:
组件介绍:
- SqlSession:是Mybatis对外暴露的核心API,提供了对数据库的DRUD操作接口。
- Executor:执行器,由SqlSession调用,负责数据库操作以及Mybatis两级缓存的维护。
- StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,例如PrepareStatement参数的设置以及结果集的处理。
- ParameterHandler:是StatementHandler内部一个组件,主要负责对ParameterStatement参数的设置。
- ResultSetHandler:是StatementHandler内部一个组件,主要负责对ResultSet结果集的处理,封装成目标对象返回。
- TypeHandler:用于Java类型与JDBC类型之间的数据转换,ParameterHandler和ResultSetHandler会分别使用到它的类型转换功能。
- MappedStatement:是对Mapper配置文件或Mapper接口方法上通过注解申明SQL的封装。
- Configuration:Mybatis所有配置都统一由Configuration进行管理,内部由具体对象分别管理各自的小功能模块。
源码环境搭建
源码环境搭建
mybatis源码地址:https://github.com/mybatis/mybatis-3
源码导入&编译
编写测试代码
配置mybatis-config.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>
<!--第一部分:数据源配置-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<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="root"/>
</dataSource>
</environment>
</environments>
<!--第二部分:引入映射配置文件-->
<mappers>
<mapper resource="com/aiz/mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
配置UserMapper.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="user">
<select id="findUserById" parameterType="int" resultType="com.aiz.pojo.User">
SELECT id,username FROM t_user WHERE id = #{id}
</select>
</mapper>
编写User类
package com.aiz.pojo;
/**
* @author ZhangYao
* @version 1.0
* @className User
* @description User
* @date Create in 23:45 2023/3/27
*/
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String sex;
private String email;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
编写测试类
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("com" + File.separator + "aiz" + File.separator + "mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User queryUser = new User();
queryUser.setId(11);
User user = sqlSession.selectOne("user.findUserById", queryUser);
System.out.println(user);
System.out.println("MyBatis源码环境搭建成功...");
sqlSession.close();
}