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版本:
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实体类数据