<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

       :: 首頁 ::  :: 聯系 :: 聚合  :: 管理

    五、Spring 持久層

    對于不同的數據庫技術,某些步驟是固定的,只有少部分不同。Spring運用Template Method模式,將固定的流程編寫與Temp類(JdbcTemplateHibernateTemplate)之中,對不同的一些細節步驟,依托特定DAO支持對象來處理。

    SpringDAO框架并不拋出與數據庫技術相關的異常,Spring所有異常都是DataAccessException的子類,一個與數據庫技術無關的通用異常類,該類繼承至RuntimeException

    對于Jdbc存取,SpringSQLException等轉化為自己的DAO異常對象。

    DataSource注入

    對于不同的數據庫鏈接來源需求,Spring提供了javax.sql.DataSource注入,更換數據來源只需在Bean定義文件中修改配置,不需修改程序代碼。
    例如可以在Bean文件中編寫如下:

     1<!-- 帶連接池的DataSource -->
     2<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     3    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     4    <property name="url" value="jdbc:mysql://localhost:3306/test" />
     5    <property name="username" value="root" />
     6    <property name="password" value="root" />
     7</bean>
     8    
     9<bean id="peopleDao" class="SpringPersistence.PeopleDaoMySQLImpl">
    10    <property name="dataSource" ref="dataSource" />
    11</bean>

    要建立JdbcTemplate的實例,

     1public class PeopleDaoMySQLImpl implements PeopleDao {
     2    
     3    private DataSource dataSource;
     4    
     5    public void setDataSource(DataSource dataSource){
     6        this.dataSource = dataSource;
     7    }

     8
     9    public void save(People people) {
    10        Connection conn = null;
    11        Statement stmt = null;
    12        try {
    13            conn = dataSource.getConnection();
    14            stmt = conn.createStatement();
    15            stmt.execute("INSERT INTO people VALUES (" + people.getId()
    16                    + ",'" + people.getName() + "'," + people.getAge() + ")");
    17            stmt.execute("");
    18        }
     catch (SQLException e) {
    19            e.printStackTrace();
    20        }
     finally {
    21            if(stmt != null){
    22                try {
    23                    stmt.close();
    24                }
     catch (SQLException e) {
    25                    e.printStackTrace();
    26                }

    27            }
        
    28            if(conn != null){
    29                try {
    30                    conn.close();
    31                }
     catch (SQLException e) {
    32                    e.printStackTrace();
    33                }

    34            }

    35        }

    36    }

    37}


        使用JdbcTemplate

    JdbcTemplate封裝了Connection的取得,Statement的建立,異常的處理,Statement的關閉,Connection的關閉等。它被設計為線程安全的。

    要建立JdbcTemplate的實例,必須要有一個DataSource對象作為構造對象。

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    Spring事務管理

    Spring提供編程式事務管理與聲明式事務管理。

    編程式事務管理

    Spring提供了兩種方式實現編程式事務管理:使用PlatformTransactionManager實現;使用org.springframework.transaction.support.TransactionTemplate

        PlatformTransactionManager接口定義如下:

    1public class interface PlatformTransactionManager {
    2    public void commit(TransactionStatus status) throws TransactionException;
    3    public TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    4    public void rollback(TransactionStatus arg0) throws TransactionException;
    5}

    DataSourceTransactionManager是其一個實現類。

    修改添加新用戶的代碼段作為示例:

     1public class PeopleDaoMySQLImpl2 implements PeopleDao {
     2
     3    private DataSource dataSource;
     4    private DataSourceTransactionManager transactionManager;
     5    private DefaultTransactionDefinition def;
     6    private JdbcTemplate jdbcTemplate;
     7
     8    public void setDataSource(DataSource dataSource) {
     9        this.dataSource = dataSource;
    10        jdbcTemplate = new JdbcTemplate(dataSource);
    11        transactionManager = new DataSourceTransactionManager(dataSource);
    12        def = new DefaultTransactionDefinition();
    13        def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
    14    }

    15
    16    public void save(People people) {
    17        TransactionStatus status = transactionManager.getTransaction(def);
    18        try {
    19            jdbcTemplate.execute("INSERT INTO people VALUES (" + people.getId()
    20                        + ",'" + people.getName() + "'," + people.getAge() + ")");
    21            //jdbcTemplate.execute("");
    22        }
     catch (DataAccessException e) {
    23            transactionManager.rollback(status);
    24            throw e;
    25        }

    26        transactionManager.commit(status);
    27    }

    28}

    另一個編程式事務管理方法是使用TransactionTemplate,它需要一個TransactionManager實例,如下:

     1public class PeopleDaoMySQLImpl3 implements PeopleDao {
     2
     3    private DataSource dataSource;
     4    private DataSourceTransactionManager transactionManager;
     5    private JdbcTemplate jdbcTemplate;
     6
     7    public void setDataSource(DataSource dataSource) {
     8        this.dataSource = dataSource;
     9        jdbcTemplate = new JdbcTemplate(dataSource);
    10        transactionManager = new DataSourceTransactionManager(dataSource);
    11    }

    12
    13    public void save(People people) {
    14        final int id = people.getId();
    15        final String name = people.getName();
    16        final int age = people.getAge();
    17        TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
    18        transactionTemplate.execute(new TransactionCallbackWithoutResult(){
    19            public void doInTransactionWithoutResult(TransactionStatus status){
    20                try {
    21                    jdbcTemplate.execute("INSERT INTO people VALUES (" + id
    22                            + ",'" + name + "'," + age + ")");
    23                    //jdbcTemplate.execute("");
    24                }
     catch (DataAccessException e) {
    25                    status.setRollbackOnly();
    26                }

    27            }

    28        }
    );
    29    }

    30}

    聲明式事務管理

    Spring的聲明式事務管理依賴于它的AOP框架來完成,使用聲明式的事務管理的好處是,事務管理不侵入開發的組件。

    定義文件如下:

     1<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     2    <property name="dataSource" ref="dataSource" />
     3</bean>
     4
     5<bean id="peopleDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
     6    <property name="proxyInterfaces">
     7        <list>
     8            <value>SpringPersistence.PeopleDao</value>
     9        </list>
    10    </property>
    11    <property name="target" ref="peopleDao"/>
    12    <property name="transactionManager" ref="transactionManager" />
    13    <property name="transactionAttributes">
    14        <props>
    15            <prop key="sa*">PROPAGATION_REQUIRED</prop>
    16        </props>
    17    </property>
    18</bean>



    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲日韩乱码久久久久久| 亚洲校园春色小说| h片在线播放免费高清| 免费人成年轻人电影| 麻豆安全免费网址入口| 国产精品免费视频播放器| 狼人大香伊蕉国产WWW亚洲| 色www永久免费视频| 亚洲成a人无码亚洲成av无码 | 2020久久精品亚洲热综合一本| 免费无码毛片一区二区APP| 亚洲综合久久成人69| 四虎永久在线精品免费观看视频| 亚洲日韩乱码中文无码蜜桃臀 | 亚洲欧洲精品成人久久曰| 天天摸夜夜摸成人免费视频| 亚洲丰满熟女一区二区哦| 亚洲AⅤ永久无码精品AA| 国产成人精品免费视频大全| 久久夜色精品国产嚕嚕亚洲av| 99国产精品视频免费观看| 亚洲福利电影在线观看| 成年女人午夜毛片免费看| 免费看一级一级人妻片| 亚洲真人无码永久在线| 色欲色香天天天综合网站免费| 亚洲码在线中文在线观看| 精品国产免费观看| 国产人成网在线播放VA免费| 亚洲丝袜美腿视频| 日韩精品视频免费观看| 久久久久女教师免费一区| 亚洲精品乱码久久久久久下载| 日本高清色本免费现在观看| a毛片成人免费全部播放| 亚洲国产中文在线视频| 亚洲精品无码久久久| 国产午夜无码精品免费看动漫| 亚洲第一成人在线| 国产日产亚洲系列最新| 99久久免费国产香蕉麻豆|