Mybatis架构设计和实例分析

框架设计

 1,接口层:和数据库交互

  1.1传统的mybatis提供的API,通过SqlSession对象完成与数据库的交互,

   1.2,使用Mybatis支持接口的调用方式,Mapper接口文件和Mapper.xml文件之间存在着一一对应的关系,

  首先,接口文件的全类名和xml文件的全类名是完全一样的,然后在xml文件中,表明命名空间namespace的值就是接口的全类名,然后每个查询语句中的id就是接口中对应的方法名,然后配置文件中的每一个参数类型就是接口文件中方法的参数,配置文件的resultMap就是对应了接口文件中的返回类型

  配置规范搞定以后,通过SqlSession.getMapper(XXXMapper.class)方法,MyBatis会根据相应的信息,通过动态代理机制生成一个Mapper实例,当我们使用Mapper接口的一个方法时,根据namespace + id来确定,本质上还是通过SqlSession对象来完成的

2,Mybatis层次结构

 3,事务管理机制:MyBatis将事务抽象为Transaction接口,有两种,我们用JDBC,

   3.1,配置

    在XML配置文件中定义,在<environment>标签中定义的<transactionManager type = "JDBC"or"MANAGED">

  3.2创建

    事务的创建是交给TransactionFactory事务工厂来创建的,当我们配置完毕后,Mybatis初始化解析节点标签时,会自动创建一个JDBCTransactionFactory

   其实在实例化的时候,针对不同的配置文件,都会生成不同的对象 ,然后彼此之间层层嵌套

   3.3,事务工厂定义了两种创建事务的办法,一是通过Connection对象创建Transaction,二是通过DataSource来创建Transaction,

    a,JdbcTransaction是使用的java.sql.Connection 上的commit和rollback功能,JdbcTransaction只是相当于对java.sql.Connection事务处理进行了一次包装(wrapper),Transaction的事务管理都是通过java.sql.Connection实现的。

关联查询问题

    可能需要多次查询来组装对象来组装返回对象,所以Mybatis提供了一种嵌套查询语句,可以简化上述操作

 

 假设嵌套查询就一个(即resultMap 内部就一个association标签),现查询的结果集返回条数为N,那么关联查询语句将会被执行N次,加上自身返回结果集查询1次,共需要访问数据库N+1次。如果N比较大的话,这样的数据库访问消耗是非常大的!所以使用这种嵌套语句查询的使用者一定要考虑慎重考虑,确保N值不会很大。

原文地址:https://www.cnblogs.com/benbenzoule/p/13836274.html