Mybatis源码分析(三):Mybatis所有暴露的接口及其作用

上节我们主要简单介绍了mybatis的源码入口,其中讲到了一个核心的类

SqlSessionFactoryBean,这个类中有很多属性,我们最常用的就是mapperLocations【扫描所有的xml文件】和mapperLocations【数据源配置】

这里我们结合buildSqlSessionFactory()【相关属性的处理方法】方法来看看相关的属性【方法中的属性就是mybatis所暴露给用户的全部接口】
注意:
Mybatis的SqlSessionFactoryBean这些属性实际上是mybatis所暴露出的接口,方便我们对mybatis进一步扩展!
本节主要描述下mybatis相关属性的作用,下节开始对常用属性进一步扩展!
1.configLocation

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation">
			<value>classpath*:核心配置文件的位置</value>
		</property>
</bean>

用来配置mybatis的核心配置文件,配置文件的格式如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql" />
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true" />
</plugin>

</plugins>
</configuration>

也就是说SqlSessionFactoryBean下很多属性可以配置到mybatis的全局配置文件中!
2.objectFactory
在这里插入图片描述

上图可见objectFactory属性在代码中的位置
这个元素,大家在使用mybatis的时候设置吗?我是从来没有设置过啊。使用mybatis为我们已经写好的默认实现已经能够满足绝大多数的场景需求。那么这个元素又是干什么的呢?
官方文档上是这么说的:

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。注意的是mybatis为我们实现了一个默认实现,那就是DefaultObjectFactory,这个已经足够我们使用了。
3. objectWrapperFactory
在这里插入图片描述
(源码中被处理的位置)
上图是objectWrapperFactory配置被解析在源码中的位置

Spring中配置

<property name="objectWrapperFactory" ref="定义的处理类" />,这样的配置就会被上段代码所解析!(以下提到的各个属性在spring配置文件中的配置基本类似)

作用:mybatis 对基本类型,基本对象,map和集合的包装,除非你有比较特殊的对象需要自己实现,才有用到这个配置。所以这个类的作用是获取或设置bean,map或者list属性的值。

objectWrapperFactory源码
在这里插入图片描述
MetaObject的源码
在这里插入图片描述

它有一个默认的实现类DefaultObjectWrapperFactory。默认情况都是使用DefaultObjectWrapperFactory,如果定义了就会使用自定义包装类!
4. vfs
Vfs是虚拟文件系统用来读取服务器相关资源和加载相关的类。提供了2个实现 JBoss6VFS 和 DefaultVFS,并提供了用户扩展点,可定义VFS实现
加载顺序: 自定义VFS实现 > 默认VFS实现 。

<property name="vfs" ref="实现VFS类的vfsimpl" />

5.typeAliasesPackage
在这里插入图片描述

给整个package包起一个别名,那么这个包下所有的类的别名都是类名首字母小写。

<property name="typeAliasesPackage" ref="com.zzy.model" />

6.typeAliases
在这里插入图片描述
作用:主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名。
7.Plugins
在这里插入图片描述

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

· Executor (update, query, flushStatements, commit, rollback, 
getTransaction, close, isClosed)

· ParameterHandler (getParameterObject, setParameters)

· ResultSetHandler (handleResultSets, handleOutputParameters)

· StatementHandler (prepare, parameterize, batch, update, query)

假设你想做的不仅仅是监控方法的调用,那么你应该很好的了解正在重写的方法的行为。 因为如果在试图修改或重写已有方法的行为的时候,你很可能在破坏 MyBatis 的核心模块。 这些都是更低层的类和方法,所以使用插件的时候要特别当心。
通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定了想要拦截的方法签名即可。
8. typeHandlersPackage、typeHandlers
Mybatis源码中的处理位置
在这里插入图片描述
typeHandlersPackage、typeHandlers是类型转换器

有这样一个需求:
有一个布尔型的字段需要保存到数据库中,但是数据库不支持布尔类型,因此采用一位字符(char(1))来存储这个布尔值,javabean中仍然采用boolean类型。

我们采用mybatis作为持久层框架,但是就有一个问题,数据库中使char型,而程序中是boolean型,如何实现数据类型自动转换? 解决办法: mybatis提供了对自定义的类型转换器(typeHandler)的支持,因此我们可以自己编写类型转换器来实现这一自动转换的功能。 (后期举例子解释)

9.databaseIdProvider
作用就是多数据库环境互相切换,比如同一个系统既要支持oracle又要支持mysql,那么需要配置这个属性。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="databaseIdProvider" ref="databaseIdProvider" />  
  1. Cache
    扩展Mybatis Cache接口,自定义缓存。
  2. xmlConfigBuilder
    XMLConfigBuilder是对mybatis的配置文件进行解析的类,会对myabtis解析后的信息存放在Configuration对象中,Configuration对象会贯穿整个mybatis的执行流程,为mybatis的执行过程提供各种需要的配置信息。
  3. transactionFactory
    在这里插入图片描述
    从源码可以看出mybatis在没有定义额外的事务时,会采用spring的事务!
  4. mapperLocations
    在这里插入图片描述
    读取mybatis的xml文件,然后解析xml文件!
    欢迎大家加入Java高级架构/互联网(严禁培训机构、广告群,最干净的技术交流群):微信号:1083683150(备注:技术群或者4000G架构师资源)

微信平台本人收集个大量资源(4000G架构师资源,1000G大数据资源),只做分享,欢迎大家关注获取,保证免费,非任何机构

更多精彩请扫码关注微信公众号—— 名称:java版web项目 id :java_project
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值