Mybatis配置之<properties>屬性配置元素解析
緊接著上篇博客《Mybatis的配置文件入門介紹》,我們開始對mybatis核心配置文件中的各個(gè)元素進(jìn)行詳細(xì)的說明,在這篇文章中,我們首先來看下<properties>元素,這個(gè)元素從上篇文章中可以看到是最先被解析的,設(shè)置的屬性值將會(huì)被其他元素所使用。
我們先將之前的配置文件在這里拷貝一份,以便對比觀察,如下所示:
<!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事務(wù)管理 -->
<transactionManager type="JDBC" />
<!-- 數(shù)據(jù)庫連接池 -->
<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>
屬性值有三種方式書寫,接下來我們一個(gè)一個(gè)的看
(1)通過<properties>元素里面配置<property>元素
之前的配置文件中<dataSource>元素中設(shè)置了數(shù)據(jù)庫的驅(qū)動(dòng)、連接字符串還有賬號(hào)密碼等信息,但是我們這里不想這么弄,通過設(shè)置<property>來進(jìn)行設(shè)置,如下所示:
<?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事務(wù)管理 -->
<transactionManager type="JDBC" />
<!-- 數(shù)據(jù)庫連接池 -->
<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>
這樣,我們就在需要配置的地方統(tǒng)一到了<properties>元素中,便于統(tǒng)一管理。
(2)通過<properties>元素的resource屬性或者url屬性進(jìn)行配置
這里我們不用<property>標(biāo)簽元素進(jìn)行設(shè)置,而是使用屬性配置文件的方式。如下所示:
<?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事務(wù)管理 -->
<transactionManager type="JDBC" />
<!-- 數(shù)據(jù)庫連接池 -->
<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>標(biāo)簽元素的resource屬性設(shè)置的mysql.properties(相對于根目錄的路徑)內(nèi)容如下所示:

使用配置文件的方式,可以使得一次配置在多個(gè)地方重復(fù)使用,不需要在不同的項(xiàng)目中CTRL+C和CTRL+V了。
(3)通過在初始化的時(shí)候,以代碼的方式傳入Properties類實(shí)例
具體如下所示:
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與數(shù)據(jù)庫進(jìn)行交互
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;
}
}
從上可以看出,在創(chuàng)建SqlSessionFactory的時(shí)候,人為寫代碼傳入了一套屬性配置。
上面三種方式都可以實(shí)現(xiàn)相同的功能,那就是給mybatis初始化的時(shí)候設(shè)置一系列的屬性值以供使用。
但是這三者又有什么區(qū)別呢?
通過查看源碼,一個(gè)直觀的感覺就是這三種配置是有優(yōu)先級關(guān)系的且不同方式配置的配置項(xiàng)是可以并存的,優(yōu)先級次序如下:第三種方式>第二種方式>第一種方式。
即如果三種方式都配置了同一個(gè)配置項(xiàng),那么優(yōu)先級高的配置方式的配置值生效。
這主要還是因?yàn)閙ybats的源碼解析過程導(dǎo)致的。
下面我們看下具體的解析邏輯:
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屬性是不能同時(shí)設(shè)置的,否則會(huì)報(bào)異常。
同時(shí),解析的時(shí)候是先解析的<property>標(biāo)簽元素,而后從resource或者url指定的配置文件開始讀取配置,如果之前有了相同的配置項(xiàng)則進(jìn)行覆蓋,如果沒有則進(jìn)行添加。
在這之后,開始判斷是否有第三種方式的屬性配置,如果有,則將相關(guān)配置添加到之前的屬性集合中,如果存在同名的配置也進(jìn)行覆蓋。這樣的邏輯也是導(dǎo)致為什么會(huì)有優(yōu)先級的直接原因。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中執(zhí)行docker命令的實(shí)現(xiàn)示例
本文主要介紹了Java中執(zhí)行docker命令的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08
Mybatisplus多表關(guān)聯(lián)分頁查詢多種實(shí)現(xiàn)方式
本文主要介紹了Mybatisplus多表關(guān)聯(lián)分頁查詢多種實(shí)現(xiàn)方式,包括使用XML自定義SQL、Wrapper搭配自定義SQL、使用DTO與自定義SQL及結(jié)合PageHelper實(shí)現(xiàn)分頁查詢,感興趣的可以了解一下2025-03-03
快速入門介紹Java中強(qiáng)大的String.format()
這篇文章主要給大家介紹了如何快速入門介紹Java中強(qiáng)大的String.format()的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
Java springboot接口迅速上手,帶你半小時(shí)極速入門
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)API接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09
基于Spring Boot保護(hù)Web應(yīng)用程序
這篇文章主要介紹了基于Spring Boot保護(hù)Web應(yīng)用程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
JAVA中String類與StringBuffer類的區(qū)別
這篇文章主要為大家詳細(xì)介紹了JAVA中String類與StringBuffer類的區(qū)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Spring整合WebSocket應(yīng)用示例(上)
以下教程是小編在參與開發(fā)公司的一個(gè)crm系統(tǒng),整理些相關(guān)資料,在該系統(tǒng)中有很多消息推送功能,在其中用到了websocket技術(shù)。下面小編整理分享到腳本之家平臺(tái)供大家參考2016-04-04

