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

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

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

    Spring JDBC Framework詳解——批量JDBC操作、ORM映射

    作者:niumd,轉載請注明出處,謝謝   

    發表時間:2010 年 03 月 17 日  

    原文鏈接:http://ari.iteye.com/admin/blogs/618449


    一、Spring JDBC 概述

         Spring 提供了一個強有力的模板類JdbcTemplate簡化JDBC操作,DataSource,JdbcTemplate都可以以Bean的方式定義在想xml配置文件,JdbcTemplate創建只需注入一個DataSource,應用程序Dao層只需要繼承JdbcDaoSupport, 或者注入JdbcTemplate,便可以獲取JdbcTemplate,JdbcTemplate是一個線程安全的類,多個Dao可以注入一個JdbcTemplate;



    <!--         Oracle數據源           -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@oracle.devcake.co.uk:1521:INTL"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--  set注入方式獲取jdbcTemplate -->
    <bean id="customerDao" class="JdbcCustomerDao" >
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>
    <!-- 注入dataSource,customerDao通過繼承JdbcDaoSupport ,使用this.getJdbcTemplate()獲取JdbcTemplate   -->
    <bean id="customerDao" class="JdbcCustomerDao" >
    <property name="dataSource" ref="dataSource"/>
    </bean>
    


    然后將jdbcTemplate對象注入自定義的Dao、或者繼承JdbcDaoSupport,例如:

    public class JdbcCustomerDao extends JdbcDaoSupport implements CustomerDao {
    }
    public class JdbcCustomerDao implements CustomerDao {
    private JdbcTemplate jdbcTemplate
    public void setJdbcTemplate()JdbcTemplate jdbcTemplate{
    this.jdbcTemplate=jdbcTemplate
    }
    }


    二、 JdbcTemplate 提供以下主要方法簡化JDBC操作:

    2.1、List query(String sql,Ojbect[] args,RowMapper rowMapper)

         說明:常用的查詢,sql待執行的sql語句,args是sql語句的參數,rowMapper負責將每一行記錄轉化為java對象存放在list,并最終返回,例如:

    public List<Book> queryByAuthor(String author) {
    String sql = "select * from book where author=?";
    Collection c = getJdoTemplate().find(sql,
    new Object[] { author },new BookRowMapper());
    List<Book> books = new ArrayList<Book>();
    books.addAll(c);
    return books;
    }
    class BookRowMapper implements RowMapper{
    public Object mapRow(ResultSet res, int index) throws SQLException {
    Book book = new Book();
    book.setId(rs.getInt("id"));
    //省略set
    return book;
    }
    }


       更新、刪除、其他查詢操作類似,舉例如下,詳細細節請參考spring api:


    //返回值為一個長整形
    public long getAverageAge() {
    return getJdbcTemplate().queryForLong("SELECT AVG(age) FROM employee");
    }
    //返回一個整數
    public int getTotalNumberOfEmployees() {
    return getJdbcTemplate().queryForInt("SELECT COUNT(0) FROM employees");
    }
    //更新操作
    this.jdbcTemplate.update(
    "insert into t_actor (first_name, surname) values (?, ?)",
    new Object[] {"Leonor", "Watling"});
    



     2.2、spring 2.5新功能,另類的jdbc ORM:BeanPropertyRowMapper


          上面我們檢索時必須實現RowMapper,將結果集轉化為java對象。Spring2.5 簡化了這一操作,使得我們不必再實現RowMapper,實現此功能的倆個神奇東東便是:ParameterizedRowMapper,ParameterizedBeanPropertyRowMapper,貌似通過java反射機制實現了將resultset字段映射到java對象,但是數據表的列必須和java對象的屬性對應,沒有研究源碼,有點類似于apache 的BeanUtil,不知為何這部分在spring開發參考手冊沒有,難道不是經典。



    //使用ParameterizedBeanPropertyRowMapper
    @SuppressWarnings({"unchecked"})
    public List<Customer> getAll() {
    return getJdbcTemplate().query("select * from t_customer", ParameterizedBeanPropertyRowMapper.newInstance(Customer.class));
    }
    //使用BeanPropertyRowMapper
    @SuppressWarnings({"unchecked"})
    public List<Customer> getAll() {
    return getJdbcTemplate().query("select * from t_customer", new BeanPropertyRowMapper(Customer.class));
    }
    



    注意:ParameterizedBeanPropertyRowMapper是BeanPropertyRowMapper子類。另外表的字段名稱必須和實體類的成員變量名稱一致;


    2.3、spring之JDBC批量操作

          jdbcTemplate.batchUpdate(final String[] sql) ,API解釋:Issue multiple SQL updates on a single JDBC Statement using batching,翻譯過來大致為:解決多個sql的插入、更新、刪除操作在一個Statement中。性能一般。

       jdbcTemplate.batchUpdate(String sql, final BatchPreparedStatementSetter pss),類似于JDBC的PreparedStatement,性能較上著有所提高。

       我們舉例說明如何使用,示例如下:

    final int count = 2000;
    final List<String> firstNames = new ArrayList<String>(count);
    final List<String> lastNames = new ArrayList<String>(count);
    for (int i = 0; i < count; i++) {
    firstNames.add("First Name " + i);
    lastNames.add("Last Name " + i);
    }
    jdbcTemplate.batchUpdate(
    "insert into customer (id, first_name, last_name, last_login, comments) values (?, ?, ?, ?, ?)",
    new BatchPreparedStatementSetter() {
    //為prepared statement設置參數。這個方法將在整個過程中被調用的次數
    public void setValues(PreparedStatement ps, int i) throws SQLException {
    ps.setLong(1, i + 10);
    ps.setString(2, firstNames.get(i));
    ps.setString(3, lastNames.get(i));
    ps.setNull(4, Types.TIMESTAMP);
    ps.setNull(5, Types.CLOB);
    }
    //返回更新的結果集條數
    public int getBatchSize() {
    return count;
    }
    });
    }
    



      BatchSqlUpdate類是SqlUpdate 的子類,適用于插入、刪除、更新批量操作,內部使用PreparedStatement,所以效率很高,批量語句達到設定的batchSize,或者手動調用flush才會執行批量操作。注意:此類是非線程安全的,必須為每個使用者創建一個實例,或者在同一個線程中使用前調用reset。

       下面我們舉例說明如何使用BatchSqlUpdate,來執行批量操作。示例如下:

    class BatchInsert extends BatchSqlUpdate {
    private static final String SQL = "insert into t_customer (id, first_name, last_name, last_login, "
    + "comments) values (?, ?, ?, ?, null)";
    BatchInsert(DataSource dataSource) {
    super(dataSource, SQL);
    declareParameter(new SqlParameter(Types.INTEGER));
    declareParameter(new SqlParameter(Types.VARCHAR));
    declareParameter(new SqlParameter(Types.VARCHAR));
    declareParameter(new SqlParameter(Types.TIMESTAMP));
    setBatchSize(10);
    }
    }
    


    int count = 5000;
    for (int i = 0; i < count; i++) {
    batchInsert.update(new Object[] { i + 100L, "a" + i, "b" + i, null });
    }
    


     至此,spring JDBC主要的應用基本上都簡單羅列一番,所有代碼均為文章舉例,不是很嚴謹,僅為演示每一種用法,拋磚引玉,希望有獨特見解的拍磚,有問題的請指明問題所在,謝謝

    posted on 2011-05-10 21:06 空白 閱讀(3270) 評論(0)  編輯  收藏 所屬分類: Java

    <2011年5月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類(15)

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成人毛片免费网站| 99久久国产热无码精品免费| 日本高清色本免费现在观看| jlzzjlzz亚洲jzjzjz| 久久国产色AV免费看| 亚洲国产综合91精品麻豆| 免费人成视频在线观看网站| 久久精品国产亚洲AV无码麻豆 | 亚洲成av人片在线天堂无| 性生交片免费无码看人| 亚洲一区精彩视频| 暖暖日本免费在线视频| 黄网站在线播放视频免费观看| 亚洲国产香蕉人人爽成AV片久久 | 国产免费丝袜调教视频| 亚洲国产激情在线一区| 国产精品jizz在线观看免费| 又黄又大的激情视频在线观看免费视频社区在线| 国产婷婷高清在线观看免费 | 亚洲精品成人图区| 性一交一乱一视频免费看| 污网站在线观看免费| 亚洲精品无码午夜福利中文字幕| 免费h视频在线观看| 亚洲国产精品综合久久2007| 日韩一级在线播放免费观看| 四虎精品成人免费视频| 亚洲国产人成网站在线电影动漫 | 伊人久久国产免费观看视频| 亚洲AV无码国产在丝袜线观看| 成人免费福利视频| 黄床大片30分钟免费看| 亚洲a一级免费视频| 免费的一级片网站| 91在线视频免费观看| 国产日本亚洲一区二区三区| 亚洲AV无码一区二区三区国产 | 1000部拍拍拍18勿入免费视频软件| 亚洲日本在线电影| 亚洲乱码日产一区三区| 久视频精品免费观看99|