《深入浅出MyBatis技术原理与实战》——3. 配置

时间:2023-03-09 19:37:07
《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

要注意的是上面那些层次是不能够颠倒顺序的,否则MyBatis在解析文件的时候就会出现异常。

3.1 properties元素

properties是一个属性配置元素,让我们能在配置文件的上下文中使用它。MyBatis提供3中配置方式:

  • property子元素
  • properties配置文件
  • 程序参数传递

3.1.1 property子元素

《深入浅出MyBatis技术原理与实战》——3. 配置

这样我们就可以在上下文中使用已经配置好的属性值了:

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

3.1.2 properties配置文件

更多的时候会使用properties配置文件来配置属性值,以方便我们在多个配置文件中重复使用它们,也方便日后维护和修改。

《深入浅出MyBatis技术原理与实战》——3. 配置

把这个properties文件放在源包下,只要这样引入这个配置文件即可:

《深入浅出MyBatis技术原理与实战》——3. 配置

3.1.3 程序参数传递

实际工作中,运维人员会对配置文件中的用户名和密码进行加密,这样我们的配置文件中往往配置的是加密过后的数据库信息,而无法通过加密的字符串去连接数据库,这个时候可以通过编码的形式来满足我们遇到的场景。假设jdbc.properties文件中的username和password连个属性使用了加密的字符串,这个时候我们需要在生成SqlSessionFactory之前将它转化为明文,而系统已经提供了解密的方法decode(str)

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

3.1.4 优先级

MyBatis支持的3中配置方式可能同时出现,并且属性还会重复。这3种方式的优先级如下:

(1) 在properties元素内指定的属性首先被读取

(2) 根据properties元素中的resource属性读取类路劲下属性文件,或者根据url属性指定的路劲读取属性文件,并覆盖以读取的同名属性

(3) 读取作为方法参数传递的属性,并覆盖以读取的同名属性

3.2 设置

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

3.3 别名

用一个简短的名称去指代过长的类全限定名,这个名称可以在MyBatis上下文中使用。MyBatis中的别名分为系统定义别名和自定义别名。注意的是在MyBatis中别名是部分大小写的。

3.3.1 系统别名定义

3.3.2 自定义别名

系统自定义的别名往往是不够用的,因为不同的应用有着不同的需要,所以MyBatis允许自定义别名:

《深入浅出MyBatis技术原理与实战》——3. 配置

如果POJO过多的时候,配置也是非常多的。因此可以通过自动扫描的形式自定义别名:

《深入浅出MyBatis技术原理与实战》——3. 配置

然后在java代码中使用注解@Alias:

《深入浅出MyBatis技术原理与实战》——3. 配置

当然配置了包扫描路劲,而没有注解@Alias的,MyBatis也会装载,会将类名的第一个字母变为小写,作为MyBatis的别名,要特别注意避免出现重名的场景,建议使用部分包名加类名的限定。

3.4 typeHandler

MyBatis在预处理语句中设置一个参数时,或者从结果中取出一个值时,都会用注册了的typeHandler进行处理。

《深入浅出MyBatis技术原理与实战》——3. 配置

typeHandler的作用就是将参数从javaType转化为jdbcType,或者从数据库取出结果时把jdbcType转化为javaType。

3.4.1 系统定义的typeHandler

Mybatis系统内部定义了一系列的typeHandler,我们可以选取一个Mybatis系统自定义的typeHandler,并了解它的具体内容。我们可以看到MyBatis源码包org.apche.ibatis.type下面定义的StringTypeHandler,负责处理String类型:

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

StringTypeHandler继承了BaseTypeHandler。而BaseTypeHandler实现了接口typeHandler,并且 自己定义了4个抽象方法。所以继承它的时候需要实现其定义的4个抽象方法。setParameter是PreparedStatement对象设置参数,允许我们自己填写变换规则。getResult则分为ResultSet用列名或者列下标来获取数据结果。其中还包括了用CallableStatement(存储过程)获取结果及数据的方法。

3.4.2 自定义typeHandler

一般而言,MyBatis系统定义的typeHandler已经能够应付大部分场景了,但是不能排除不够用的情况。让我们覆盖一个字符串参数的typeHandler试试:

首先配置XML文件,确定我们需要处理什么类型的参数和结果:

《深入浅出MyBatis技术原理与实战》——3. 配置

然后实现我们的MyStringTypeHandler:

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

到了这里还不能测试,因为还需要去标识哪些参数或者结果类型去用typeHandler进行转换,在没有任何标识的情况下,MyBatis是不会启用你定义的TypeHandler进行结果转换的,因此还需要修改映射器的配置:

《深入浅出MyBatis技术原理与实战》——3. 配置

当然了,配置typeHandler的时候也可以进行包配置,然MyBatis扫描包里面的内容,以减少配置工作:

《深入浅出MyBatis技术原理与实战》——3. 配置

3.4.3 枚举类型

MyBatis中枚举类型的typeHandler有自己特殊的规则,MyBatis内部提供了两个转化枚举类型的typeHandler给我们使用:

《深入浅出MyBatis技术原理与实战》——3. 配置

其中EnumTypeHandler是使用枚举字符串名称作为参数传递,而EnumOrdinayTypeHandler是使用整数下标作为参数传递的。在大部分情况下我们都不想使用系统的枚举typeHandler而是采用自定义。

3.5 ObjectFactory

当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory去构建POJO,在MyBatis中可以定制自己的对象工厂,不过一般使用默认的即可。

3.6 插件

3.7 environments配置环境

3.7.1 概述

配置环境可以注册多个数据源,每一个数据源可分为两大部分:一个是数据源的配置,另外一个是数据库事务的配置。关于数据源配置这块,

《深入浅出MyBatis技术原理与实战》——3. 配置

有的时候需要使用其他的数据源,比如DBCP数据源,这个时候需要我们自定义数据源,需要实现org.apache.ibatis.datasource.DataSourceFactory接口,如:

《深入浅出MyBatis技术原理与实战》——3. 配置

《深入浅出MyBatis技术原理与实战》——3. 配置

再配置一下DBCP数据源就可以用了:

《深入浅出MyBatis技术原理与实战》——3. 配置

3.8 databaseIdProvider数据库厂商标识

3.9 引入映射器的方法