多屬性對象建立公用RowMapper

來源:互聯網
上載者:User

標籤:資料庫   resultset   rowmapper   springjdbc   


    接著上一篇博文,繼續寫一下,如果給多屬性的大對象,如何建立公用的rowmapper?


    假如有應用對象App,包含屬性如下

/** * 應用實體類 * @author Administrator */public class App {// 應用IDprivate String id;// 名稱private String name;// 發布時間private Date createTime;// 應用類型private AppType appType;// 應用訪問地址private String appVisitedAddress;// 應用表徵圖private Image appImage;} 

    其中應用類型和表徵圖又分別為類

/** * 應用類型實體 * @author Administrator */public class AppType {// 類型IDprivate String typeId;// 類型名稱private String typeName;} 

    和

/** * 表徵圖實體類 * @author Administrator */public class Image {// 表徵圖IDprivate String imageId;// 退保路徑private String imageUrl;} 

    假如要查詢出一個App對象的話,那麼映射的屬性共有id,name,createTime 和 appVisitedAddress 四個單屬性 及 appType 和 appImage 兩個對象屬性。

   

    但是 查詢的時候,並不需要每次都將所有的屬性查詢出來,然後組裝為App 對象的執行個體,那麼每次都寫一個App 的 RowMapper 類嗎?顯然比較浪費。

   

    我們可以使用前一篇博文講過的,根據查詢結果集中是否存在該屬性列來決定是否映射該屬性,寫一個公用的AppRowMapper類。


import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;import com.bbs.entity.App;import com.bbs.entity.AppType;import com.bbs.entity.Image;public class AppRowMap implements RowMapper<App> {@Overridepublic App mapRow(ResultSet rs, int index) throws SQLException {// APPType 類AppType appType = new AppType();// typeId屬性對應if (isExistColumn(rs, "typeId")) {appType.setTypeId(rs.getString("typeId"));}// typeName屬性if (isExistColumn(rs, "typeName")) {appType.setTypeName(rs.getString("typeName"));}// AppImage 類Image appImage = new Image();// imageId 屬性if (isExistColumn(rs, "imageId")) {appImage.setImageId(rs.getString("imageId"));}// imageName 屬性if (isExistColumn(rs, "imageName")) {appImage.setImageUrl(rs.getString("imageName"));}final App app = new App();// 應用idif (isExistColumn(rs, "id")) {app.setId(rs.getString("id"));}// 應用nameif (isExistColumn(rs, "name")) {app.setName(rs.getString("name"));}// 建立時間if (isExistColumn(rs, "createTime")) {app.setCreateTime(rs.getDate("createTime"));}// 訪問地址if (isExistColumn(rs, "appVisitedAddress")) {app.setAppVisitedAddress(rs.getString("appVisitedAddress"));}app.setAppImage(appImage);app.setAppType(appType);return app;}/** * 判斷查詢結果集中是否存在某列 * @param rs 查詢結果集 * @param columnName 列名 * @return true 存在; false 不存咋 */public boolean isExistColumn(ResultSet rs, String columnName) {try {if (rs.findColumn(columnName) > 0 ) {return true;} }catch (SQLException e) {return false;}return false;}}


    這樣,當我們第一次僅查詢出id和name時,和第二次查詢出id,appVisitAddress時便可共用一個AppRowMap 對象。

   

    這裡我們只是一個簡單的例子,給的對象屬性都比較少,當然實際情況中,對象屬性可能更多,而且關聯對象更複雜時,這種方式便非常有效。因為在資料庫查詢結果集ResultSet中,如果直接去getString("notExistColumn") 時,會直接拋SQLException,isExistColumn(ResultSet rs, String columnName) 正是利用了 findColumn 方法的SQLException ,然後達到了是否存在該列的效果。


多屬性對象建立公用RowMapper

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.