MyBatis:SqlSession

正常的运行逻辑是先生成dao接口的实现类,将需要执行的方法映射到mapper文件中的sql语句,发送sql语句到数据库执行数据操作

其中难点有三:

1)如何通过dao接口创建dao对象

2)如何将dao接口中的方法映射到mapper文件中的sql语句

3)如何发送sql语句到数据库中

Solution:

1)mybatis底层通过SqlSession的getMapper()方法生成dao接口的代理对象;

2)代理过程中通过invoke方法中的method参数获取到需要执行的方法名,映射到mapper文件中对应的sql语句;

3)SqlSession通过已有的数据源获取到数据库信息,并提供了在数据库执行SQL命令所需的所有方法,可以通过SqlSession实例来直接执行已映射的SQL语句。

总结:

由上可知,SqlSession是Mybatis的关键对象,它可以生成dao接口的代理对象,映射到mapper文件的sql语句,并发送sql语句到数据库。

除此之外,SqlSession还可以控制数据库事务(SqlSessison.commit(), SqlSession.rollback())

更加细致的过程如下:

1、Mybatis 读取XML配置文件后会将内容放在一个Configuration类中,SqlSessionFactoryBuilder会读取Configuration类中信息创建SqlSessionFactory。

2、在初始化SqlSessionFactory时,Mapper 接口进行注册,注册在了名为 MapperRegistry 类的 HashMap中,

key = Mapper class, value = 创建当前Mapper的工厂。

3、SqlSessionFactory创建SqlSession。

4、SqlSession中可以通过getMapper()拿到代理对象,SqlSession.getMapper 运用了 JDK动态代理,产生了目标Mapper接口的代理对象。

5. 动态代理的 代理类是 MapperProxy ,这里边mapperMethod.execute(sqlSession, args)最终完成了增删改查方法的调用。


 

posted @ 2021-08-17 12:09  realDevin  阅读(544)  评论(0编辑  收藏  举报