目录
mybatis-03 Mybatis 配置
概述
配置详解
环境配置(environments)
属性(properties)
类型别名(typeAliases)
设置(settings)
类型处理器(typeHandlers)
插件(plugins)
映射器(mappers)
关键对象的作用域和生命周期
日志
日志工厂
Log4j 实现
虽说约定大于配置,已经是框架开发演进的方向,但掌握核心的配置往往能最大化地榨干框架的性能,满足我们的需求。目前对于 Mybatis 来说,我面临最大的一个问题就是:无法查看执行的 SQL 语句!这是致命的。但是,配置好 Mybatis 的日志实现后,就能在指定位置看到拼接出的 SQL 语句、查询结果、执行时间……
官网对配置的介绍都在这个页面上:https://mybatis.org/mybatis-3/zh/configuration.html
MyBatis 可以配置多套使用环境,但每个 SqlSessionFactory 实例只能选择一种环境。所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例……为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可
如果忽略了环境参数,那么将会加载默认环境:
environments 元素定义了如何配置环境。
注意一些关键点:
默认使用的环境 ID(比如:default="development")。
每个 environment 元素定义的环境 ID(比如:id="development")。
事务管理器的配置(比如:type="JDBC")。
数据源的配置(比如:type="POOLED")。
其中较为陌生的概念大致有如下几条:
事务管理器:https://www.cnblogs.com/yanze/p/10249617.html
数据源:Mybatis 配置官方说明文档
目前只需要记住的就是:
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]")
Mybatis 默认连接方式是 pooled,事务处理器为 JDBC
可以通过这个属性来引用外部配置文件,编写一个配置文件,后续可以按照<code>${属性名}</code>的格式取出
要在 xml 配置文件中使用外部配置文件,只需要使用 properties 标签,并且用 resource 属性指明外部配置文件位置,之后就可以按照规约使用了:
要在构建 SqlSessionFactory 对象的时候直接使用外部配置 properties,而非使用写定在 xml 文件中的 development 环境配置,可以这样:
对于同时使用外部配置文件和 xml 环境配置时的优先级,也就是说如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
首先读取在 properties 元素体内指定的属性(也就是 xml 文件里明文配置的属性)。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 xml 配置,意在减少全限定类名书写。例如:
但我们一般也不会按照上述方法行动,而是直接扫描一个包,包中的所有类都会以首字母小写和大写为别名(引用这些类的时候尽量用小写)。
另外可以使用Alias注解配合使用package来指定别名
Mybatis 也为我们做好了 java 内置的一些基本数据类型的映射,要注意的是带下划线的别名映射的是基本类型,没有下划线的是对象类型:
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
这个链接中的表格指定了各个设置的含义:https://mybatis.org/mybatis-3/zh/configuration.html#settings。挑几个迄今为止有所遇见和使用的进行简单的说明:
cacheEnabled
是否启用缓存。
lazyLoadingEnabled
是否懒加载
useGeneratedKeys
配置自动生成并且返回主键。
参考:https://www.cnblogs.com/nuccch/p/9069644.html
autoMappingBehavior
指定 MyBatis 应如何自动映射列到字段或属性。
autoMappingUnknownColumnBehavior
发现无法映射字段时的行为。
defaultExecutorType
执行器模式,在执行 Batch 类型的语句的时候可以进行相关的配置。
mapUnderscoreToCamelCase
是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。
localCacheScope
缓存相关
callSettersOnNulls
指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这在依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的。
logImpl
指定 MyBatis 所用日志的具体实现,未指定时将自动查找。
配置的值只能从候选项中选择,且大小写敏感。
useActualParamName
允许使用方法签名中的名称作为 SQL 语句参数名称,并且通过<code>#{参数名}</code>获取得到。默认开启,这也是我们不需要在函数签名中使用 @Param 注解,但是仍然可以在 SQL 语句中通过参数名引用参数值的原因所在。
参考:https://blog.csdn.net/qq_15038565/article/details/115414387
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。具体的处理器见这张表:https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers。
这也是 ResultMap 结果集映射实现的依据之处,有非常高的灵活度。
拦截器,很容易让人同 MybatisPlus 中的拦截器联想起来,可以在 SQL 执行前后等其它时刻进行拦截并进行相应修改,MP 对 Mybatis 的部分扩展似乎就是从这里入手的。
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符,或类名和包名等。例如:
方式一:
方式二
这种方式要求映射器接口和映射器文件必须同名,且接口和xml文件必须在同一个包下。
方式三
理解我们之前讨论过的不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder:
一旦创建了 SqlSessionFactory 就不再被需要。
局部变量。
SqlSessionFactory:
可以理解成一个连接池。
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另外一个实例。
所以它的最佳作用域为应用 scope。
最简单的就是使用单例模式或者静态单例模式。
SqlSession
连接到连接池的 session。
需要被开启和及时关闭。
线程不安全,不应该被共享。
最佳作用域为方法代码块。
目前对于日志最迫切的需求就是:在控制台输出映射器中的 SQL 语句。
在配置详解的 settings 中提到了名为 logImpl 的选项,它的候选项目前只有下列几个,且默认是不实现:
SLF4J
LOG4J
LOG4J2
JDK_LOGGING
COMMONS_LOGGING
STDOUT_LOGGING
NO_LOGGING
如果没有特殊的要求(只是简单的控制台观察),可以使用标准日志工厂的实现,不需要额外的配置:

og4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等。
我们也可以控制每一条日志的输出格式。
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
先导入 Log4j 的依赖:
编写配置文件,文件名为 log4j.properties,直接放置在 resources 目录下。
可以直接使用了: