上一节Springboot整合MyBatis(一:MyBatis-Spring-Boot-Starter)讲到了springboot整合Mybatis,通过MyBatis-Spring-Boot-Starter启动器进行整合,其中讲到了一个配置项:config-location,Mybatis的配置文件位置,那么这节就来详细说一下Mybatis的xml配置文件。后面咱们再细说java配置(懂了xml配置,java配置就水到渠成了)。
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
我们的配置文件应尽量的按照这个顺序。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties></properties>
<settings></settings>
<typeAliases></typeAliases>
<typeHandlers></typeHandlers>
<objectFactory></objectFactory>
<plugins></plugins>
<environments>
<environment>
<transactionManager></transactionManager>
<dataSource></dataSource>
</environment>
</environments>
<databaseIdProvider></databaseIdProvider>
<mappers></mappers>
</configuration>
properties配置
properties这中配置想必都清楚:key:value的格式springboot提供有这样格式的配置文件,Springboot的配置可以注入到bean中对应的属性上。那么Mybatis提供的在哪些地方可以用呢?
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
也就是说,通过properties配置的key-value,在整个配置文件中可以通过key来获取value。
比如我们要配置数据源,按照我们习惯,我们都会有一个jdbc.propertis的文件,到时候测试正式上面,我们只需要修改其配置文件即可,那么我们就来测试一下这个properties配置吧!
插曲:这里只是举个例子,使用数据源的配置,mybatis和springboot整合的时候,数据源不能配在这里,因为springboot会自动装配,报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be co:意思是找不到连接数据库的url,如果我们在启动注解是加上@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}),排除了springboot的加载数据源配置,他就会报:Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required,也就是他在自动装配的时候,找不到sqlSessionFactory或者sqlSessionTemplate,可能排除了那个数据源配置类之后,mybatis没有把自己的数据源信息提供给springboot吧,具体原因位置。
反正数据源的配置到springboot配置文件上即可。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/>
<property name="username" value="root"/>
<property name="password" value="root_123"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
</transactionManager>
<dataSource type="POOLED">
<!--这里使用的driver,url,username,password就是通过上面的property赋值的-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="classpath:mapper/*.xml"/>
</mappers>
</configuration>
感觉这样写没啥意义,毕竟都在一个文件,写在上面下面性质差不错,那么他也提供了加载外部文件的属性:
classpath下:
<properties resource="jdbc.properties">
</properties>
网络文件:
<properties url="xxx">
</properties>
也可以在 SqlSessionFactoryBuilder.build() 方法中传入属性值
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
// ... 或者 ...
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
properties的读取顺序:
首先读取在 properties 元素体内指定的属性。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的则是 properties 元素中指定的属性。
从 MyBatis 3.4.2 开始,你可以为占位符指定一个默认值。例如:
<dataSource type="POOLED">
<property name="username" value="${username:root}"/>
<!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'root' -->
</dataSource>
这个特性默认是关闭的。要启用这个特性,需要添加一个特定的属性来开启这个特性。例如:
<properties>
<!-- ... -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
</properties>