概念mysql
jdbcTemplate就Spring對數據庫持久化技術的實現,經過它能夠對數據庫進行CRUD等操做。spring
JDBCTemplate和代碼實現sql
public void jdbcadd() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); //加載數據庫驅動 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///dbname"); dataSource.setUsername("root"); dataSource.setPassword("123"); //設置數據源 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "insert into user values(?,?)"; jdbcTemplate.update(sql,"blue", 123); } }
底層JDBC實現代碼數據庫
public void jdbcimpl() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql:///dbname", "root", "123"); String sql = "select * from user WHERE name=?"; ps = conn.prepareStatement(sql); ps.setString(1, "blueto"); rs = ps.executeQuery(); //執行 while (rs.next()) { String name = rs.getString("username"); User user = new User(); user.setName(name); } } catch (Exception e) { e.printStackTrace(); } }
spring 鏈接池配置express
c3p0的鏈接池代碼是怎麼樣實現的呢?紅色部分爲與前面第一種方式不一樣的部分框架
public void c3p0impl(){ ComboPooledDataSource dataSource = new ComboPooledDataSource(); //加載數據庫驅動 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql:///dbname"); dataSource.setUser("root"); dataSource.setPassword("123"); //設置數據源 JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "insert into user values(?,?)"; jdbcTemplate.update(sql, "blue", 123); }
實際的spring項目開發中,是不會像前面那樣建立數據庫鏈接conn再去請求執行sql語句的,而是在配置文件中配置好鏈接池。url
從代碼的實現步驟來看,能夠總結 出鏈接池的執行步驟:spa
第一步 建立鏈接池的ComboPooledDataSource 對象hibernate
第二步 將數據庫的驅動,url,用戶,密碼做爲屬性注入到Datasource對象中code
好了,如今再按上面的步驟在配置文件中配置就能夠了,如今應該明白別人那樣配置了吧,配置文件可寫成這樣
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id = "dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///dbname"></property> <property name="user" value="root"></property> <property name="password" value="123"></property> </bean> </beans>
注意:若是新建一個userDao類去訪問數據庫的話,因爲在訪問時須要jdbcTemplate對象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
因此,還須要在配置文件中把建立jdbcTemplate的對象配置配好,並注入dataSource屬性。
數據庫的事務管理
spring 爲不一樣的持久化框架提供了不一樣的事務管理器的接口,共有如下幾種類型
1)org.springframework.jdbc.datasource.DataSourceTransactionManager -- 用spring jdbc或ibatis進行持久化時用
2)org.springframework.orm.hibernate5.HibernateTransactionManager --用於hibernate5版本
3)org.springframework.orm.jpa.jpaTransactionManager --用於jpa持久化
4)org.springframework.transaction.jta.jtaTransactionManager --JTA管理事務時,在一個事務跨越多個資源時必須使用
在進行數據庫修改操做時,常常被談及到事務這個概念,那什麼叫事務呢?事務就是指一系列的數據庫操做的組合,單次對數據表的增刪改查爲一次操做,只有事務中全部的操做指令所有執行成功,事務纔算成功,不然就算失敗;若是事務失敗,則在事務中已經成功的操做,通通執行回滾操做至事務執行前的狀態。
爲何事務失敗須要回滾,就拿舉例最多的銀行轉賬事件來做爲例子吧。
在轉賬過程當中,A向B轉1000元,首先系統從賬戶表裏用戶A的account裏的錢減去1000元,再給B的account里加上1000元,至此整個轉賬事務成功。可是在A的account裏減去1000成功後,在往B賬號裏執行增長1000元的操做時,系統異常退出了,你會發現,A的錢扣了,可是B卻沒有增長,爲了保證數據的一致性,必須將恢復到扣錢前的狀態,這就是回滾。事務與回滾就是爲了保證數據的一致性。
在spring中,使用AOP的技術將事務管理切入到對數據庫操做的dao層方法中,就將dao層中的方法用事務管理起來,若是在dao層中方法一旦有異常拋出,事務會自動讓數據庫進行回滾操做。配置文件參見以下
<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///dbname"></property> <property name="user" value="root"></property> <property name="password" value="123"></property> </bean> <!--第一步 配置事務管理--> <bean id="transactionMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--第二步 配置事務加強,使用AOP技術將事務管理添加到dao層--> <tx:advice id="txadvice" transaction-manager="transactionMgr"> <tx:attributes> <!--name 表達式表示 全部save開頭的方法須要事務操做; propagation 表示隔離級別--> <tx:method name="save*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <!--第三步 配置切面--> <aop:config> <aop:pointcut id="pointcutdb" expression="execution(* com.blueto.*(..))"/> <!--切面--> <aop:advisor advice-ref="txadvice" pointcut-ref="pointcutdb"/> </aop:config> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
--註解方式添加事務管理
相對於上一種方式,註解方式要簡單一些,在配置文件中只須要兩步
<?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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///dbname"></property> <property name="user" value="root"></property> <property name="password" value="123"></property> </bean> <!--第一步 配置事務管理--> <bean id="transactionMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--第二步 開戶事務註解--> <tx:annotation-driven transaction-manager="transactionMgr"/> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
在須要使用事務管理的方法所在類前,添加上註解@Transtional便可。
@Transactional public class UserDao { public void add() { System.out.print("在這裏添加一個用戶"); } }