目的:让我们能更好的了解mybatis 内部是怎么执行的,在以后的开发中能更好的使用 mybatis 框架**,同时对它的**设计理念(设计模式)**有一个认识。
mybatis在使用代理dao的方式实现增删改查时做什么事呢?
只有两件事:
第一:创建代理对象
第二:在代理对象中调用selectList****执行sql语句
自定义mybatis能通过入门案例看到类,我们来对其实现(运用底层的原理)
class Resources
class SqlSessionFactoryBuilder
interface SqlSessionFactory
interface SqlSession
工厂模式(Factory 工厂模式)、构造者模式(Builder 模式)、代理模式,反射,自定义注解,注解的反射,xml 解析,
数据库元数据,元数据的反射
SqlSessionFactoryBuilder(构造者)接受SqlMapConfig.xml的文件流(配置文件信息)构建出SqlSessionFactory(工厂)
1.SqlSessionFactory(工厂)读取SqlMapConfig.xml读取下面的连接数据库和mapper的映射信息。用来生产出真正操作数据库的SqlSession对象
映射配置文件中的(dao接口中的)sql语句信息,以及信息是何种实体类(domain.User)
2.读取xml文件均需要dom4j技术来读取,通过一个工具类XMLConfigBuilder来进行(内部底层是dom4j以及xpath),实际上是Resources的getResourceAsStream来返回一个IO流对象
然后返回一个Configuration对象,(自定义mybatis的配置类)里面含有driver和url以及Mapper对象等等信息。。
3.代理对象Mapper
Mapper对象中包含了获取的唯一标识(key是由dao的全限定类名和方法名组成)以及执行所需的必要信息(value是一个Mapper对象,里面存放的是执行的SQL语句和要封装的实体类全限定类名),是用于封装执行的SQL语句和结果类型的全限定类名
创建出SqlSession对象后,此对象有两个大的作用,从而引出实现两个分支,作用如下:
无论是哪个分支作用,除了连接数据库信息,还需要得到Sql语句
作用(1)中:在SqlSessionImpl对象即Mapper对象中,执行getMapper方法分两步实现
1.先用SqlSessionFactory读取的数据库连接信息创建一个Connection对象 return DriverManager.getConnection(cfg.getUrl(), cfg.getUsername(), cfg.getPassword());。
2.然后jdk代理模式创建出代理对象作为getMapper方法返回值,这里主要工作是在创建代理对象时第三个参数处理类里面得到Sql语句new MapperProxy(cfg.getMappers(),connection),执行增删改查操作 public List selectList(Mapper mapper, Connection conn)
作用(2)中:在SqlSessionImpl对象即Mapper对象中提供selectList方法
第一:用SqlSessionFactory读取的的数据库连接信息创建出jdbc的Connection对象。
第二:直接得到Sql语句,使用jdbc的Connection对象进行增删改查操作。
最后统统要对返回的数据库结果集进行封装,变成java对象返回给调用者。所以我们还必须要知道调用者所需要的返回类型。resultType="com.itheima.domain.User
无论是让Mybatis帮我们创建代理对象还是直接使用Mybatis提供的方法,其底层都是jdbc的Connection对象,执行对应sql语句,最终封装成结果集。只是注解和xml配置文件两周开发模式在传递sql语句和返回值类型的方式有所差异而已。具体如下图所示: