MyBatis配置(一)

MyBatis的配置文件包含了会深深影响MyBatis行为的设置和属性信息。配置文档的顶层结构如下:
在这里插入图片描述
本节主要学习 properties、settings和typeAliaes。

一、属性(properties)

properties 属性可以给系统配置一些运行参数,可以放在 XML 文件或者 properties 文件中,而不是放在 Java 编码中,这样的好处在于方便参数修改,而不会引起代码的重新编译。一般而言,MyBatis 提供了 3 种方式让我们使用 properties。

1.通过properties子元素

<!--这里先声明一下-->
<properties>
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/inventory"/>
  <property name="username" value="root"/>
  <property name="password" value="123456"/>
</properties>

<!--真正使用的时候-->
<dataSource type="POOLED">
   <property name="driver" value="${driver}"/>
   <property name="url" value="${url}"/>
   <property name="username" value="${username}"/>
   <property name="password" value="${password}"/>
</dataSource>

分析:先用properties下面的子元素property来定义一些name和value,然后在用 ${name} 将值引入。优点是:相当于将局部变量定义为全局变量,这样就可以一处定义,本文件内到处引入了。缺点是:如果属性参数成千上万个,显然使用这个方式不是一个很好的选择,这个时候就可以使用配置文件了。

2.通过引入外部properties文件

jdbc.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/inventory
username=root
password=123

mybatis-config.xml

<!--引入jdbc.properties-->
<properties resources="jdbc.properties" />
<!--真正使用的时候-->
<dataSource type="POOLED">
   <property name="driver" value="${driver}"/>
   <property name="url" value="${url}"/>
   <property name="username" value="${username}"/>
   <property name="password" value="${password}"/>
</dataSource>

分析:第一步新建配置文件,并将参数配置成key-value的形式,第二步,还是用 ${} 引入。优点:这个时候我们只需要维护jdbc.properties这个文件。

3.程序代码传递

在真实的生成环境中,数据库的用户名密码是对开发人员和其他人员保密的。运维人员为了保密,一般都需要把用户名和密码经过加密成为密文后,配置到properties文件中。对于开发人员,就不知道真实的用户密码了。现在假设系统已经给出了这样一个CodeUtils.decode(Str)进行解密,那么我们在创建SqlSessionFactory前,就需要把用户名和密码解密,最后把密码后的字符串重置到properties属性中。

public class SqlSessionFactoryUtil2 {

	// 获取class对象
	private final static Class<SqlSessionFactoryUtil2> LOCK = SqlSessionFactoryUtil2.class;

	//首先创建静态成员变量sqlSessionFactory
	private static SqlSessionFactory sqlSessionFactory = null;

	//构造函数私有
	private SqlSessionFactoryUtil2() {
	}

	public static SqlSessionFactory getSqlSessionFactory() {
		synchronized (LOCK) {
			if (sqlSessionFactory != null) {
				return sqlSessionFactory;
			}
			String resource = "mybatis-config.xml";
			String property = "jdbc.properties";
			try {
				InputStream inputStream = Resources.getResourceAsStream(property);
				Properties properties = new Properties();
				properties.load(inputStream);
				String username = (String) properties.get("username");
				String password = (String) properties.get("password");
				//解密用户名和密码
				properties.put("username", Codeutils.decode(username));
				properties.put("password", Codeutils.decode(password));
				
				inputStream = Resources.getResourceAsStream(resource);
				//使用程序传递的方式覆盖原来的properties属性参数
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
			} catch (IOException e) {
				e.printStackTrace();
				return null;
			}
			return sqlSessionFactory;
		}
	}

}

分析:依旧是原来的SqlSessionFactoryUtil2,哈哈。首先使用了Resources对象读取了一个jdbc.properties配置文件,然后获取了它加密的用户名和密码,进行解密和重置,最后使用SqlSessionFactoryBuilder的build方法,传递多个properteis参数完成。这将会覆盖之前配置的密文,这样就能连接数据库了,同时也满足了运维人员对数据库用户名和密码安全的要求。

注意:附加一些官方文档上的一些说明。

  • 优先级:程序传递优先级最高,外部配置文件引入其次,properties定义property最低。另外,优先级高的会覆盖优先级低的值。

  • 加载顺序:与上面的优先级相反,优先级低的先加载。

  • 为占位符指定默认的值。
    在这里插入图片描述

  • 还有一些特殊情况。
    在这里插入图片描述

二、设置(settings)

在 MyBatis 中 settings 是最复杂的配置,它能深刻影响 MyBatis 底层的运行,但是在大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置它,只需要修改一些常用的规则即可,比如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器(Executor)类型等。settings 配置项说明,如表 1 所示:

