Mybatis配置之<properties>属性配置元素解析

紧接着上篇博客《Mybatis的配置文件入门介绍》,我们开始对mybatis核心配置文件中的各个元素进行详细的说明,在这篇文章中,我们首先来看下<properties>元素,这个元素从上篇文章中可以看到是最先被解析的,设置的属性值将会被其他元素所使用。

我们先将之前的配置文件在这里拷贝一份,以便对比观察,如下所示:

<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>  

    <settings>
        <setting name="logImpl" value="LOG4J" />
    </settings>  

    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>  

    <mappers>
        <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />
    </mappers>
</configuration>

属性值有三种方式书写,接下来我们一个一个的看

(1)通过<properties>元素里面配置<property>元素

之前的配置文件中<dataSource>元素中设置了数据库的驱动、连接字符串还有账号密码等信息,但是我们这里不想这么弄,通过设置<property>来进行设置,如下所示:

<?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="username" value="root"/>
  <property name="password" value="root"/>
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
 </properties>

 <settings>
  <setting name="logImpl" value="LOG4J" />
 </settings>

 <!-- 和spring整合后 environments配置将废除 -->
 <environments default="development">
  <environment id="development">
   <!-- 使用jdbc事务管理 -->
   <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>

 <mappers>
  <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />
 </mappers>

</configuration>

这样,我们就在需要配置的地方统一到了<properties>元素中,便于统一管理。

(2)通过<properties>元素的resource属性或者url属性进行配置

这里我们不用<property>标签元素进行设置,而是使用属性配置文件的方式。如下所示:

<?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 resource="mysql.properties">
 </properties>

 <settings>
  <setting name="logImpl" value="LOG4J" />
 </settings>

 <!-- 和spring整合后 environments配置将废除 -->
 <environments default="development">
  <environment id="development">
   <!-- 使用jdbc事务管理 -->
   <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>

 <mappers>
  <mapper resource="com\majing\learning\mybatis\dao\UserDaoMapper.xml" />
 </mappers>

</configuration>

而<properties>标签元素的resource属性设置的mysql.properties(相对于根目录的路径)内容如下所示:

使用配置文件的方式,可以使得一次配置在多个地方重复使用,不需要在不同的项目中CTRL+C和CTRL+V了。

(3)通过在初始化的时候,以代码的方式传入Properties类实例

具体如下所示:

package com.majing.learning.mybatis;
import java.io.IOException;
import java.util.Properties;
import junit.framework.TestCase;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.majing.learning.mybatis.dao.UserDao;
import com.majing.learning.mybatis.entity.User;
public class UserDaoTest1 extends TestCase{

	@Test
	public void testFindUserById(){
		SqlSession sqlSession = getSessionFactory().openSession(true);
		UserDao userMapper = sqlSession.getMapper(UserDao.class);  

		User user = userMapper.findUserById(10);
		System.out.println("记录为:"+user);
	}

	// Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与数据库进行交互
	private static SqlSessionFactory getSessionFactory() {
		SqlSessionFactory sessionFactory = null;
		String resource = "configuration.xml";
		try {
			sessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resource), buildInitProperties());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return sessionFactory;
	}

	private static Properties buildInitProperties(){
		Properties properties = new Properties();
		properties.put("driver", "com.mysql.jdbc.Driver");
		properties.put("url", "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8");
		properties.put("username", "root");
		properties.put("password", "root");
		return properties;
	}
}

从上可以看出,在创建SqlSessionFactory的时候,人为写代码传入了一套属性配置。

上面三种方式都可以实现相同的功能,那就是给mybatis初始化的时候设置一系列的属性值以供使用。

但是这三者又有什么区别呢?

通过查看源码,一个直观的感觉就是这三种配置是有优先级关系的且不同方式配置的配置项是可以并存的,优先级次序如下:第三种方式>第二种方式>第一种方式。

即如果三种方式都配置了同一个配置项,那么优先级高的配置方式的配置值生效。

这主要还是因为mybats的源码解析过程导致的。

下面我们看下具体的解析逻辑:

 private void propertiesElement(XNode context) throws Exception {
    if (context != null) {
      Properties defaults = context.getChildrenAsProperties();
      String resource = context.getStringAttribute("resource");
      String url = context.getStringAttribute("url");
      if (resource != null && url != null) {
        throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference.  Please specify one or the other.");
      }
      if (resource != null) {
        defaults.putAll(Resources.getResourceAsProperties(resource));
      } else if (url != null) {
        defaults.putAll(Resources.getUrlAsProperties(url));
      }
      Properties vars = configuration.getVariables();
      if (vars != null) {
        defaults.putAll(vars);
      }
      parser.setVariables(defaults);
      configuration.setVariables(defaults);
    }
  }

从代码看,<properties>元素的resource属性和url属性是不能同时设置的,否则会报异常。

