深入理解Mybatis工作原理

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 深入理解Mybatis工作原理

基本原理

本文中Mybatis基本原理切入,同时摘录Mybatis的源码,理解Mybatis框架的工作原理。首先看一段JDBC代码:

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/localdb";
Connection con = DriverManager.getConnection(url, "root","password");     
String sql = "SELECT name FROM t_test_employee WHERE id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, "123");
ResultSet rs = ps.executeQuery();
while(rs.next()){
  System.out.println("name=" + rs.getString(1));
}
con.close();

大家应该比较熟悉这段代码,典型的jdbc流程: 建立连接->传递sql->传递参数->sql执行->处理结果->关闭连接。ORM框架的本质是抽取共性、封装逻辑。现在,如果我们来设计一个ORM框架该如何设计?

仔细考虑JDBC流程,可以发现流程中需要用户配置的输入和输出是变化的(如下,括号中部分),而其他部分则是固定不变的逻辑。

建立连接(数据源配置信息)->传递sql(sql语句)->传递参数(sql参数)->sql执行->处理结果(映射关系)->关闭连接

数据源配置信息:配置文件,在启动时从配置文件中读取并建立数据源对象

Sql语句:配置文件(代码),在启动时抽取解析,以<Key,SQL>的形式存储

Sql参数:java bean对象,在执行前从对象中抽取

映射关系:配置文件(代码),根据映射关系读取结果集并创建java bean返回。

不难想象,Mybatis会在启动时”读取配置数据(builder)”,”建立数据源(datasource)”; 然后程序开始执行,传递sql语句的”Key”和java bean; 最后”执行SQL,处理结果(executor)”。 当然,Mybatis也要负责”连接管理(session)”和”事务管理(transaction)”等内容。

源码解析

Mybatis的配置分为两种:基于XML配置和基于注解配置。两者的原理大同小异,在此仅以“基于注解配置”为例解析Mybatis。

启动配置解析

“基于注解配置”一般使用Mybatis-Spring,其工作原理详见深入理解Mybatis-Spring工作原理,可以看到启动后所有Mapper的实现类被设置为了MapperFactoryBean,。MapperFactoryBean是一个工厂类,它通过SqlSession-Configuration-MapperRegistry得到Mapper的代理类MapperProxy,以实例化Mapper属性。

SQL(参数)解析与执行

Mapper执行时调用MapperProxy的invoke方法,MapperProxy创建MapperMethod对象用于执行具体SQL,通过annotation获取得到参数化的sql语句,通过传递的参数获取SQL参数。

public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) {
//解析annotation中的SQL语句
   this.command = new SqlCommand(config, mapperInterface, method);
//处理sql,建立①param数组
   this.method = new MethodSignature(config, method);
 }
  public Object execute(SqlSession sqlSession, Object[] args) {
   Object result;
   if (SqlCommandType.INSERT == command.getType()) { //判断sql类型
  //使用①param数组建立param-Object对应关系
     Object param = method.convertArgsToSqlCommandParam(args);
  //执行sql并处理结果集的映射
     result = rowCountResult(sqlSession.insert(command.getName(), param));
   }
...
//XXXExecutor.java
public int doUpdate(MappedStatement ms, Object parameter) throws SQLException {
   Statement stmt = null;
   try {
     Configuration configuration = ms.getConfiguration();
     StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null);
  //使用TypeHandler处理参数
     stmt = prepareStatement(handler, ms.getStatementLog());
     return handler.update(stmt);
   } finally {
     closeStatement(stmt);
   }
 }

结果集映射

略。

以上即是Mybatis的大致原理,更详细的当然就是RTFC咯。Mybatis的实现很明了,功能相对简单,还有更多的东西可以去扩展,譬如:多数据源、数据库切分、缓存、连接管理等等。

(完)

本文作者 : cyningsun

本文地址https://www.cyningsun.com/10-15-2014/reading-mybatis-source-code.html

版权声明 :本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 CN 许可协议。转载请注明出处!

目录
相关文章
|
7月前
|
SQL XML Java
|
7月前
|
SQL XML Java
一文搞懂Mybatis执行原理
一文搞懂Mybatis执行原理
173 1
|
7月前
|
SQL Java 数据库连接
mybatis常见分页技术和自定义分页原理实战
mybatis常见分页技术和自定义分页原理实战
263 0
|
29天前
|
SQL Java 数据库连接
Mybatis架构原理和机制,图文详解版,超详细!
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。本文详细解析了MyBatis的架构原理与机制,帮助读者全面提升对MyBatis的理解和应用能力。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Mybatis架构原理和机制,图文详解版,超详细!
|
2月前
|
SQL XML Java
Mybatis的原理和MybaitsPlus
这篇文章对比分析了Mybatis和Mybatis Plus的特点与底层实现机制,探讨了两者之间的差异及各自的优势。
85 0
|
5月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List&lt;User&gt; users = userMapper.getAllUsers(); PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(users); 这使得分页查询变得简单且能获取总记录数等信息。
127 2
|
6月前
|
SQL Java 数据库连接
深入探索MyBatis Dynamic SQL:发展、原理与应用
深入探索MyBatis Dynamic SQL:发展、原理与应用
|
5月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
89 0
|
6月前
|
Java 数据库连接 数据库
MyBatis TypeHandler详解:原理与自定义实践
MyBatis TypeHandler详解:原理与自定义实践
|
6月前
|
SQL Java 数据库连接
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践