18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建

发布于:2025-04-17 ⋅ 阅读:(39) ⋅ 点赞:(0)

学习视频资料来源:https://www.bilibili.com/video/BV1R14y1W7yS

1. 架构设计

在这里插入图片描述

Mybatis整体架构分为4层:

  1. 接口层:提供增删改查的接口,通过调用这些接口可以完成与数据库的交互。调用的方式有两种:基于statementId和基于mapper接口。
  2. 数据处理:是Mybatis框架的核心层,负责解析SQL,根据调用请求完成一次数据库交互。
  3. 框架支撑层:负责通用基础服务支撑。SQL语句配置方式:基于xml配置和基于注解配置。对于一些简单的SQL,使用注解的方式比较方便。但对于一些复杂的SQL,比如SQL的动态拼接等,使用注解的方式是非常繁琐的,所以推荐使用xml配置更加方便和维护。
  4. 引导层:mybatis启动需要的配置信息。包括:基于xml配置方式和基于Java API方式。

2. 核心组件及调用关系

在这里插入图片描述
从上往下各组件介绍:

  1. SqlSession:Mybatis对外暴力的核心API,一些增删改查接口,如selectOne、selectList、insert、delete、update。
  2. Excutor: 负责数据库操作及两级缓存的维护。SqlSession并不直接调用JDBC,而是委派给Excutor去执行的。
  3. StatementHandler:语句执行器。负责封装JDBC操作:参数设置,结果集合封装。
  4. ParameterHandler:参数处理器。实际上把参数处理的过程,委托给TypeHandler
  5. TypeHandler:类型转换类似,将参数从Java类型转换为jdbc类型,将结果集从jdbc类型转换为java类型。
  6. ResultSet:结果集
  7. ResultHandler:结果集处理器。实际上把参数处理的过程,委托给TypeHandler。

3. 源码环境搭建

这个就比较简单了。到mybatis官网https://mybatis.p2hp.com/,找到仓库地址https://github.com/mybatis/mybatis-3/releases/tag/mybatis-3.5.7,下载源码。我这里用的版本和视频中的一样3.5.7。
打开项目新建核心配置文件、映射配置文件、实体类、测试类。目录如下:
在这里插入图片描述

3.1 测试类

public class MybatisTest {

  @Test
  public void test1() throws IOException {
    System.setProperty("javax.xml.accessExternalDTD", "all");
    InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");

    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream,"development");
    SqlSession sqlSession = build.openSession();
    User user = new User();
    user.setId(1);
    user.setUsername("xiaoming");
    Object o = sqlSession.selectOne("com.mqlyes.dao.UserDao.findByCondition", user);
    System.out.println(o);
  }
}

3.2 实体类

public class User {
    private Integer id;
    private String username;

  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;
  }

  @Override
  public String toString() {
    return "User{" +
      "id=" + id +
      ", username='" + username + '\'' +
      '}';
  }
}

3.3 核心配置文件

注意替换数据库地址和密码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!-- 数据源配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.x.x:3306/test?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="xxxx"/>
                <property name="password" value="xxxx"/>
            </dataSource>
        </environment>
    </environments>

    <!-- Mapper 配置 -->
    <mappers>
        <mapper resources="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

3.4 映射配置文件

<?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="com.mqlyes.dao.UserDao">

    <!--    唯一标识: namespace.id-->
    <!-- 查询所有用户 -->
    <select id="findAll" resultType="com.mqlyes.pojo.User">
        select * from user
    </select>

    <!-- 按条件查询用户 -->
    <!--    -->
    <select id="findByCondition" resultType="com.mqlyes.pojo.User" parameterType="com.mqlyes.pojo.User">
        select * from user where id = #{id} and username = #{username}
    </select>
</mapper>

3.5 遇到的问题

错误1:如果下面的报错,就在测试类中添加代码

 System.setProperty("javax.xml.accessExternalDTD", "all"); 

在这里插入图片描述
这个错误我在网上试了一个方案,不生效。用代码指定的方式可以。
错误2. 如果报配置文件找不到,就检查build后自己的target目录下,是否包含配置文件。可以试试把pom文件中resource和testResource相关的注释掉,用默认的方式。我这里注释掉就可以了。这个错误是由于没把配置文件编译进target导致的。
在这里插入图片描述
等到后边我把自己的源码传上去~