目錄
一般java代碼編譯生成jar文件後,一般不能進行修改,我們寫代碼的時候往往會有數據庫配置,如果放在java代碼中就寫死了,如果數據庫變動的話就不方便修改還得找到java代碼,重新編譯。
我們一般做法把需要修改的部分變成配置文件方式就在外部,然後用java導入該配置文件讀取數據即可。
一、知識點
- 在配置文件裏配置 Bean 時, 有時需要在 Bean 的配置裏混入系統部署的細節信息(例如: 文件路徑, 數據源配置信息等). 而這些部署細節實際上需要和 Bean 配置相分離
- Spring 提供了一個 PropertyPlaceholderConfigurer 的 BeanFactory 後置處理器, 這個處理器允許用戶將 Bean 配置的部分內容外移到屬性文件中. 可以在 Bean 配置文件裏使用形式爲 ${var} 的變量, PropertyPlaceholderConfigurer 從屬性文件里加載屬性, 並使用這些屬性來替換變量.
- Spring 還允許在屬性文件中使用 ${propName},以實現屬性之間的相互引用。
二、配置例子
2.1 配置一個數據庫連接文件
配置一個數據庫連接,需要的jar包爲
2.1.1 下載c3p0
c3p0: https://mvnrepository.com/artifact/com.mchange/c3p0
下面那個是舊版本,2007年就不更新了,點進去可以看到提示已經移到了C3p0了
點上面也會進入c3p0界面,目前最新版本爲0.9.5.5
直接把jar包下載下來就行了
2.1.2 下載 mysql-connector-java
mysql-connector-java可以直接打開mysql官網的Connector/j windos下載頁面。它提供的是目前mysql的最新版本8.0.20
點“No thanks, just start my download.”即會彈出下載對話框
下載了zip包,我們只需要把裏裏面的“mysql-connector-java-8.0.20.jar”文件複製出來,先放着,其它不要,後面會用到。
也可以去maven倉庫搜索“mysql-connector-java”找到“MySQL Connector/J”並點擊,
裏面有很多版本,有8.0.x有6.0.x有5.0.x
這裏做解釋一下:
8.0.x:只適合mysql8.0系列
6.0.x:只適合mysql6系列
5.0.x:只適合mysql5系列。
這裏選擇8.0.20 就行了
2.1.3 下載 mchange-commons-java
弄c3p0還需要下載多一個包 mchange-commons-java,我這裏直接去maven下載,目前最新版本爲0.2.20
ps:如果不下載 mchange-commons-java.jar包的話,會報如下錯誤:
nested exception is java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector
2.1.4 複製jar包到項目的lib中
把上面的 mysql-connector-java-8.0.20.ja 、 c3p0-0.9.5.5.jar、mchange-commons-java-0.2.20.jar 複製到項目下的lib目錄中,如下圖所示:
從上圖中看到紅框前面都沒有白色小三角,說明是沒有解壓讀取的,需要配置一下idea添加一下jar包就行了
爲了方便我也添加一個lib組
重新看項目下lib目錄的2個jar包,發現已經被識別出來了
2.1.5 安裝mysql數據庫
爲了方便我直接安裝phpStudy,如果不懂怎麼安裝可以看我的文章《hualinux java 1.6:idea連接mysql8進行數據查詢》
再建立一個用戶名和密碼,我這裏還建立一個空的數據庫爲hua
2.2 創建xml配置
src右擊-->new-->XML Configuration File-->Spring config-->輸入名字“beans-properties”
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/hua?serverTimezone=GMT%2B8"/>
</bean>
注:上面的配置mysql一定要安裝,並且運行,用戶名和密碼正確,纔可以
phpStudy數據庫不指定時區的,所以我指定了一下
src-->com.hualinux.beans.properties.Main.java
package com.hualinux.beans.properties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.sql.DataSource;
import java.sql.SQLException;
public class Main {
public static void main(String[] args) throws SQLException {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-properties.xml");
DataSource dataSource= (DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getConnection());
}
運行結果爲:
com.mchange.v2.c3p0.impl.NewProxyConnection@7b4c50bc [wrapping: com.mysql.cj.jdbc.ConnectionImpl@5884a914]
2.2 使用外部屬性文件
上面bean中配置了數據庫的連接,但這些基本信息最好還是把它拿出來放在基礎配置文件中
Spring 提供了一個 PropertyPlaceholderConfigurer 的 BeanFactory 後置處理器, 這個處理器允許用戶將 Bean 配置的部分內容外移到屬性文件中. 可以在 Bean 配置文件裏使用形式爲 ${var} 的變量, PropertyPlaceholderConfigurer 從屬性文件里加載屬性, 並使用這些屬性來替換變量.
src-->new-->file-->db.yml
user: root
password: root
driverClass: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://127.0.0.1:3306/hua?serverTimezone=GMT%2B8
PS:yaml格式冒號後面一定要有空格,有興趣的可以看一下《YAML 語言教程》
beans-properties.xml配置文件修改如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 導入屬性文件-->
<context:property-placeholder location="db.yml" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
</bean>
<!-- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/hua?serverTimezone=GMT%2B8"/>
</bean>-->
</beans>
com.hualinux.beans.properties.Main.java代碼不如,運行一下,結果爲:
com.mchange.v2.c3p0.impl.NewProxyConnection@45efd90f [wrapping: com.mysql.cj.jdbc.ConnectionImpl@4b8729ff]