MyBatis配置文件中有很多配置項,這些配置項分別代表什么,有什么作用,需要理一下了。先通過下面這個例子來看都有哪些配置項
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <!-- mybatis的基本配置文件:主要配置基本的上下文參數和運行環境 --> 6 <configuration> 7 <!--配置--> 8 <properties></properties> 9 <!--設置 --> 10 <settings></settings> 11 <!--類型命名 --> 12 <!--別名:pojo對象的別名 --> 13 <typeAliases> 14 <typeAlias alias="user" type="com.daily.pojo.User"></typeAlias> 15 <typeAlias alias="product" type="com.daily.pojo.Product"></typeAlias> 16 </typeAliases> 17 <!--類型處理器 --> 18 <typeHandlers></typeHandlers> 19 <!--對象工廠 --> 20 <objectFactory></objectFactory> 21 <!--插件 --> 22 <plugins></plugins> 23 <!-- 環境模式:development開發模式 work工作模式 --> 24 <environments default="development"> 25 <!--環境變量 --> 26 <environment id="development"> 27 <!--事務管理器 --> 28 <transactionManager type="JDBC" /> 29 <!--數據源 --> 30 <dataSource type="POOLED"> 31 <property name="driver" value="${db.driver}" /> 32 <property name="url" value="${db.url}" /> 33 <property name="username" value="${db.username}" /> 34 <property name="password" value="${db.pwd}" /> 35 </dataSource> 36 </environment> 37 </environments> 38 <!--數據庫廠商標示 --> 39 <databaseIdProvider></databaseIdProvider> 40 <!-- 映射器 --> 41 <mappers> 42 <mapper resource="com/daily/mapper/UserMapper.xml" /> 43 <mapper resource="com/daily/mapper/ProductMapper.xml" /> 44 </mappers> 45 </configuration>
以上就是所有的配置項,需要注意的是配置項的順序不能顛倒,如果顛倒了它們的順序,在MyBatis的自啟動階段會發生異常,導致程序無法運行。我會一個一個配置地做一下分析和記錄,為了避免文章太長導致日后復習或別人閱讀時產生疲勞,我決定一個配置項分一篇的方式進行記錄。今天先分析一下第一個配置項properties。
首先properties的使用方式有三種:
1⃣️property子元素:就是在properties屬性中增加子屬性property,從而設置一些配置的key-value;
2⃣️properties文件:就是直接使用properties引入外部配置文件,相當於將子屬性抽取成一個獨立的外部文件引入;
3⃣️程序代碼傳遞參數:就是通過代碼的方式設置該配置相關的信息,如數據庫配置文件中的用戶名和密碼一般是密文,但是連接數據庫時需要對配置進行解密,此時就只能通過程序代碼的方式配置了;
下面以數據庫配置為例,來實現這三種不同的配置方式:
⚠️注意:因為是單獨介紹,所以這里顯示properties的配置,不顯示其他配置項
一、property子元素
1 <properties> 2 <property name="db.driver" value="org.postgresql.Driver"></property> 3 <property name="db.url" value="jdbc:postgresql://localhost:5433/postgres"></property> 4 <property name="db.username" value="postgres"></property> 5 <property name="db.pwd" value="postgres"></property> 6 </properties>
這種配置方式的缺點是,如果配置項很多,那么就會讓配置文件顯得很龐大,為了解決這個缺點,我們可以使用下面的配置方式👇
二、properties文件
首先將上述配置中的所有property屬性提取到一個叫做db.properties的配置文件中,如下圖所示:
1 #postgresql 2 db.driver=org.postgresql.Driver 3 db.url=jdbc:postgresql://localhost:5433/postgres 4 db.username=cG9zdGdyZXM= 5 db.pwd=aHljMTIz
然后將該文件引入MyBatis配置文件
1 <properties resource="db.properties" />
這樣就相當於將db.properties中的所有配置都加載到MyBatis的配置文件中了,但是這種使用方式也存在它的缺點,當外部配置文件中的值需要加密時,如連接數據庫的用戶名和密碼,無法在配置文件中進行解密,所以只能通過程序代碼傳遞的方式,就是要介紹的第三種,如下👇
三、程序代碼方式傳遞參數
其實這種方式一般會和第二種配合使用,作用對特殊配置進行覆蓋或重寫,以上面的db.properties為例,在使用到數據庫配置信息時對配置中的用戶名和密碼進行解密。這里舉個MyBatis中獲取SqlSessionFactory的例子:
1 public static SqlSessionFactory getSqlSessionFactoryByXml() { 2 synchronized (Lock) { 3 if (null != sqlSessionFactory) { 4 return sqlSessionFactory; 5 } 6 String resource = "mybatis-config.xml"; 7 InputStream inputStream; 8 InputStream is = null; 9 try { 10 // 加載數據庫配置文件 11 is = Resources.getResourceAsStream("db.properties"); 12 Properties properties = new Properties(); 13 properties.load(is); 14 15 // 獲取加密信息 16 String userName = properties.getProperty("db.username"); 17 String pwd = properties.getProperty("db.pwd"); 18 19 // 解密用戶名和密碼,並重置屬性 20 properties.setProperty("db.username", CyperTool.decodeByBase64(userName)); 21 properties.setProperty("db.pwd", CyperTool.decodeByBase64(pwd)); 22 // 讀取mybatis配置文件 23 inputStream = Resources.getResourceAsStream(resource); 24 // 通過SqlSessionFactoryBuilder類的builder方法進行構建,並使用程序傳遞的方式覆蓋原有屬性 25 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties); 26 } catch (IOException e) { 27 e.printStackTrace(); 28 return null; 29 } 30 return sqlSessionFactory; 31 } 32 }
上面的代碼中:
1⃣️11~13行是加載數據庫配置文件
2⃣️16、17行是獲取加密配置
3⃣️20、21行是解密數據並重新設置到配置文件中
4⃣️25行通過傳遞配置文件完成重寫
以上就是properties屬性的所有內容,一般來說如果不加密,會使用第二種方式,這樣降低維護的耦合性,如果有加密信息,則使用第三種。