Appearance
访问github源码地址或使用蓝奏云下载注释版本,包功能如下所示
sql
|-- org.apache.ibatis(v3.5.6)
|-- annotations # Mapper映射器接口中用到的注解
|-- binding # 映射器接口与映射语句关系绑定构建
|-- builder # Configuration配置的构建包
|-- cache # 缓存的实现与定义(含一级/二级缓存)
|-- cursor # 游标(针对查询结果集的获取与遍历等)
|-- datasource # 数据源/连接池
|-- exceptions # 异常包
|-- executor # 语句执行器(含参数/结果集/语句处理等)
|-- io # 资源读取辅助包
|-- jdbc # 内部SQL脚本运行的测试包
|-- logging # 一套日志接口和适配器包
|-- mapping # Mapper映射器相关参数/语句/结果/类型等对象包
|-- parsing # XML解析包(例如#{}占位符的解析)
|-- plugin # 插件包
|-- reflection # 反射工具包
|-- scripting # SQL执行脚本的解析处理包
|-- session # 数据库连接会话核心包(会话创建/管理/调用)
|-- transaction # 事务
|-- type # 类型处理器(定义bean与数据库类型的转换关系)
|-- util # 工具包
测试环境搭建
目录结构如下
环境测试代码
User
java
@Data //项目默认没有引入lombok,@Data表示该类含有get set toString方法
public class User implements Serializable {
// ID标识
private Integer id;
// 用户名
private String name;
}
UserMapper.xml
xml
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="com.itheima.pojo.User">
SELECT id,username FROM user WHERE id = #{id}
</select>
</mapper>
sqlMapConfig.xml
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:///zdy_mybatis?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!--第二部分:引入映射配置文件-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
编写测试代码
首先是传统方式的测试,手动调用mybatis提供的API进行测试,方便查看源代码及整个mybatis的执行流程。
java
public class MybatisTest {
@Test
public void test1() throws IOException {
// 1. 通过类加载器对配置文件进行加载,加载成了字节输入流,存到内存中 注意:配置文件并没有被解析
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 2. (1)解析了配置文件,封装configuration对象 (2)创建了DefaultSqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 3.问题:openSession()执行逻辑是什么?
// 3. (1)创建事务对象 (2)创建了执行器对象cachingExecutor (3)创建了DefaultSqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4. 委派给Executor来执行,Executor执行时又会调用很多其他组件(参数设置、解析sql的获取,sql的执行、结果集的封装)
User user = sqlSession.selectOne("com.itheima.mapper.UserMapper.findByCondition", 1);
System.out.println(user);
System.out.println("MyBatis源码环境搭建成功....");
sqlSession.close();
}
}