表 1 settings 配置项说明
配置项 作用 配置选项 默认值
cacheEnabled 该配置影响所有映射器中配置缓存的全局开关 true|false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态  true|false false
aggressiveLazyLoading 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载 true|felse 版本3.4.1 (不包含)
之前 true,之后 false
multipleResultSetsEnabled  是否允许单一语句返回多结果集(需要兼容驱动) true|false true
useColumnLabel 使用列标签代替列名。不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 true|false true
useGeneratedKeys 允许JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby) true|false false
autoMappingBehavior 指定 MyBatis 应如何自动映射列到字段或属性。
NONE 表示取消自动映射。
PARTIAL 表示只会自动映射,没有定义嵌套结果集和映射结果集。
FULL 会自动映射任意复杂的结果集(无论是否嵌套)
NONE、PARTIAL、FULL PARTIAL
autoMappingUnkno wnColumnBehavior 指定自动映射当中未知列(或未知属性类型)时的行为。 默认是不处理,只有当日志级别达到 WARN 级别或者以下,才会显示相关日志,如果处理失败会抛出 SqlSessionException 异常 NONE、WARNING、FAILING NONE
defaultExecutorType 配置默认的执行器。SIMPLE 是普通的执行器;REUSE 会重用预处理语句(prepared statements);BATCH 执行器将重用语句并执行批量更新  SIMPLE、REUSE、BATCH SIMPLE
defaultStatementTimeout 设置超时时间,它决定驱动等待数据库响应的秒数 任何正整数 Not Set (null)
defaultFetchSize 设置数据库驱动程序默认返回的条数限制,此参数可以重新设置 任何正整数   Not Set (null)
safeRowBoundsEnabled 允许在嵌套语句中使用分页(RowBounds)。如果允许,设置 false true|false false
safeResultHandlerEnabled 允许在嵌套语句中使用分页(ResultHandler)。如果允许,设置false true|false true
mapUnderscoreToCamelCase 是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射 true|false false
localCacheScope
MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速联复嵌套査询。
默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlScssion 的不同调用将不会共享数据  
SESSION|STATEMENT SESSION
jdbcTypeForNull
当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER NULL、VARCHAR、OTHER   OTHER
lazyLoadTriggerMethods
指定哪个对象的方法触发一次延迟加载 equals、clone、hashCode、toString
defaultScriptingLanguage
指定动态 SQL 生成的默认语言 org.apache.ibatis
.script.ing.xmltags
.XMLDynamicLanguageDriver
callSettersOnNulls
指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这对于 Map.kcySet() 依赖或 null 值初始化时是有用的。注意,基本类型(int、boolean 等)不能设置成 null true|false false
logPrefix
指定 MyBatis 增加到日志名称的前缀  任何字符串 Not set
loglmpl
指定 MyBatis 所用日志的具体实现,未指定时将自动査找 SLF4J|LOG4J|LOG4J2|JDK_LOGGING
|COMMONS_LOGGING
|ST DOUT_LOGGING|NO_LOGGING
Not set
proxyFactory 指定 MyBatis 创建具有延迟加栽能力的对象所用到的代理工具 CGLIB|JAVASSIST JAVASSIST (MyBatis 版本为 3.3 及以上的)
vfsImpl 指定 VFS 的实现类   提供 VFS 类的全限定名,如果存在多个,可以使用逗号分隔  Not set
useActualParamName 允许用方法参数中声明的实际名称引用参数。要使用此功能,项目必须被编译为 Java 8 参数的选择。(从版本 3.4.1 开始可以使用) true|false true

Settings的配置项很多,但是真正用到不会太多,我们把常用的配置项研究清楚就行,比如关于缓存的 cacheEnabled,关于级联的 lazyLoadingEnabled 和 aggressiveLazyLoading,关于自动映射的 autoMappingBehavior 和 mapUnderscoreToCamelCase,关于执行器类型的defaultExecutorType等。

这里给出一个全量的配置样例:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

三、别名(typeAliases)

由于类的全限定名称很长,需要大量使用的时候,总写那么长的名称不方便。在 MyBatis 中允许定义一个简写来代表这个类,这就是别名,别名分为系统定义别名和自定义别名。在 MyBatis 中别名由类 TypeAliasRegistry(org.apache.ibatis.type.TypeAliasRegistry)去定义。注意,在 MyBatis 中别名不区分大小写。

1、系统自定义别名

在MyBatis的初始化过程中,系统自动初始化了一些别名,如下表所示:

别名
Java 类型 是否支持数组
_byte
byte
_long
long
_short
short
_int
int
_integer
int
_double
double
_float
float
_boolean
boolean
string
String
byte
Byte
long
Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator
ResultSet ResultSet

如果需要使用对应类型的数组型,要看其是否能支持数据,如果支持只需要使用别名加 [] 即可,比如 _int 数组的别名就是 _int[]。而类似 list 这样不支持数组的别名,则不能那么写。

有时候要通过代码来实现注册别名,让我们看看 MyBatis 是如何初始化这些别名的,如下所示。
在这里插入图片描述
在这里插入图片描述
所以使用TypeAliasRegister的registerAlias 方法就可以注册别名了。一般是通过Configuration 获取 TypeAliasRegister 类对象,其中由一个 getTypeAliasRegistry 方法可以获得别名,如 configuration.getRypeAliasRegistry()。然后就可以通过registerAlias 方法对别名注册了。而事实上 Configuration 对象也对一些常用的配置项配置了别名。如下图所示:
在这里插入图片描述
这些配置为的是让我们更容易配置MyBatis的相关信息。以上就是MyBatis 系统定义的别名,我们在使用的时候,不要重复命名,导致其他问题。

下一节:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值