多属性对象创建公用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 ,然后达到了是否存在该列的效果。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。