Configuration和Mapper|学习笔记

简介: 快速学习Configuration和Mapper

开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术Configuration和Mapper学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/80/detail/15946


Configuration和Mapper


紫色部分是配置信息,配置信息是在 MyBatis 运行的时候就需要读的。

image.png

在 MyBatis 中包含两个部分的配置信息:一个是 MyBatis本身的配置信息,我们在使用 Spring Boot的时候,这部分本身的配置信息是写在 application里面的;

另一个就是关于接口的信息,我们会用独立接口的 interface或者说用 interface对应的 xml文件去描述这些接口的配置信息。这两方面的配置信息会在 Spring框架去运行 MyBatis时全部读出来,两个配置信息里面如果有配错了的一部分内容,它在

实例化这些对象的时候会出错。

在 Spring的框架中,可以看到上面这个 Spring的 FactoryBean里面有一个属性叫做configuration,不是每一个属性都写的这个名字,但是所有指向 configuration的属性名字都叫做 configuration,代码里面都是这样的。所以在这个SqlSessionFactoryBean 中间是有一个 configuration的对象的,意味着当 Spring的框架运行MyBatis的时候,如果它带了MyBatis的包,就会去读所有 MyBatis的配

置信息,把它变成 configuration对象,就是这两类的配置信息,最后都是存在configuration 的对象。

在这两类配置信息的读取过程中,因为它是两种不同的格式,甚至有更多不同的格式,所以下面它分成了不同的 Builder。

可以看到它有一个 XMLConfigBuilder,它的配置信息是可以写成独立的 XML文件的,但都是比较早期的做法,如果形成独立的XML文件是需要通过XMLConfigBuilder 去读那个独立的 MyBatis配置文件的。那对于Mapper来说就有两种写法,一种是通过 XML去写,另一种是通过 Annotation去写,所以他有两个Builder,分别是用来去读 XML的配置信息,

就是 XMLConfigBuilder和MapperAnnotationBuilder,是用来去读写在 Mapper接口中间的配置信息的注解信息。所以无论是什么样的 Builder,最后读进来的都是

configuration。

configuration 读进来以后,以怎样的方式存储在这种 configuration对象中间呢?configuration 对象中也是有非常多属性的,但是今天讲关于 Mapper的这些配置,红色的部分就是Mapper的配置。

image.png

在 configuration中间,Mapper 的配置是写在了 MapperRegistry的对象中间,所以可以看到它有一条双向属性,就是它既是从 configuration指向了MapperRegistry,又是从 MapperRegistry指向 configuration。MapperRegistry中间存的是所有 Mapper的信息,所以可以看到它里面有一个属性叫做knownMapper,就是它知道的 Mapper读进去的,是用一个 Mapper的格式来存

的;这个白色的《Mapper》是类,不是对象,因为它只是一个接口的定义。JAVA反射机制里的类作为它的T,值就图中的是 MapperProxy Factory。它不把这个对象放到配置里面,因为在配置里面写的信息并不代表这个对象真正会用,我们经常

可能会写了很多的配置的 Mapper,但是其实可能没用到那些,就没有必要把Mapper实例画出来。它在驻入的时候把需要的Mapper的对象驻进去,如果没有驻入或者没有在任何地方要用到 Mapper就不需要把它实例画出来,所以它的 key是它的类,而它的 value就是 Mapper的ProxyFactory。

image.png

工厂对象准备用它来制造我们要驻进去的 Mapper对象,这是它的配置信息,红色部分就是要驻进去时候做的 Mapper的 Proxy,它不可能做出一个接口对象来,因为这个接口是在外面定义的,所以不可能用代码写出来一个 Mapper的对象。

它用的个 JAVA 的动态代理机制,当我们去调 Mapper的任何的一个方法时,都是调 MapperProxy 的方法去模拟实现接口的所有方法,所以它最后驻进去的是我们看到的 MapperProxy。

image.png

下面是 MapperProxy 如何去执行的一些相关的类,红色部分里面就是 Mapper的信息,而且我们所说的面向对象特征表现就是在这个 Mapper 和 configuration 里面,因为这两部分里面包含了它的 Mapper 和 method 的接口以及参数。

我们传进去的参数是如何映射到 Mapper定义中间的 SQL语句的参数里面,以及它的返回值是怎样变成我们所需要的对象的,都是在红色和紫色部分里面,也就是定义的部分。

相关文章
|
2月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
Java 数据库连接 mybatis
【MyBatis】:Type interface com.atguigu.mybatis.mapper.UserMapper is
【MyBatis】:Type interface com.atguigu.mybatis.mapper.UserMapper is
|
人工智能 Java 数据库连接
Mybatis mapper-locations作用
Mybatis mapper-locations作用
|
SQL Java 关系型数据库
MyBatis中mapper.xml中foreach的使用
MyBatis中mapper.xml中foreach的使用
366 0
|
SQL Java 数据库连接
spring整合通用mapper
spring整合通用mapper
114 0
spring整合通用mapper
|
Java Spring
有了@MapperScan就不用@Mapper了你知道嘛
有了@MapperScan就不用@Mapper了你知道嘛
261 0
|
XML Java 数据库
mapper.xml详解
java简单类型,int,String #{占位符,任意字符} pojo自定义对象 新增 #{pojo的属性名} hashmap
157 0
|
Java 数据库连接 mybatis
tk.mapper(通用mapper)出现的问题:Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvid
tk.mapper(通用mapper)出现的问题:Error invoking SqlProvider method (tk.mybatis.mapper.provider.SpecialProvid
295 0