三、MyBatis架构&源码环境

MyBatis架构原理&主要组件

MyBatis的架构设计

image-20210811110200438.png

mybatis架构四层作用是什么呢?

  • Api接口层:提供API 增加、删除、修改、查询等接口,通过API接口对数据库进行操作。
  • 数据处理层:主要负责SQL的 查询、解析、执行以及结果映射的处理,主要作用解析sql根据调用请求完成一次数据库操作。
  • 框架支撑层:负责通用基础服务支撑,包含事务管理、连接池管理、缓存管理等共用组件的封装,为上层提供基础服务支撑。
  • 引导层:引导层是配置和启动MyBatis配置信息的方式。

MyBatis主要组件及其相互关系

组件关系如下图所示:
组件.jpg

组件介绍:

  • SqlSession:是Mybatis对外暴露的核心API,提供了对数据库的DRUD操作接口。
  • Executor:执行器,由SqlSession调用,负责数据库操作以及Mybatis两级缓存的维护。
  • StatementHandler:封装了JDBC Statement操作,负责对Statement的操作,例如PrepareStatement参数的设置以及结果集的处理。
  • ParameterHandler:是StatementHandler内部一个组件,主要负责对ParameterStatement参数的设置。
  • ResultSetHandler:是StatementHandler内部一个组件,主要负责对ResultSet结果集的处理,封装成目标对象返回。
  • TypeHandler:用于Java类型与JDBC类型之间的数据转换,ParameterHandler和ResultSetHandler会分别使用到它的类型转换功能。
  • MappedStatement:是对Mapper配置文件或Mapper接口方法上通过注解申明SQL的封装。
  • Configuration:Mybatis所有配置都统一由Configuration进行管理,内部由具体对象分别管理各自的小功能模块。

源码环境搭建

源码环境搭建

mybatis源码地址:https://github.com/mybatis/mybatis-3

image.png
image.png

源码导入&编译

image.png

源码介绍.png

编写测试代码

image.png

配置mybatis-config.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://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>

  <!--第二部分:引入映射配置文件-->
  <mappers>
    <mapper resource="com/aiz/mapper/UserMapper.xml"></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.aiz.pojo.User">
    SELECT id,username FROM t_user WHERE id = #{id}
  </select>

</mapper>

编写User类

package com.aiz.pojo;

/**
 * @author ZhangYao
 * @version 1.0
 * @className User
 * @description User
 * @date Create in 23:45 2023/3/27
 */
public class User {
  private Integer id;

  private String username;

  private String password;

  private Integer age;

  private String sex;

  private String email;

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

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public User() {
  }

  @Override
  public String toString() {
    return "User{" +
      "id=" + id +
      ", username='" + username + ''' +
      ", password='" + password + ''' +
      ", age=" + age +
      ", sex='" + sex + ''' +
      ", email='" + email + ''' +
      '}';
  }
}

编写测试类

@Test
public void test1() throws IOException {
    InputStream resourceAsStream = Resources.getResourceAsStream("com" + File.separator + "aiz" + File.separator + "mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    User queryUser = new User();
    queryUser.setId(11);
    User user = sqlSession.selectOne("user.findUserById", queryUser);
    System.out.println(user);
    System.out.println("MyBatis源码环境搭建成功...");
    sqlSession.close();
}

参考资料