mybatis工作原理

1. 基本原理

首先看一段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)”等内容。

2. 工作原理

在这里插入图片描述
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);

然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。

详细流程如下:

1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)。
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象。
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象。
d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值