Mybatis源码系列文章
Mybatis源码解析(四):sql语句及#{}、${}的解析
Mybatis源码解析(五):SqlSession会话的创建
一、MyBatis架构原理&主要组件
MyBatis架构设计
mybatis架构四层作用:
- Api接口层:提供API增加、删除、修改、查询等接口,通过API接口对数据库进行操作。
- 数据处理层:主要负责sql的查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作
- 框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑
- 引导层:引导层是配置和启动MyBatis配置信息的方法
MyBatis主要组件及其相互关系
组件介绍:
- SqlSession:是Mybatis对外暴露的核心API,提供的对数据库的CRUD接口操作
- Executor:执行器,由SqlSession调用,负责数据库操作以及Mybatis两级缓存的维护
- StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,如PrepareStatement参数的设置以及结果集的处理
- PararmeterHandler:是StatementHandler内部一个组件,主要负责对ParameterStatement参数的设置
- ResultSetHandler:是StatementHandler内部一个组件,主要负责对ResultSet结果集的处理,封装成目标对象返回
- TypeHandler:用于Java类型与JDBC类型之间的数据转换,ParameterHandler和ResultSetHandler会分别使用到它的类型转换功能
- MappedStatement:是对Mapper配置文件或Mapper接口方法上通过注解申明sql的封装
- Configuration:Mybatis所有配置都统一由Configuration进行管理,内部由具体对象分别管理各自的小功能模块
二、源码环境搭建
1、源码地址及介绍
-
mybatis源码地址(有注释): https://gitee.com/xuchang614/mybatis-3.5.7
-
源码目录介绍
2、编写测试代码
核心配置文件sqlMapConfig.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:///mybatis" />
<property name="username" value="root" />
<property name="password" value="123456789" />
</dataSource>
</environment>
</environments>
<!--第二部分:引入映射配置文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
<!--<mapper class="mapper.UserMapper"></mapper>-->
<!--<package name="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.xc.pojo.User" >
SELECT id,username FROM user WHERE id = #{id}
</select>
</mapper>
User类
@Data
public class User{
// ID标识
private Integer id;
// 用户名
private String username;
}
测试类:传统方式,非mapper代理
@Test
public void test1() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = sqlSession.selectOne("user.findUserById", 100);
System.out.println(user);
System.out.println("MyBatis源码环境搭建成功....");
sqlSession.close();
}
输出结果:
DEBUG [main] - ==> Preparing: SELECT id,username FROM user WHERE id = ?
DEBUG [main] - ==> Parameters: 100(Integer)
DEBUG [main] - <== Total: 1
User(id=100, username=zhangsan)
MyBatis源码环境搭建成功....
进程已结束,退出代码0