欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年07月13日 15:22:39   作者:DreamMakers  
這篇文章主要介紹了Mybatis配置之<properties>屬性配置元素解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

緊接著上篇博客《Mybatis的配置文件入門介紹》,我們開(kāi)始對(duì)mybatis核心配置文件中的各個(gè)元素進(jìn)行詳細(xì)的說(shuō)明,在這篇文章中,我們首先來(lái)看下<properties>元素,這個(gè)元素從上篇文章中可以看到是最先被解析的,設(shè)置的屬性值將會(huì)被其他元素所使用。

我們先將之前的配置文件在這里拷貝一份,以便對(duì)比觀察,如下所示:

<!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ù)庫(kù)連接池 -->  
            <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>

屬性值有三種方式書(shū)寫(xiě),接下來(lái)我們一個(gè)一個(gè)的看

(1)通過(guò)<properties>元素里面配置<property>元素

之前的配置文件中<dataSource>元素中設(shè)置了數(shù)據(jù)庫(kù)的驅(qū)動(dòng)、連接字符串還有賬號(hào)密碼等信息,但是我們這里不想這么弄,通過(guò)設(shè)置<property>來(lái)進(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ù)庫(kù)連接池 -->
   <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)通過(guò)<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ù)庫(kù)連接池 -->
   <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(相對(duì)于根目錄的路徑)內(nèi)容如下所示:

使用配置文件的方式,可以使得一次配置在多個(gè)地方重復(fù)使用,不需要在不同的項(xiàng)目中CTRL+C和CTRL+V了。

(3)通過(guò)在初始化的時(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 通過(guò)SqlSessionFactory獲取SqlSession, 然后才能通過(guò)SqlSession與數(shù)據(jù)庫(kù)進(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í)候,人為寫(xiě)代碼傳入了一套屬性配置。

上面三種方式都可以實(shí)現(xiàn)相同的功能,那就是給mybatis初始化的時(shí)候設(shè)置一系列的屬性值以供使用。

但是這三者又有什么區(qū)別呢?

通過(guò)查看源碼,一個(gè)直觀的感覺(jué)就是這三種配置是有優(yōu)先級(jí)關(guān)系的且不同方式配置的配置項(xiàng)是可以并存的,優(yōu)先級(jí)次序如下:第三種方式>第二種方式>第一種方式。

即如果三種方式都配置了同一個(gè)配置項(xiàng),那么優(yōu)先級(jí)高的配置方式的配置值生效。

這主要還是因?yàn)閙ybats的源碼解析過(guò)程導(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指定的配置文件開(kāi)始讀取配置,如果之前有了相同的配置項(xiàng)則進(jìn)行覆蓋,如果沒(méi)有則進(jìn)行添加。

在這之后,開(kāi)始判斷是否有第三種方式的屬性配置,如果有,則將相關(guān)配置添加到之前的屬性集合中,如果存在同名的配置也進(jìn)行覆蓋。這樣的邏輯也是導(dǎo)致為什么會(huì)有優(yōu)先級(jí)的直接原因。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java異常處理學(xué)習(xí)心得

    Java異常處理學(xué)習(xí)心得

    本篇文章給大家詳細(xì)講述了學(xué)習(xí)Java異常處理學(xué)習(xí)的心得以及原理介紹,對(duì)此有興趣的朋友參考下吧。
    2018-01-01
  • JDK常用命令jps jinfo jstat的具體說(shuō)明與示例

    JDK常用命令jps jinfo jstat的具體說(shuō)明與示例

    JDK本身提供了很多方便的JVM性能調(diào)優(yōu)監(jiān)控工具,除了集成式的VisualVM和jConsole外,還有jps、jinfo、jstat等小巧的工具,本文章希望能起拋磚引玉之用,讓大家能開(kāi)始對(duì)JVM性能調(diào)優(yōu)的常用工具有所了解
    2021-09-09
  • 解析Java的JVM以及類與對(duì)象的概念

    解析Java的JVM以及類與對(duì)象的概念

    這篇文章主要介紹了解析Java的JVM以及類與對(duì)象的概念,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest

    SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest

    在使用框架日常開(kāi)發(fā)中需要在controller中進(jìn)行一些異步操作減少請(qǐng)求時(shí)間,但是發(fā)現(xiàn)在使用@Anysc注解后會(huì)出現(xiàn)Request對(duì)象無(wú)法獲取的情況,本文就此情況給出完整的解決方案
    2022-04-04
  • MybatisPlus常用依賴、配置、插件方式

    MybatisPlus常用依賴、配置、插件方式

    這篇文章主要介紹了MybatisPlus常用依賴、配置、插件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java page cache回寫(xiě)機(jī)制案例詳解

    Java page cache回寫(xiě)機(jī)制案例詳解

    這篇文章主要介紹了Java page cache回寫(xiě)機(jī)制案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java核心庫(kù)實(shí)現(xiàn)AOP過(guò)程

    Java核心庫(kù)實(shí)現(xiàn)AOP過(guò)程

    給大家分享一下利用Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP的經(jīng)驗(yàn)分享和教學(xué),需要的讀者們參考下吧。
    2017-12-12
  • Java?多線程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過(guò)程

    Java?多線程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過(guò)程

    這篇文章主要介紹了Java?多線程并發(fā)編程提高數(shù)據(jù)處理效率,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java實(shí)現(xiàn)redis分布式鎖的三種方式

    Java實(shí)現(xiàn)redis分布式鎖的三種方式

    本文主要介紹了Java實(shí)現(xiàn)redis分布式鎖的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 關(guān)于springboot集成swagger及knife4j的增強(qiáng)問(wèn)題

    關(guān)于springboot集成swagger及knife4j的增強(qiáng)問(wèn)題

    這篇文章主要介紹了springboot集成swagger以及knife4j的增強(qiáng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論