mybatis的工作原理

一、mybatis的工作过程

mybatis的工作原理

1、系统运行时,加载mybatis的xml配置文件到Configuration类中,SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory,new SqlSessionFactoryBuilder.build(...),所以SqlSessionFactory持有mybatis的基本配置内容。在整个应用当中,我们应该只创建一个SqlSessionFactory实例。

mybatis的工作原理

2、根据创建的sqlSessionFactory,然后再生成sqlSession,sqlSession = sqlSessionFactory.openSession();跟进去这个openSession方法可见

mybatis的工作原理

每创建一个sqlSession,都会对应绑定一个事务管理实例,sqlSession可以创建多个。

SqlSession用途主要有两种:

①. 获取对应的Mapper,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。

②. 直接使用SqlSession,通过命名信息去执行SQL返回结果,该方式是IBatis版本留下的,SqlSession通过Update、Select、Insert、Delete等方法操作。

3、调用mybatis执行mapper类中的方法

    mapper类:

mybatis的工作原理

(1)一个mapper类对应一个mybatis-*.xml文件,mybatis文件中的命名空间就是对应mapper类的包全路径,这样做的好处是可以全局唯一,又可以通过反射获取对应的Mapper类。

(2)mapper.xml文件每一个sql映射节点的id属性值对应mapper类的一个方法。我们在配置sql映射的时候也必须这样做,因为Mybatis的底层就是使用反射机制来获取执行方法的全路径作为ID来获取sql的映射配置的。

(3)每一个和mapper xml文件关联的类,都是Mapper类,在执行过程,通过动态代理,执行对应的方法。

(4)Mybatis是如何判断哪些类是Mapper类的呢?其实只有在运行时才会知道。在加载Mybatis配置文件中,通过解析mapper xml文件缓存了所有的sql映射配置,在调用SqlSession的getMapper方法获取Mapper类的时候才会生成代理类。

mybatis的工作原理

     总结: 在mybatis中,一个SqlSession实例代表着一次数据库连接,SqlSession由SqlSessionFactory来获取。在整个应用运行过程,我们只需要一个SqlSessionFactory实例,但是可以有多个SqlSession实例。 SqlSession是一个会话,类似于jdbc的connection,SqlSession是线程不安全的,所以我们最好在方法级别使用SqlSession,并且在使用完毕及时关闭连接,避免资源的浪费。