环境搭建与架构设计

2023-10-07 源码探究Mybatis

访问github源码地址 (opens new window)或使用蓝奏云下载注释版本 (opens new window),包功能如下所示

|-- 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                  # 工具包

# 测试环境搭建

目录结构如下

image-20231007081823883

# 环境测试代码

User
@Data //项目默认没有引入lombok,@Data表示该类含有get set toString方法
public class User implements Serializable {
  // ID标识
  private Integer id;
  // 用户名
  private String name;
}
UserMapper.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 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&amp;characterEncoding=UTF-8&amp;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的执行流程。

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();
    }
}
上次更新: 4 个月前