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

时间: 2024-07-30 20:32:05

多属性对象创建公用RowMapper的相关文章

学习pthreads,使用属性对象创建结合线程和分离线程

当我们创建了子线程,是让它犹如脱缰之马,信步驰骋,还是如乖巧听话的孩子,时不时教导一下呢?针对这个问题,本文介绍线程的结合和分离,结构分为三个部分,第一部分给出代码示例,第二部分对代码进行讲解,第三部分是运行结果. 一 代码示例 二 代码讲解 该函数是线程执行的子函数,打印输出线程的ID和一个计算结果,然后终止线程 定义线程变量,属性对象变量和一些常见变量.属性对象变量可以根据自己的需求来设置,从而通过属性对象来设置线程的属性,在这里主要是设置线程的结合和分离属性. 对属性对象变量进行初始化,并

【OC复合题】之定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C)

题目: 定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值.(Objective-C) 1)    不使用@property,手动编写他们的访问器方法(getter和setter),注意内存管理(手动管理内存) 2)    增加一个便利构造器(快速构造器) 3)    使用NSLog输出学生对象时,输出信息格式为:My Name Is XXX  Age Is XXX Score Is XXX 4)    对5个学生对象按照成绩->年龄->姓名优先级排序(成绩相

javascript对象创建及原型继承的研究

今天总结了下javascript关于原型继承和对象创建方面的东西,因为javascript的原型继承在使用传统面向对象语言开发的同学看来比较怪异,原型继承确实比传统OOP语言的继承理解和运用起来困难一些,当然个人觉得传统OOP的继承相对比较简单,因为中规中矩. 下面逐个的用示例说明javascript中对象创建方式,专业一点叫什么模式,主要有直接单个创建:工厂模式:提出方法类函数公用方式:构造函数模式:构造函数+原型方式:使用原型本质的方式构建(这种受过李站的<悟透javascript>一书的

【Java基础】Java类的加载和对象创建流程的详细分析

相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 1 package mytest.javaBase; 2 3 public class Parent { 4 int a = 10; 5 static int b = 11; 6 // 静态代码块 7 static { 8 System.out.println("Parent静态代码块:b=" + b)

[十六]SpringBoot 之 读取环境变量和绑定属性对象

1.读取环境变量 凡是被spring管理的类,实现接口EnvironmentAware 重写方法 setEnvironment 可以在工程启动时,获取到系统环境变量和application配置文件中的变量. 主要是@Configuration,实现接口:EnvironmentAware就能获取到系统环境信息 package me.shijunjie.config; import org.springframework.beans.factory.annotation.Value; import

Gradle 庖丁解牛(构建生命周期核心托付对象创建源代码浅析)

[工匠若水 http://blog.csdn.net/yanbober 未经同意严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 上一篇<Gradle 庖丁解牛(构建源头源代码浅析)>我们分析了 Gradle 框架自身初始化(非构建生命周期初始化)的核心流程,这一篇我们续着前面的分析继续(假设没看过前一篇的建议先去看前一篇,由于这一系列存在非常高的关联性).上一篇说到当我们运行 gradle taskName 命令后经过一系列艰难的框架初始化终于走到了 DefaultGradleLaunc

【Unity】3.1 利用内置的3D对象创建三维模型

分类:Unity.C#.VS2015 创建日期:2016-04-02 一.基本概念 Unity已经内置了一些基本的3D对象,利用这些内置的3D对象就可以直接构建出各种3D模型(当然,复杂的三维模型还需要借助专业建模软件来完成). Unity 5.3.4内置的3D对象有: Cube:立方体 Sphere:球体 Capsule:胶囊体. Cylinder:圆柱体. Plane:平面. Quad:四方格. Ragdoll:布娃娃系统. Terrain:地形. Tree:树. Wind Zone:风.

JS学习笔记-OO疑问之对象创建

问一.引入工厂,解决重复代码 前面已经提到,JS中创建对象的方法,不难发现,基本的创建方法中,创建一个对象还算简单,如果创建多个类似的对象的话就会产生大量重复的代码. 解决:工厂模式方法(添加一个专门创建对象的方法,传入参数避免重复) function createObject(name,age){ var obj =new Object(); //创建对象 obj.name = name; obj.age = age; obj.run = function(){ return this.nam

Javascript理解面向对象(一)--对象创建模式

1)工厂模式  通俗来讲就是把原料进厂加工后出厂的一系列流程.在这里只是把原料换成了数据. 以下代码创建了一个createPerson()函数,函数中存在两个属性一个方法,可用于添加并打印person的姓名和年龄信息. <script> function createPerson(name, age) { //1:原料 var obj = new Object(); //2:加工 obj.name = name; obj.age = age; obj.showInfo = function (