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

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

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

    shenang博客技術文檔


    理論不懂就實踐,實踐不會就學理論!

    posts - 35,comments - 55,trackbacks - 0
     

    SpringJDBC封裝,很大一部分就是借助Template模式實現,它提供了一個優秀的

    JDBC模板庫,借助這個工具,我們可以簡單有效的對傳統的JDBC編碼方式加以改進。

    dbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

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

    再對上面的例子進行一些改進,通過PrepareStatement執行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方法的另一個版本,傳入的參數有兩個,第一個用于創建

    PreparedStatementSQL。第二個參數是為PreparedStatement設定參數的

    PreparedStatementSetter

    第二個參數的使用方法比較獨到,我們動態新建了一個PreparedStatementSetter類,

    并實現了這個抽象類的setValues方法。之后將這個類的引用作為參數傳遞給update

    update接受參數之后,即可調用第二個參數提供的方法完成PreparedStatement的初始

    化。

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

    一個查詢的示例。

    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);

          }

        }

    )

    下面我們通過已學習持的久性封裝知識,繼續討論事務管理

    為了實現數據操作的原子性,我們需要在程序中引入事務邏輯,在JdbcTemplate中引入

    事務機制,在Spring中有兩種方式:

    1 代碼控制的事務管理

    2 參數化配置的事務管理

    下面就這兩種方式進行介紹。

    代碼控制的事務管理

    首先,進行以下配置,假設配置文件為(Application-Context.xml

     (摘自開發指南:夏昕)

    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();

     參數化配置的事務管理

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

    <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>

    與之對應,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

     //此外這里還存在一個有關強制轉型的潛在問題,請參見Hibernate in Spring一節后

    //關于強制轉型的補充描述。

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

    userDAO.insertUser();

    posted on 2009-03-24 13:25 重慶理工小子 閱讀(278) 評論(0)  編輯  收藏 所屬分類: Spring2
    主站蜘蛛池模板: 色婷五月综激情亚洲综合| 久久久久久久久亚洲| 亚洲人成欧美中文字幕| 黄+色+性+人免费| 亚洲综合激情另类小说区| 国产在线观看麻豆91精品免费| 亚洲精品白色在线发布| 巨波霸乳在线永久免费视频| 亚洲日本国产精华液| 久久受www免费人成_看片中文| 亚洲一区在线观看视频| 天天摸天天碰成人免费视频| 精品久久久久久久久亚洲偷窥女厕| 国产大片线上免费看| 一级日本高清视频免费观看| 亚洲人成在线播放网站| 久久国产精品免费视频| 亚洲制服丝袜一区二区三区| 免费的一级片网站| 免费夜色污私人影院网站| 久久久久亚洲av毛片大| 无码人妻丰满熟妇区免费| 亚洲成a人片在线观看中文app | 在线综合亚洲中文精品| 全免费一级午夜毛片| 人妻巨大乳hd免费看| 亚洲国产高清在线| 成年女人免费碰碰视频| 猫咪www免费人成网站| 亚洲精品无码专区在线在线播放| 99久久99热精品免费观看国产| 亚洲国产日韩视频观看| 亚洲国产综合久久天堂| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 亚洲人成无码网WWW| 久久国产乱子精品免费女| 亚洲人成人网毛片在线播放| 亚洲?v女人的天堂在线观看| 久久国产精品成人片免费| 亚洲成熟丰满熟妇高潮XXXXX | 久久WWW免费人成人片|