1. 程式人生 > >【框架整合】二、Spring資料來源配置及JdbcTemplate配置

【框架整合】二、Spring資料來源配置及JdbcTemplate配置

一、匯入必需包

c3p0-0.9.1.2.jar
commons-dbcp-1.4.jar
commons-pool-1.6.jar
mysql-connector-java-5.1.24.jar

二、 建立jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytestsql
jdbc.username=root
jdbc.password=xiazhang

jdbc.initialPoolSize=1
jdbc.minPoolSize=1
jdbc.maxPoolSize=10
jdbc.autoCommitOnClose=false

jdbc.breakAfterAcquireFailure=false
jdbc.testConnectionOnCheckout=false
jdbc.testConnectionOnCheckin=false
jdbc.idleConnectionTestPeriod=60
jdbc.acquireRetryAttempts=10
jdbc.acquireRetryDelay=1000

後面會詳解每個配置引數的意義

三、 配置datasource

這裡我們使用springContext-datasouce.xml 專門用於資料來源配置檔案

只需在applicationContext.xml匯入此檔案就行

	<!-- 資料來源配置檔案 -->
	<import resource="classpath:applicationContext-datasource.xml"/>
	
	<!-- 引入本地配置檔案 -->
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
			</list>
		</property>
	</bean>



這裡還要引入dbc.properties檔案,當然這個檔案在springContext-datasouce.xml檔案中引入也可以

不過習慣統一放在applicationContext.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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:beans="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                http://www.springframework.org/schema/aop 
                http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
                http://www.springframework.org/schema/tx 
				http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
                http://www.springframework.org/schema/context
                http://www.springframework.org/schema/context/spring-context-4.1.xsd"
                default-lazy-init="true">
              

	<!-- ========================= RESOURCE DEFINITIONS ========================= -->
	<bean id="dataSource" 
		class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		
		<property name="driverClass" value="${jdbc.driverClassName}" />
		<!-- 基本屬性 url、user、password -->
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialPoolSize" value="${jdbc.initialPoolSize}" />
		<property name="minPoolSize" value="${jdbc.minPoolSize}" />
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
		<!-- 連線池在回收資料庫連線時是否自動提交事務。如果為false,則會回滾未提交的事務,如果為true,則會自動提交事務。default : false -->
		<property name="autoCommitOnClose" value="${jdbc.autoCommitOnClose}" />
		<!-- 如果為true,則當連接獲取失敗時自動關閉資料來源,除非重新啟動應用程式。所以一般不用。default : false -->
		<property name="breakAfterAcquireFailure" value="${jdbc.breakAfterAcquireFailure}" />
 		<!-- testConnectionOnCheckout如果設定為true,每次從池中取一個連線,將做一下測試,使用automaticTestTable -->
		<!-- 	或者 preferredTestQuery,做一條查詢語句.看看連線好不好用,不好用,就關閉它,重新從池中拿一個 -->
		<property name="testConnectionOnCheckout" value="${jdbc.testConnectionOnCheckout}" />
		<property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}" />
		<!-- 設定在池中的沒有被使用的連線,是否定時做測試,看看這個連線還可以用嗎 -->
		<property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}" />
		<!-- 連線池在無空閒連線可用時一次性建立的新資料庫連線數,default : 3 -->
		<property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}" />
		<!-- 兩次連線中間隔時間,單位毫秒,連線池在獲得新連線時的間隔時間。default : 1000 單位ms -->
		<property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}" />

	</bean>
<!-- nativeJdbcExtractor,defaultLobHandler 用來處理對clob、 blob資料型進行操作問題 -->
 <!-- nativeJdbcExtractor 和 defaultLobHandler Bean 都設定為 lazy-init="true",
 nativeJdbcExtractor 需要通過執行期的反射機制獲取底層的 JDBC 物件,
 所以需要避免在 Spring 容器啟動時就例項化這兩個Bean。 -->	
	<bean id="nativeJdbcExtractor"
		class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor"
		lazy-init="true" />


	<bean id="defaultLobHandler"
		class="org.springframework.jdbc.support.lob.DefaultLobHandler"
		lazy-init="true" />

						
	<!-- JdbcTemplate 配置開始 -->

	<bean id="jdbcTemplate"
		class="org.springframework.jdbc.core.JdbcTemplate" autowire="byName">
        <constructor-arg><ref bean="dataSource"/></constructor-arg>
	</bean>
	
	<bean id="namedParameterJdbcTemplate"
		class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" autowire="byName">
        <constructor-arg><ref bean="dataSource"/></constructor-arg>
	</bean>
	
	<bean id="simpleJdbcTemplate"
		class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate" autowire="byName">
        <constructor-arg><ref bean="dataSource"/></constructor-arg>
	</bean>
	<!-- JdbcTemplate 配置結束 -->
	
	<!-- 事物配置 開始-->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<!-- 事務管理  宣告式事務-->
 	<tx:annotation-driven transaction-manager="transactionManager" />
	
	<!-- Spring使用 <tx:advice>和 <aop:config> 用來配置事務 -->
	<!-- 通知 -->
<!-- 	<tx:advice id="txAdvice" transaction-manager="transactionManager"> -->
<!-- 		<tx:attributes> -->
			<!-- 傳播行為 -->
<!-- 			<tx:method name="save*" propagation="REQUIRED"/> -->
<!-- 			<tx:method name="insert*" propagation="REQUIRED"/> -->
<!-- 			<tx:method name="update*" propagation="REQUIRED"/> -->
<!-- 			<tx:method name="delete*" propagation="REQUIRED"/> -->
			
<!-- 			<tx:method name="find*" propagation="SUPPORTS" read-only="true"/> -->
<!-- 			<tx:method name="select*" propagation="SUPPORTS" read-only="true"/> -->
<!-- 		</tx:attributes> -->
<!-- 	</tx:advice> -->
	
	<!-- 配置aop -->
<!-- 	<aop:config> -->
<!-- 		<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.wxisme.ssm.service.impl.*.*(..))"/> -->
<!-- 	</aop:config> -->
	<!-- 事物配置 結束-->
	
</beans>

注意這裡
<!-- 事務管理  宣告式事務--><tx:annotation-driven transaction-manager="transactionManager" />
需要引入包  aopalliance-1.0.jar
否則:Caused by: Java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

這裡使用aop強化事物的配置是註釋掉的,
如果要使用 Spring使用 <tx:advice>和 <aop:config> 用來配置事務
除了aopalliance-1.0.jar 還需要額外引入包 aspectjrt.jar,aspectjweaver.jar ,


四、測試一下

現在為了方便還是使用上一篇的Controller

修改如下

package com.mvc.first;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 測試jdbcTemplate
 * 
 * @author xiazhang
 * @date   2017-6-11
 */
@Controller
@RequestMapping(value="/hello")
public class FirstController {

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	private static Log logger = LogFactory.getLog(FirstController.class);
	
    @RequestMapping(value="/world",method=RequestMethod.GET)
    public String hello(Model model,HttpServletRequest request,HttpServletResponse response){
    	response.setCharacterEncoding("UTF-8");
        model.addAttribute("msg", "你好spring mvc");
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select id,classes,dress from my_info");
        if(list != null){
        	for (Map<String, Object> map : list) {
    			logger.info("jdbcTemplate:"+map.get("id")+","+map.get("classes")+","+map.get("dress"));
    		}
        }else{
        	logger.info("查詢結果為空!!!!!!!!!");
        }
        
        return "index";
    }
	
}



執行專案、傳送請求

結果

success