spring學習之三 數據庫操做jdbcTemplate

概念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("在這裏添加一個用戶");
        }
}
相關文章
相關標籤/搜索