配置解析
MyBatis 的配置文件影响 MyBatis 行为的设置和属性信息。
0. 概览
配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
配置文件的顺序也是一定的, 不能擅自改变每一项的先后, 否则会报错:
正确的顺序如上图所示
我们只初步了解 properties(属性), settings(设置), typeAliases(类型别名), environments(环境配置), mappers(映射器)
1. properties(属性)
属性可以在外部进行配置,并可以进行动态替换。既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
1.1 在 .properties
文件中配置:
配置完成后在 mybatis-config.xml
文件中引入:
1.2 或者在 properties 元素的子元素中直接设置:
这样就可以在 environments 中直接引用了:
引用需要使用${}
1.3 关于同时使用 .properties
文件 和 properties 子元素时的优先级问题:
- 同时使用时, 子元素的优先级最低
- 在properties元素体内指定的属性首先被读取
- 根据properties元素中的resource属性读取类路径下的属性文件(或根据url属性指定的路径读取属性文件),并覆盖已读取的同名属性。
因此推荐只使用 .properties
文件, 如果混用容易导致管理的混乱
2. settings(设置)
settings会改变 MyBatis 的运行时行为。
这里只看 logImpl 这一项设置中的 LOG4J 和 STDOUT_LOGGING, 即日志设置
2.1 STDOUT_LOGGING是标准日志, 直接添加下面的语句即可使用:
注意 setting 中的值不能有任何错误, 否则不能运行
成功设置日志后, 会在控制台输出更多信息:
对比没有日志的情况:
2.2 LOG4J 是Apache的一个开源项目,可以控制日志信息输送的目的地是控制台、文件、GUI组件,套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别控制日志的生成过程。这些均可以通过一个配置文件来灵活地进行配置,不需要修改应用的代码。
使用下面的语句:
同时需要在Maven中添加依赖的jar包:
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
再在resources 文件夹下 创建一个名为 log4j.properties
的配置文件:
该文件的配置可以参考如下:
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/wbl.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
之后运行测试代码即可在控制台看见日志:
同时也可以将日志输出为文件:
3. typeAliases(类型别名)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
3.1 指定一个包名com.ctgu.pojo
, MyBatis 会在包名下面搜索需要的 Java Bean
每一个在包 com.ctgu.pojo
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如 com.ctgu.pojo.user
的别名为 user
;若有注解,则别名为其注解值(username)。见下面的例子:
@Alias("username")
public class user {
...
}
配置完成后, 可以在之后的xml文件中缩写:
而不用写全名: com.ctgu.pojo.user
3.2 或者直接写:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
当这样配置时,Blog
可以用在任何使用 domain.blog.Blog
的地方。
4. environments(环境配置)
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中.
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。
- 每个数据库对应一个 SqlSessionFactory 实例
environments 元素定义了如何配置环境。
<environments default="development2">
<environment id="development1">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="development2">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
上面的代码配置了两套环境, 但是使用的是第二套 id = development2
的环境
具体的一套环境,通过设置id进行区别,id保证是唯一的
注意一些关键点:
- 默认使用的环境 ID(比如:default="development")。
- 每个 environment 元素定义的环境 ID(比如:id="development")。
- 事务管理器的配置(比如:type="JDBC")。
- 数据源的配置(比如:type="POOLED")。
5. mappers(映射器)
定义 SQL 映射语句。 首先,需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 可以使用相对于类路径的资源引用,或类名和包名等。