Mybatis源码分析(1)

IDEA2024

本人刚工作,被IDEA的新UI深深吸引,下载好IDEA2024后选择设置,勾选new UI,重启IDEA可以使用新的UI
在这里插入图片描述

目标

希望系统学习JAVA常用框架源码,第一个经典易懂的框架应该是Mybatis了,本文的主要目标是根据官网手把手搭建Mybatis源码环境,学习Mybatis框架的主要流程。

1.搭建环境

Mybatis源码官网:https://github.com/mybatis/mybatis-3/releases?page=1
Mybatis参考文档官网:https://mybatis.org/mybatis-3/zh_CN/configuration.html

在github搜索mybatis,选择mybatis/mybatis-3

在这里插入图片描述

选择releases,选择版本3.5.16

在这里插入图片描述

点击source进行下载

在这里插入图片描述

将源码导入idea,然后根据文档的入门可以搭建MybatisDemo

在这里插入图片描述

1.1 在pom.xml文件添加依赖:

<dependencies>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.27</version>
      </dependency>
</dependencies>

其中,mysql依赖不引入的话会报错,因为mysql驱动在mysql的jar包

在这里插入图片描述
mysql可以填写自己的版本,通过mysql -u 用户名 -p,然后输入密码进入命令行,执行select version(); 可以查找安装的mysql版本:

Alt
1.2 编写下列文件

在这里插入图片描述

1.2.1 编写mybatis-config.xml文件

先按照官方文档在类路径下编写mybatis-config.xml文件,指定JDBC事务管理器,指定数据源,配置driver, url, username, password,配置mappers,指定映射器mapper的resource是类路径下xml文件的位置,即mybatis/BlogMapper.xml,当然也可以指定package,这个在官网文档的XML配置菜单中都有详细说明
mybatis-config.xml:

<?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://ip:port/数据库?useUnicode=true"/>
                <property name="username" value="用户名"/>
                <property name="password" value="密码"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis/BlogMapper.xml"/>
    </mappers>
</configuration>

1.2.2 编写BlogMapper接口、BlogMapper.xml文件和数据库表对应的实体类

@Mapper
public interface BlogMapper {
    Blog selectBlog(@Param("author") String author);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.mybatisDemo.BlogMapper">
    <select id="selectBlog" resultType="org.apache.mybatisDemo.Blog">
        select * from Blog where author = #{author}
    </select>
</mapper>

然后创建Blog实体类

public class Blog {
    private String name;
    private String author;
    private Date createTime;

    public Blog(String name, String author, Date createTime) {
        this.name = name;
        this.author = author;
        this.createTime = createTime;
    }

    public Blog() {
    }

    @Override
    public String toString() {
        return "Blog{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

1.2.3 编写主启动类

public class MybatisDemo {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        try (SqlSession session = sqlSessionFactory.openSession()) {
            BlogMapper mapper = session.getMapper(BlogMapper.class);
            Blog blog = mapper.selectBlog("lisi");
            System.out.println(blog);
        }
    }
}

Resources.getResourceAsStream方法会查找classpath类路径下的文件,通过SqlSessionFactoryBuilder的build方法创建SqlSessionFactory,通过sqlSessionFactory的openSession方法得到SqlSession,通过SqlSession的getMapper方法得到JDK动态代理对象,用接口来接收代理对象,调用代理对象的selectBlog方法,可以从数据库查询数据

1.3 结果

在这里插入图片描述
至此,Mybatis环境搭建成功!!!

2、Mybatis源码主要流程

2.1 Mybatis执行的总体流程

在这里插入图片描述

2.2 SqlSessionFactory对象

SqlSessionFactoryBuilder经过build方法得到SqlSessionFactory对象,此时这个对象包含的configuration对象已经包含sql,表名已经完成了xml文件的解析得到mapper接口和mapper.xml文件的位置,并且完成mapper接口和mapper.xml文件的映射,并保存在mappedStatements中

在这里插入图片描述

SqlSessionFactory对象包含的configuration对象有mapperRegistry对象,它包含了一个map,这个map保存了接口方法,后面可以根据接口生成JDK动态代理对象

在这里插入图片描述

SqlSessionFactory对象包含的configuration对象有typeAliasRegistry对象,它表明了xml文件方法的入参和出参类型可以简写的形式

在这里插入图片描述
在这里插入图片描述

2.3 SqlSession对象

SqlSession对象生成一个Executor执行器,一般生层的是SimpleExecutor,只不过用CachingExecutor包装了一下
在这里插入图片描述

通过SqlSession对象的getMapper方法可以得到基于接口的JDK动态代理对象

在这里插入图片描述
通过JDK动态代理对象的selectBlog方法,可以查询数据库得到Blog实体类数据

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值