0%

mybatis的底层原理分析

Mybatis是一个ORM框架,ORM是( Object Relational Mapping )的简写,翻译过来就是 对象-关系映射 ,简单来说就是把数据库和实体类及实体类的属性对应起来,让我们可以操作实体类就能实现操作数据库。

在分析底层原理之前,先看单独使用Mybatis时的执行流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MybatisTest {
/**
* 入门案例
* @param
*/
@Test
public void test1() throws IOException {
//1.读取主配置文件
InputStream is = Resources.getResourceAsStream ( "mybatis.xml" );
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder ( );
SqlSessionFactory factory = builder.build ( is );
//3.使用工厂生产一个SqlSession对象
SqlSession sqlSession = factory.openSession ( );
//4.使用SqlSession创建Dao接口的代理对象
UserDao userDao = sqlSession.getMapper ( UserDao.class );
//5.使用代理对象执行方法
List<User> users = userDao.findAll ( );

/*String sqlId = "com.itheima.dao.UserDao"+"."+"findAll";
List<User> users = sqlSession.selectList ( sqlId );*/
for (User user : users) {
System.out.println (user );
}
//6.释放资源
sqlSession.close ();
is.close ();
}
}

以下是我通过debug调试得到的结果:

抛开我们使用mybatis时这几步执行流程来说,在mybatis底层最重要的两个对象就是configurationtransaction

configuration是mybatis配置对象,它是用来存储从xml配置文件中解析得到的所有数据,它里面有非常重要的三个属性:

  • environment
  • mapperRegistry
  • mappedStatements

transaction是mybatis的事务管理对象,如果在配置文件中配置了事务管理,那么由同一个sqlSession创建的代理对象,在执行CRUD操作时每次获取到的connection将会是同一个,属性如下:

  • connection
  • dataSource
  • level
  • autoCommit

这两个对象创建的时机:

configuration对象在创建sqlSessionFactoryBuild时进行创建,transaction对象在创建sqlSession时创建,并且transaction中包含有configuration对象,不同的sqlSession它的transaction也不相同,但是configuration对象是同一个。

没办法,要恰饭的嘛!