MyBatis XML配置
1.xml结构概览
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
注意: 必须严格按照顺序编写xml配置, 否则会报错
2.各项配置的基本使用
-
属性(properties )
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。例如:
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
resource: 引入类路径下的properties配置文件
如果在外部配置文件中和properties 元素的子元素中存在同名的元素, 优先使用外部配置文件中的元素值
-
设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
以下是常用的几个设置
设置名 描述 有效值 默认值 cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true|false true useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 true|false False mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true|false False logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J|LOG4J|LOG4J2|JDK_LOGGING|COMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGING 未设置 cacheEnabled
: 一级缓存默认是开启的, 设置二级缓存时建议也显示的设置缓存开启, 尽管默认情况缓存是开启的开启二级缓存, 在SQL 映射文件中添加一行:
<cache/>
也可设置更多属性
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
useGeneratedKeys
: 对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。如下代码, 在设置中开启useGeneratedKeys
设置, 该插入操作, 数据库表中自动生成的主键id值将会返回, 并赋值给实体对象的id属性, 若有多个列会自动生成, 可以指定具体的列名keyColumn=""
<settings> <setting name="useGeneratedKeys" value="true"/> </settings>
<insert id="insert" parameterType="com.ml.pojo.Book" keyProperty="id" keyColumn="id"> insert into book(book_name,price) values(#{book_name},#{price}) </insert>
mapUnderscoreToCamelCase
: 是否开启驼峰命名自动映射, 数据库中常见列名存在下划线, 例如book_name, 此时如果要将该列映射到实体类中, 那么实体类属性值就需命名为book_name, 但是java中常见属性命名为bookName, 这与常规不符, 此时开启驼峰命名自动映射可以使数据库中以下划线命名的列直接映射到常见java属性上, 也就是book_name可以直接映射到bookNamelogImpl
: 配置日志-
第一步: 导入maven依赖
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
第二步:
log4j.properties
配置文件# 全局日志配置 log4j.rootLogger=ERROR, stdout # MyBatis 日志配置 log4j.logger.org.mybatis.example.BlogMapper=TRACE # 控制台输出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
上述配置将使 Log4J 详细打印
org.mybatis.example.BlogMapper
的日志 -
类型别名(typeAliases)
类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:
<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
的地方。也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:
<typeAliases> <package name="domain.blog"/> </typeAliases>
每一个在包
domain.blog
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。 比如domain.blog.Author
的别名为author
;若有注解,则别名为其注解值。见下面的例子:@Alias("author") public class Author { ... }
-
映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括
file:///
形式的 URL),或类名和包名等。例如:<!-- 使用相对于类路径的资源引用 --> <!-- 建议使用 --> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
<!-- 使用完全限定资源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers>
<!-- 使用映射器接口实现类的完全限定类名 --> 注意: 使用这种方法mapper接口和映射文件需要在同一目录下 <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 --> 注意: 使用这种方法mapper接口和映射文件需要在同一目录下 <mappers> <package name="org.mybatis.builder"/> </mappers>
这些配置会告诉 MyBatis 去哪里找映射文件
-