同时,解析的时候是先解析的<property>标签元素,而后从resource或者url指定的配置文件开始读取配置,如果之前有了相同的配置项则进行覆盖,如果没有则进行添加。

在这之后,开始判断是否有第三种方式的属性配置,如果有,则将相关配置添加到之前的属性集合中,如果存在同名的配置也进行覆盖。这样的逻辑也是导致为什么会有优先级的直接原因。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)--MyBatis原始Dao开发和mapper代理开发 MyBatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) setting(全局配置参数) typeAliases(类名别名) typeHandlers(类名处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) environment(环境子属性

  • MyBatis中的properties配置(推荐)

    这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递.例如: <properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password&quo

  • Mybatis主配置文件的properties标签详解

    我们配置MYSQL的连接池时可以直接写,也可以从外部导入配置文件. 1.直接在dataSource中写数据库基本信息 <dataSource type="POOLED"> <!-- 配置连接数据库的4个基本信息 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value=&

  • MyBatis Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

  • Mybatis配置之<properties>属性配置元素解析

    紧接着上篇博客<Mybatis的配置文件入门介绍>,我们开始对mybatis核心配置文件中的各个元素进行详细的说明,在这篇文章中,我们首先来看下<properties>元素,这个元素从上篇文章中可以看到是最先被解析的,设置的属性值将会被其他元素所使用. 我们先将之前的配置文件在这里拷贝一份,以便对比观察,如下所示: <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" &qu

  • Mybatis配置之<typeAliases>别名配置元素解析

    在前面的文章<Mybatis配置之<properties>属性配置元素详述>,我们讲述了<properties>标签元素的配置和使用方法. 在这篇文章中,我们来说说<typeAliases>标签元素,这个元素主要是用于对类型进行别名控制,具体什么意思呢?我们下面用一个示例说明,看了之后我相信你就会明白了. 这里我们贴出之前的UserDao对应的mapper文件 如下所示: <?xml version="1.0" encoding=&

  • 浅谈Spring Boot 属性配置和自定义属性配置

    在使用spring boot过程中,可以发现项目中只需要极少的配置就能完成相应的功能,这归功于spring boot中的模块化配置,在pom.xml中依赖的每个Starter都有默认配置,而这些默认配置足以满足正常的功能开发. 如果需要修改自定义修改默认配置,spring boot 提供了很简便的方法,只需要在application.properties 中添加修改相应的配置.(spring boot启动的时候会读取application.properties这份默认配置) 一.修改默认配置 例

  • Mybatis配置之properties和settings标签的用法

    Mybatis properties标签和settings标签 本次将讲述mybatis的配置,主要的配置是基于mybatis的配置文件来进行配置的,其配置文件并不复杂 如下面的例子: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://my

  • Java的MyBatis框架中Mapper映射配置的使用及原理解析

    Mapper的内置方法 model层就是实体类,对应数据库的表.controller层是Servlet,主要是负责业务模块流程的控制,调用service接口的方法,在struts2就是Action.Service层主要做逻辑判断,Dao层是数据访问层,与数据库进行对接.至于Mapper是mybtis框架的映射用到,mapper映射文件在dao层用. 下面是介绍一下Mapper的内置方法: 1.countByExample ===>根据条件查询数量 int countByExample(UserE

  • Spring中Xml属性配置的解析全过程记录

    1 工程概述 1.1 pom文件 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring.ver

  • java加载属性配置properties文件的方法

    什么是properties文件 属性配置文件,后缀名为 .properties 文件中严格按照key=value进行数据参数的填写 中文参数值需要转为Unicode编码 不区分基本数据类型 一个编辑好的aaa.properties文件如下图所示 username=root flag=true xm =\u4f60\u597d age=18 为什么要使用properties文件 设想这么一种场景,当你项目发布上线后,比如连接mysql数据库的端口号需要调整,难道需要重写改代码,打包,发布么?对于一

  • Mybatis 创建方法、全局配置教程详解

    总体介绍:MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 和数据库打交道的技术有: 原生的JDBC技术--->Spring的JdbcTemplate技术 这些工具都是提供简单的SQL语句的执行,但是和我们这里学的MyBatis框架还有些不同, 框架是一整套的东西,例如事务控制,查询缓存,字段映射等等. 我们用原生JDBC操作数据库的时候都会经过: 编写sql---->预编译---->设置参数----->执行sql------->

  • spring 和 spring boot 中的属性配置方式

    目录 在xml中注册属性文件 多个 通过java注解方式注册属性文件 使用及注入属性 属性搜索优先级 spring boot 属性加载 application.properties – 缺省属性文件 特定环境属性文件 特定测试属性文件 @TestPropertySource注解 层次属性 YAML 文件 命令行传入属性 环境变量属性 随机属性值 其他类型的属性源 spring配置实现 多层级上下文中属性加载 属性文件通过定义xml中 属性文件通过@PropertySource定义在java中 总

随机推荐