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

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

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

    posts - 495,  comments - 11,  trackbacks - 0

    ??????在一般情況下,在新增領域對象后,都需要獲取對應的主鍵值。使用應用層來維護主鍵,在一定程度上有利于程序性能的優(yōu)化和應用移植性的提高。在采用數(shù)據(jù)庫自增主鍵的方案里,如果JDBC驅動不能綁定新增記錄對應的主鍵,就需要手工執(zhí)行查詢語句以獲取對應的主鍵值,對于高并發(fā)的系統(tǒng),這很容易返回錯誤的主鍵。通過帶緩存的DataFieldMaxValueIncrementer,可以一次獲取批量的主鍵值,供多次插入領域對象時使用,它的執(zhí)行性能是很高的。

    ??????我們經常使用數(shù)據(jù)的自增字段作為表主鍵,也即主鍵值不在應用層產生,而是在新增記錄時,由數(shù)據(jù)庫產生。這樣,應用層在保存對象前并不知道對象主鍵值,而必須在保存數(shù)據(jù)后才能從數(shù)據(jù)庫中返回主鍵值。在很多情況下,我們需要獲取新對象持久化后的主鍵值。在Hibernate等ORM框架,新對象持久化后,Hibernate會自動將主鍵值綁定到對象上,給程序的開發(fā)帶來了很多方便。?

    ??????在JDBC 3.0規(guī)范中,當新增記錄時,允許將數(shù)據(jù)庫自動產生的主鍵值綁定到Statement或PreparedStatement中。

    ??????使用Statement時,可以通過以下方法綁定主鍵值:?int executeUpdate(String sql, int autoGeneratedKeys)?

    ??????也可以通過Connection創(chuàng)建綁定自增值的PreparedStatement:?PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)?

    ??????當autoGeneratedKeys參數(shù)設置為Statement.RETURN_GENERATED_KEYS值時即可綁定數(shù)據(jù)庫產生的主鍵值,設置為Statement.NO_GENERATED_KEYS時,不綁定主鍵值。下面的代碼演示了Statement綁定并獲取數(shù)據(jù)庫產生的主鍵值的過程:

    ????? Statement stmt = conn.createStatement();
    ????? String sql = "INSERT INTO t_topic(topic_title,user_id) VALUES(‘測試主題’,’123’)";
    ????? stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS); // ①指定綁定表自增主鍵值
    ????? ResultSet rs = stmt.getGeneratedKeys();
    ????? if( rs.next() ) {
    ?????????? intkey = rs.getInt(); // ②獲取對應的表自增主鍵值
    ????? }

    ??????Spring利用這一技術,提供了一個可以返回新增記錄對應主鍵值的方法:?int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)?,其中第二個參數(shù)類型org.springframework.jdbc.support.KeyHolder,它是一個回調接口,Spring使用它保存新增記錄對應的主鍵,該接口的接口方法描述如下:?

    ??????Number getKey() throws InvalidDataAccessApiUsageException;

    ??????當僅插入一行數(shù)據(jù),主鍵不是復合鍵且是數(shù)字類型時,通過該方法可以直接返回新的主鍵值。如果是復合主鍵,或者有多個主鍵返回時,該方法拋出 InvalidDataAccessApiUsageException。該方法是最常用的方法,因為一般情況下,我們一次僅插入一條數(shù)據(jù)并且主鍵字段類型為數(shù)字類型;?

    ??????如果是復合主鍵,則列名和列值構成Map中的一個Entry。如果返回的是多個主鍵,則拋出InvalidDataAccessApiUsageException異常;?

    ??????Map getKeys() throws InvalidDataAccessApiUsageException;

    ??????如果返回多個主鍵,即PreparedStatement新增了多條記錄,則每一個主鍵對應一個Map,多個Map構成一個List。

    ??????List getKeyList():?

    ??????Spring為KeyHolder接口指代了一個通用的實現(xiàn)類GeneratedKeyHolder,該類返回新增記錄時的自增長主鍵值。假設我們希望在新增論壇板塊對象后,希望將主鍵值加載到對象中,則可以按以下代碼進行調整:

    ????? public voidaddForum(final Forum forum) {
    ??????????? final String sql = "INSERT INTO t_forum(forum_name,forum_desc) VALUES(?,?)";
    ??????????? KeyHolder keyHolder = newGeneratedKeyHolder(); // ①創(chuàng)建一個主鍵執(zhí)有者
    ??????????? getJdbcTemplate().update(newPreparedStatementCreator() {
    ????????????????? public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
    ??????????????????????? PreparedStatement ps = conn.prepareStatement(sql);
    ??????????????????????? ps.setString(1, forum.getForumName());
    ??????????????????????? ps.setString(2, forum.getForumDesc());
    ??????????????????????? returnps;
    ????????????????? }
    ??????????? }, keyHolder);
    ??????????? forum.setForumId(keyHolder.getKey().intValue()); // ②從主鍵執(zhí)有者中獲取主鍵
    ????? }

    ??????這樣,在調用addForum(Forum forum)新增forum領域對象后,forum將擁有對應的主鍵值,方便后繼的使用。在JDBC 3.0之前的版本中,PreparedStatement不能綁定主鍵,如果采用表自增鍵(如MySQL的auto increment或SQLServer的identity)將給獲取正確的主鍵值帶來挑戰(zhàn)——因為你必須在插入數(shù)據(jù)后,馬上執(zhí)行另一條獲取新增主鍵的查詢語句。下面給出了不同數(shù)據(jù)庫獲取最新自增主鍵值的查詢語句:?

    posted on 2011-09-25 14:27 jadmin 閱讀(992) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲综合激情六月婷婷在线观看 | 国产免费看插插插视频| 91大神亚洲影视在线| 久久成人免费播放网站| 亚洲av综合avav中文| 日韩免费人妻AV无码专区蜜桃| 国产亚洲综合成人91精品 | 99久久久精品免费观看国产| 亚洲黄色在线视频| 成年黄网站色大免费全看| 亚洲va乱码一区二区三区| 午夜视频在线在免费| 又大又硬又粗又黄的视频免费看 | 亚洲邪恶天堂影院在线观看| 18禁美女裸体免费网站| 亚洲无人区码一二三码区别图片| 国内免费高清在线观看| 在线观看亚洲免费视频| 黑人大战亚洲人精品一区| 久久中文字幕免费视频| 久久精品国产亚洲AV忘忧草18 | 国产午夜精品免费一区二区三区| 亚洲国产精品无码专区在线观看| 69免费视频大片| 337P日本欧洲亚洲大胆艺术图 | 可以免费观看的国产视频| 亚洲精品免费在线| 国产最新凸凹视频免费| 免费国产污网站在线观看| 亚洲精品中文字幕无乱码| 免费人成网站7777视频| 国产好大好硬好爽免费不卡| 亚洲AV无码无限在线观看不卡| 亚洲av中文无码| 91精品国产免费久久久久久青草| 在线观看亚洲免费视频| 亚洲理论片中文字幕电影| 免费大学生国产在线观看p| 99热这里只有精品免费播放| 麻豆亚洲AV成人无码久久精品| 五月天网站亚洲小说|