多属性对象创建公用RowMapper
接着上一篇博文,继续写一下,如果给多属性的大对象,如何创建公用的rowmapper?
假如有应用对象App,包含属性如下
/** * 应用实体类 * @author Administrator */ public class App { // 应用ID private String id; // 名称 private String name; // 发布时间 private Date createTime; // 应用类型 private AppType appType; // 应用访问地址 private String appVisitedAddress; // 应用图标 private Image appImage; }
其中应用类型和图标又分别为类
/** * 应用类型实体 * @author Administrator */ public class AppType { // 类型ID private String typeId; // 类型名称 private String typeName; }
和
/** * 图标实体类 * @author Administrator */ public class Image { // 图标ID private 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> { @Override public 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(); // 应用id if (isExistColumn(rs, "id")) { app.setId(rs.getString("id")); } // 应用name if (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 ,然后达到了是否存在该列的效果。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。