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

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

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

    shenang博客技術(shù)文檔


    理論不懂就實(shí)踐,實(shí)踐不會(huì)就學(xué)理論!

    posts - 35,comments - 55,trackbacks - 0
     

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

    JDBC模板庫,借助這個(gè)工具,我們可以簡單有效的對傳統(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方法的另一個(gè)版本,傳入的參數(shù)有兩個(gè),第一個(gè)用于創(chuàng)建

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

    PreparedStatementSetter

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

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

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

    化。

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

    一個(gè)查詢的示例。

    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í)持的久性封裝知識(shí),繼續(xù)討論事務(wù)管理

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

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

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

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

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

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

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

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

    1Application-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;

          }

        });

     }

    }

    3TestCase

    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增加一個(gè)事務(wù)代理UserDAOProxy配置,同時(shí),由于事務(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

     //此外這里還存在一個(gè)有關(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
    主站蜘蛛池模板: 国产免费人成视频在线观看| 久青草视频97国内免费影视| aaa毛片免费观看| 亚洲AV中文无码字幕色三| 亚洲av日韩精品久久久久久a| 久久精品免费观看国产| 免费一级一片一毛片| 亚洲AV日韩AV无码污污网站| 亚洲最大激情中文字幕| 免费国产va视频永久在线观看| 热久久精品免费视频| 亚洲av午夜精品无码专区| 久草视频免费在线观看| 亚洲第一页在线播放| 成人福利免费视频| 男人免费视频一区二区在线观看 | 日本h在线精品免费观看| 亚洲国产精品SSS在线观看AV| 国产成人无码精品久久久免费| 伊在人亚洲香蕉精品区麻豆| 亚洲国产成人精品无码区二本 | 我要看免费的毛片| 亚洲国产精品成人综合色在线| 亚洲AV日韩AV永久无码下载| 日本三级在线观看免费| 久久精品国产亚洲av麻| 国产免费人成视频在线观看| 91精品免费在线观看| 中国一级毛片视频免费看| 亚洲嫩模在线观看| 欧美男同gv免费网站观看| 国产成人精品日本亚洲语音| 亚洲福利精品一区二区三区 | 国产无遮挡裸体免费视频在线观看| 国精无码欧精品亚洲一区| 蜜桃视频在线观看免费视频网站WWW| 久久久久亚洲精品天堂| 在线观看免费人成视频| 国产亚洲视频在线播放大全| 亚洲精品美女久久久久99小说| 色www永久免费网站|