多属性对象创建公用RowMapper

来源:互联网 发布:消费金融 知乎 编辑:程序博客网 时间:2024/05/17 09:22


    接着上一篇博文,继续写一下,如果给多属性的大对象,如何创建公用的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 ,然后达到了是否存在该列的效果。


0 0