標籤:資料庫 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