前言
前面我们完成了 Mybatis 的基本代码编写,增删改查,具体配置详解以及日志的使用,但我们并没有对 Myabtis 的底层实现有一个具体的认识,这里我将对 Mybatis 基于我个人的了解进行一个简单的总结。
Mybatis
MyBatis 是一个开源的持久层框架,它可以将 Java 对象映射到关系型数据库中的SQL语句。MyBatis 的设计思想是将 SQL 语句和程序代码分开,通过 XML 文件或注解的方式描述 SQL 语句,然后由 MyBatis 框架自动将其转换为对应的 Java 对象。
底层执行流程
首先,我们将曾经完成的具体代码附在这里,以便我们对照来学习:Mybayis 基本实现以及环境搭载
这里给出 Mybatis 的底层执行流程,下面再做具体赘述:
最初,我们为了方便,编写了 MybatisUtils
工具类,来将固定的代码放在其中:
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
}
-
第6-7行,可以看到这里创建一个InputStream对象,将我们的全局配置文件通过 resource 加载为文件输入流;
-
第8行,实例化了 SqlSessionFactoryBuilder() 构造器,在这里我们可以查看源码,发现在实例化 SqlSessionFactory 之前还做了其他事情:
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
}
}
//build()的时候传递了一个 Configuration,然后通过 XMLConfigBuilder 解析这个对象
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
这里我们可以看到,SqlSessionFactoryBuilder()
类中通过 build()
来对我们的 InputStream流进行解析(如果 xml 配置文件出现问题,就会在这里报错),这里还通过 XMLConfigBuilder()
创建一个对象 parser ,将这个对象放在我们的 Configuration 配置中。
我们通过 debug 可以发现,DefaultSqlSession 也是这个时候创建的(DefaultSqlSession 实现了 SqlSession 接口的所有方法,包括对数据库的增删改查、事务管理等功能),build()
之后才实例化了SqlSessionFactory。
实例化了 SqlSessionFactory 的同时也产生了 transactional 事务管理和 executor 执行器:
-
创建 sqlSession ,实现增删改查,然后回滚,检查是否成功,然后接着回滚。
-
sqlSession 中的 executor 执行器,执行 mapper
public void getUserByIdTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user1 = mapper.getUserById(1);
System.out.println(user1);
sqlSession.close();
}
通过 mapper 接口读取配置文件中的 sql 语句,实现增删改查。
- 总结:
MyBatis 的底层实现主要包括以下几个方面:
- Configuration(配置):MyBatis 的配置文件包含了连接数据库的信息、映射文件的位置和一些全局性的属性等。
- SqlSession(会话):SqlSession 是 MyBatis 的一个重要组件,它是应用程序与数据库之间交互的一个会话,可以用来执行 SQL 语句、获取映射器、提交或回滚事务等。
- MappedStatement(映射语句):MappedStatement 是 MyBatis 中用于描述 SQL 语句的一个对象,它包含了 SQL 语句的 ID、参数类型、返回值类型、SQL 语句的类型(增、删、改、查)、SQL 语句字符串等信息。
- Executor(执行器):Executor 是 MyBatis 中的一个重要组件,它负责执行 SQL 语句,与 SqlSession 相关联,可以通过 SqlSession 获取Executor 实例。MyBatis 提供了三种 Executor 实现:SimpleExecutor、ReuseExecutor 和 BatchExecutor。
- StatementHandler(语句处理器):StatementHandler 是 MyBatis 中用于处理 SQL 语句的一个对象,它包含了创建 PreparedStatement 对象、设置参数等操作。
- ParameterHandler(参数处理器):ParameterHandler 是 MyBatis 中用于处理 SQL 语句参数的一个对象,它负责将 Java 对象转换为 JDBC 参数,并设置到 PreparedStatement 对象中。
- ResultSetHandler(结果集处理器):ResultSetHandler 是 MyBatis 中用于处理 SQL 语句查询结果的一个对象,它负责将查询结果集转换为 Java 对象。
MyBatis 的底层实现主要涉及到配置、会话、SQL 语句描述、执行器、语句处理器、参数处理器和结果集处理器等。这些组件相互协作,完成了 MyBatis 的核心功能,即将 Java 对象映射到关系型数据库中。
MyBatis的主要特点
1、灵活性:MyBatis可以通过XML文件或注解的方式描述SQL语句,可以方便地进行定制化配置,满足各种复杂的需求。
2、易于学习:MyBatis的API简洁易懂,可以快速上手。
3、易于扩展:MyBatis的插件机制可以方便地实现自定义功能。
4、SQL优化:MyBatis提供了多种优化查询的手段,例如缓存、分页等。
5、与Spring集成:MyBatis可以与Spring框架无缝集成,可以方便地使用Spring的事务管理等功能。