Java 将ResultSet映射到实体Entity

Java 查询结果接ResultSet映射到实体Entity的帮助类,而不需要再一个个属性的set工作,看代码:
/**
 * @包名 :fes.andy.framework.db.helper<br>
 * @文件名 :RsMapEntityHelper.java<br>
 * @类描述 :<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2013-9-4上午10:02:19<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
package fes.andy.framework.db.helper;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @包名 :fes.andy.framework.db.helper<br>
 * @文件名 :RsMapEntityHelper.java<br>
 * @类描述 :ResultSet映射到实体Entity的帮助类<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2013-9-4上午10:02:19<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
public class RsMapEntityHelper {
	/**
	 * 
	 * @方法名 :rsMapEntity<br>
	 * @方法描述 :根据结果集(一条数据)映射 到 实体类<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-4上午10:09:16 <br>
	 * @param <T>
	 *            :类型
	 * @param clazz
	 *            :实体的Class
	 * @param rs
	 *            :查询的结果集
	 * @return 返回类型 :T
	 */
	public static <T> T rsMapEntity(Class<T> clazz, ResultSet rs) {
		ResultSetMetaData rsmd = null;
		String temp = "";
		Method s = null;
		T t = null;
		try {
			rsmd = rs.getMetaData();
			if (rs.next()) {
				t = clazz.newInstance();
				for (int i = 1; i <= rsmd.getColumnCount(); i++) {
					temp = rsmd.getColumnName(i);
					s = clazz.getDeclaredMethod(StringHelper
							.asserSetMethodName(StringHelper
									.toJavaAttributeName(temp)), String.class);
					s.invoke(t, rs.getString(temp));
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return t;
	}

	/**
	 * 
	 * @方法名 :resultSetMapToEntityList<br>
	 * @方法描述 :根据结果集(多条数据)映射 到 实体类集合<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-4上午10:11:37 <br>
	 * @param <T>
	 *            :泛型
	 * @param clazz
	 *            :实体类的Class
	 * @param rs
	 *            :查询的结果集
	 * @return 返回类型 :List<T>
	 */
	public static <T> List<T> rsMapToEntityList(Class<T> clazz,
			ResultSet rs) {
		ResultSetMetaData rsmd = null;
		List<T> list = new ArrayList<T>();
		String temp = "";
		Method s = null;
		T t = null;
		try {
			rsmd = rs.getMetaData();
			while (rs.next()) {
				t = clazz.newInstance();
				for (int i = 1; i <= rsmd.getColumnCount(); i++) {
					temp = rsmd.getColumnName(i);
					s = clazz.getDeclaredMethod(StringHelper
							.asserSetMethodName(StringHelper
									.toJavaAttributeName(temp)), String.class);
					s.invoke(t, rs.getString(temp));
				}
				list.add(t);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
		return list;
	}
}

StringStringHelper类:

/**
 * @包名 :fes.andy.framework.db.helper<br>
 * @文件名 :StringHelper.java<br>
 * @类描述 :<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2013-9-3下午12:12:14<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
package fes.andy.framework.db.helper;

/**
 * @包名 :fes.andy.framework.db.helper<br>
 * @文件名 :StringHelper.java<br>
 * @类描述 :Java属性名与Oracle字段名相互转化的帮助类<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2013-9-3下午12:12:14<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
public class StringHelper {
	/**
	 * 
	 * @方法名 :getTableNamePrefixLength<br>
	 * @方法描述 :获取数据库表名前缀的长度,不包含下划线<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-4上午10:34:47 <br>
	 * @return 返回类型 :int
	 */
	private static int getTableNamePrefixLength() {
		return ITable.tableNamePrefix.replace("_", "").length();
	}

	/**
	 * 
	 * @方法名 :toJavaClassName<br>
	 * @方法描述 :将数据库表名转化为Java的实体类名<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-3下午03:06:25 <br>
	 * @param tableName
	 *            :数据库表名
	 * @return 返回类型 :String
	 */
	public static String toJavaClassName(String tableName) {
		String name = toJavaAttributeName(tableName);
		return name.substring(getTableNamePrefixLength());// 去掉表名前缀"mini_t_"
	}

	/**
	 * 
	 * @方法名 :toTableName<br>
	 * @方法描述 :将Java的实体类名转化为数据库表名<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-3下午03:08:46 <br>
	 * @param javaClassName
	 *            :java实体类名
	 * @return 返回类型 :String
	 */
	public static String toTableName(String javaClassName) {
		return ITable.tableNamePrefix + javaClassName;
	}

	/**
	 * 
	 * @方法名 :toJavaAttributeName<br>
	 * @方法描述 :将数据库中列名转化为Java类的属性名(按照Java驼峰标示规范命名)<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-3下午12:16:40 <br>
	 * @param dbColumnName
	 *            :数据库表列名称
	 * @return 返回类型 :String
	 */
	public static String toJavaAttributeName(String dbColumnName) {
		char ch[] = dbColumnName.toCharArray();
		for (int i = 0; i < ch.length; i++) {
			if (i == 0) {
				ch[i] = Character.toLowerCase(ch[i]);
			}
			if ((i + 1) < ch.length) {
				if (ch[i] == '_') {
					ch[i + 1] = Character.toUpperCase(ch[i + 1]);
				} else {
					ch[i + 1] = Character.toLowerCase(ch[i + 1]);
				}
			}
		}
		return new String(ch).replace("_", "");
	}

	/**
	 * 
	 * @方法名 :toDbColumnName<br>
	 * @方法描述 :将Java类的属性名转化为数据库中列名(按照DB规范命名)<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-3下午12:27:30 <br>
	 * @param javaAttributeName
	 *            :Java类的属性名
	 * @return 返回类型 :String
	 */
	public static String toDbColumnName(String javaAttributeName) {
		StringBuffer sb = new StringBuffer(javaAttributeName);
		char[] c = sb.toString().toCharArray();
		byte b = 0;
		int k = 0;
		for (int i = 0; i < c.length; i++) {
			b = (byte) c[i];
			if (b >= 65 && b <= 90) {
				sb.insert((i + k), "_");
				k++;
			}

		}
		return sb.toString().toLowerCase();
	}

	/**
	 * 
	 * @方法名 :asserGetMethodName<br>
	 * @方法描述 :组装Java实体类属性的get方法名<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-3下午01:38:49 <br>
	 * @param attributeName
	 *            :Java类的属性名
	 * @return 返回类型 :String
	 */
	public static String asserGetMethodName(String attributeName) {
		StringBuffer sb = new StringBuffer(16);
		char[] ch = attributeName.toCharArray();
		ch[0] = Character.toUpperCase(ch[0]);
		sb.append("get");
		sb.append(new String(ch));
		return sb.toString();
	}

	/**
	 * 
	 * @方法名 :asserSetMethodName<br>
	 * @方法描述 :组装Java实体类属性的set方法名<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2013-9-3下午01:41:54 <br>
	 * @param attributeName
	 *            : Java类的属性名
	 * @return 返回类型 :String
	 */
	public static String asserSetMethodName(String attributeName) {
		StringBuffer sb = new StringBuffer(16);
		char[] ch = attributeName.toCharArray();
		ch[0] = Character.toUpperCase(ch[0]);
		sb.append("set");
		sb.append(new String(ch));
		return sb.toString();
	}

}

转载于:https://my.oschina.net/andy1989/blog/159067

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值