接着[上一篇博文][Link 1],继续写一下,如果给多属性的大对象,如何创建公用的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 ,然后达到了是否存在该列的效果。
还没有评论,来说两句吧...