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

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

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

    shenang博客技術(shù)文檔


    理論不懂就實踐,實踐不會就學(xué)理論!

    posts - 35,comments - 55,trackbacks - 0
     

    SpringJDBC封裝,很大一部分就是借助Template模式實現(xiàn),它提供了一個優(yōu)秀的

    JDBC模板庫,借助這個工具,我們可以簡單有效的對傳統(tǒng)的JDBC編碼方式加以改進(jìn)。

    dbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    jdbcTemplate.update("UPDATE user SET age = 10 WHERE id = 'erica'");

    再對上面的例子進(jìn)行一些改進(jìn),通過PrepareStatement執(zhí)行update操作以避免SQL

    njection 漏洞

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    jdbcTemplate

     .update(

       "UPDATE user SET age = ? WHERE id = ?",

       new PreparedStatementSetter() {

         public void setValues(PreparedStatementSetter ps)

           throws SQLException {

            ps.setInt(1, 18);

            ps.setString(2, "erica");

          }

        }

    )

    可以看到,上面引用了update方法的另一個版本,傳入的參數(shù)有兩個,第一個用于創(chuàng)建

    PreparedStatementSQL。第二個參數(shù)是為PreparedStatement設(shè)定參數(shù)的

    PreparedStatementSetter。

    第二個參數(shù)的使用方法比較獨到,我們動態(tài)新建了一個PreparedStatementSetter類,

    并實現(xiàn)了這個抽象類的setValues方法。之后將這個類的引用作為參數(shù)傳遞給update。

    update接受參數(shù)之后,即可調(diào)用第二個參數(shù)提供的方法完成PreparedStatement的初始

    化。

    上面演示了update方法的使用(同樣的操作適用于update、insert、delete。下面是

    一個查詢的示例。

    final List userList = new ArrayList();

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    jdbcTemplate

     .query(

       "SELECT name, sex, address FROM user WHERE age > 18",

       new RowCallbackHandler() {

         public void processRow(ResultSet rs) throws SQLException {

            User user = new User();

            user.setId(rs.getString("name"));

            user.setSex(rs.getString("sex"));

            user.setAddress(rs.getString("address"));

            userList.add(product);

          }

        }

    )

    下面我們通過已學(xué)習(xí)持的久性封裝知識,繼續(xù)討論事務(wù)管理

    為了實現(xiàn)數(shù)據(jù)操作的原子性,我們需要在程序中引入事務(wù)邏輯,在JdbcTemplate中引入

    事務(wù)機(jī)制,在Spring中有兩種方式:

    1 代碼控制的事務(wù)管理

    2 參數(shù)化配置的事務(wù)管理

    下面就這兩種方式進(jìn)行介紹。

    代碼控制的事務(wù)管理

    首先,進(jìn)行以下配置,假設(shè)配置文件為(Application-Context.xml

     (摘自開發(fā)指南:夏昕)

    1、Application-Context.xml

    <beans>

     <bean id="dataSource"

    class="org.apache.commons.dbcp.BasicDataSource"

       destroy-method="close">

       <property name="driverClassName">

         <value>net.sourceforge.jtds.jdbc.Driver</value>

       </property>

       <property name="url">

         <value>jdbc:jtds:sqlserver://127.0.0.1:1433/Sample</value>

       </property>

       <property name="username">

         <value>test</value>

       </property>

       <property name="password">

         <value>changeit</value>

       </property>

     </bean>

     

     <bean id="transactionManager"

    class="org.springframework.jdbc.datasource.DataSourceTransac

    tionManager">

       <property name="dataSource">

         <ref local="dataSource" />

       </property>

     </bean>

     

     <bean id="userDAO" class="net.xiaxin.dao.UserDAO">

       <property name="dataSource">

         <ref local="dataSource" />

       </property>

       <property name="transactionManager">

         <ref local="transactionManager" />

       </property>

     </bean>

    </beans>

    2UserDAO

    public class UserDAO {

       private DataSource dataSource;

    private PlatformTransactionManager transactionManager;

     public PlatformTransactionManager getTransactionManager() {

       return transactionManager;

     }

       public void setTransactionManager(PlatformTransactionManager

    transactionManager) {

       this.transactionManager = transactionManager;

     }

       public DataSource executeTestSource() {

       return dataSource;

     }

       public void setDataSource(DataSource dataSource) {

       this.dataSource = dataSource;

     }

       public void insertUser() {

        TransactionTemplate tt =

         new TransactionTemplate(getTransactionManager());

     

        tt.execute(new TransactionCallback() {

     

         public Object doInTransaction(TransactionStatus status) {

            JdbcTemplate jt = new JdbcTemplate(executeTestSource());

            jt.update(

             "insert into users (username) values ('xiaxin');");

            jt.update(

             "insert into users (id,username) values(2,

    'erica');");

           return null;

          }

        });

     }

    }

    3、TestCase

    InputStream is = new FileInputStream("Application-Context.xml");

    XmlBeanFactory factory = new XmlBeanFactory(is);

    UserDAO userDAO = (UserDAO) factory.getBean("userDAO");

    userDAO.insertUser();

     參數(shù)化配置的事務(wù)管理

    在上面的Application-Context.xml增加一個事務(wù)代理UserDAOProxy配置,同時,由于事務(wù)由容器管理,UserDAO不再需要TransactionManager設(shè)定,將其移除:

    <bean id="UserDAOProxy"

     class="org.springframework.transaction.interceptor.Transac

    tionProxyFactoryBean">

       <property name="transactionManager">

         <ref bean="transactionManager" />

       </property>

       <property name="target">

         <ref local="userDAO" />

       </property>

       <property name="transactionAttributes">

         <props>

           <prop key="insert*">PROPAGATION_REQUIRED</prop>

           <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

         </props>

       </property>

     </bean>

     

     <bean id="userDAO" class="net.xiaxin.dao.UserDAO">

       <property name="dataSource">

         <ref local="dataSource" />

       </property>

     </bean>

    與之對應(yīng),UserDAO.insertUser的代碼修改如下:

    public void insertUser(RegisterInfo regInfo) {

     JdbcTemplate jt = new JdbcTemplate(executeTestSource());

     jt.update("insert into users (username) values ('xiaxin');");

     jt.update("insert into users (id,username) values (2,'erica');");

    }

    比上面簡單了很多吧!

    測試代碼修改如下:

    InputStream is = new FileInputStream("Application-Context.xml");

    XmlBeanFactory factory = new XmlBeanFactory(is);

     //注意這里須通過代理Bean"userDAOProxy"獲得引用,而不是直接getBean(userDA

     //此外這里還存在一個有關(guān)強(qiáng)制轉(zhuǎn)型的潛在問題,請參見Hibernate in Spring一節(jié)后

    //關(guān)于強(qiáng)制轉(zhuǎn)型的補(bǔ)充描述。

    UserDAO userDAO = (UserDAO) factory.getBean("userDAOProxy");

    userDAO.insertUser();

    posted on 2009-03-24 13:25 重慶理工小子 閱讀(284) 評論(0)  編輯  收藏 所屬分類: Spring2
    主站蜘蛛池模板: 99精品视频免费| 曰批全过程免费视频在线观看| 婷婷亚洲久悠悠色悠在线播放| 亚洲视频免费在线看| 国产精品自拍亚洲| a一级毛片免费高清在线| 国产乱子伦片免费观看中字| 亚洲国产日韩在线人成下载| 成人免费无码精品国产电影| 亚洲精品天堂成人片AV在线播放| 一个人看www在线高清免费看| 美女视频黄a视频全免费网站色 | 特黄特色大片免费| 久久亚洲精品AB无码播放| 成人毛片免费在线观看| 拍拍拍无挡视频免费观看1000| 亚洲精品二三区伊人久久| 无码区日韩特区永久免费系列| 日韩在线视频播放免费视频完整版| 亚洲小视频在线观看| 免费一级e一片在线播放| 最近在线2018视频免费观看| g0g0人体全免费高清大胆视频| 激情亚洲一区国产精品| 毛片在线免费视频| 亚洲狠狠婷婷综合久久蜜芽| 久久久久亚洲精品美女| 亚洲国产精品毛片av不卡在线| 1000部拍拍拍18免费网站| 久久久精品视频免费观看 | 国产91精品一区二区麻豆亚洲 | 女人18毛片a级毛片免费| 国产午夜不卡AV免费| 免费看美女午夜大片| 亚洲一区二区三区久久久久| 亚洲码国产精品高潮在线| baoyu116.永久免费视频| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 在线观看免费人成视频色| 日韩免费在线观看视频| 亚洲国产成人手机在线电影bd|