MyBatis的架构设计
- Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作
- 例如下面这些操作
sqlSession.selectOne(statementId, param);
mapperProxy.findByCondition(param);
- 数据处理层:解析sql根据调用请求完成一次数据库操
- 框架支撑层:负责通用基础服务支撑
- 例如事务管理、连接池管理、缓存管理等共用组件的封装
- 引导层:引导层是配置和启动 MyBatis 配置信息的方式
- 例如提供 XML、或者 Java API 的配置方式
MyBatis主要组件及其相互关系
- SqlSession:是 Mybatis 对外暴露的核心 API,提供了对数据库的 CRUD 操作接口
- 例如
sqlSession.selectOne(statementId, param);
- Executor:负责数据库操作以及 Mybatis 两级缓存的维护
- StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,例如 PrepareStatement 参数的设置以及结果集的处理
- 例如下面代码,其中 sql 是从 BoundSql 中获取过来的
connection.prepareStatement(sql)
- ParameterHandler:内部组件,负责对 ParameterStatement 参数的设置
- ResultSetHandler:内部组件,负责对 ResultSet 结果集的处理,封装成目标对象返回
- TypeHandler:用于 Java 类型与 JDBC 类型之间的数据转换
- MappedStatement:是对 Mapper 配置文件或 Mapper 接口方法上通过注解申明 SQL 的封装
- Configuration:Mybatis 所有配置都统一由 Configuration 进行管理,内部由具体对象分别管理各自的小功能模块
源码环境搭建
- 下载源码(用的是 3.5.7)
- https://github.com/mybatis/mybatis-3
- 源码目录说明
- mysql 导入表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 初步搭建
- 创建 sqlMapConfig.xml
<!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://127.0.0.1:3306/mb_mybatis"/>
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--第二部分:引入映射配置文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
- 创建 UserMapper.xml
<!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.itheima.pojo.User">
SELECT id, name FROM user WHERE id = #{id}
</select>
</mapper>
- 创建 User
@Data
public class User {
// ID标识
private Long id;
// 用户名
private String name;
}
- 创建测试类,然后运行成功即可
public class MybatisTest {
@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", 1);
System.out.println(user);
System.out.println("MyBatis源码环境搭建成功...");
sqlSession.close();
}
}