Springboot整合MyBatis(二:Mybatis的xml配配置文件,详细配置之properties配置)

上一节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>

猜你喜欢

转载自blog.csdn.net/qq_42154259/article/details/106962376