Java中,将ResultSet映射为对象和队列及其他辅助函数

关于对象关系映射(ORM)在数据库访问中用到的最多,在Java中,很多库都试图将一个ResultSet映射为一个自定义的Java Bean对象或队列,下面是我的实现

1 从ResultSet中读取数据

首先是,如何能正确的从ResultSet中读取到自己想要的数据,包括已知列序号和已知列名的情况.

已知列序号,读取ResultSet中的数据值:

public static <T> T ReadValue(Class<T> t, ResultSet set, int columnIndex) throws SQLException;

已知列名,读取 ResultSet中的数据值:

public static <T> T ReadValue(Class<T> t, ResultSet set, Map<String, Integer> columns, String field)

columns中存储这列索引与列名的对应关系,如果该参数为空,则自己创建这样一个队列.

下面是实现

	/**
	 * 取得ResultSet中的值
	 * @param t
	 * @param set
	 * @param columnIndex
	 * @return
	 * @throws SQLException
	 */
	@SuppressWarnings("unchecked")
	public static <T> T ReadValue(Class<T> t, ResultSet set, int columnIndex) throws SQLException {
		if (t == null || set == null) {
			return null;
		}

		if (t == Object.class) {
			return (T)set.getObject(columnIndex);
		}
		if (t == Integer.class) {
			Object val = set.getInt(columnIndex);
			return (T)val;
		}
		if (t == short.class) {
			Object val = set.getShort(columnIndex);
			return (T)val;
		}
		if (t == Boolean.class) {
			Object val = set.getBoolean(columnIndex);
			return (T)val;
		}
		if (t == long.class) {
			Object val = set.getLong(columnIndex);
			return (T)val;
		}
		if (t == float.class) {
			Object val = set.getFloat(columnIndex);
			return (T)val;
		}
		if (t == double.class) {
			Object val = set.getDouble(columnIndex);
			return (T)val;
		}
		if (t == String.class) {
			Object val = set.getString(columnIndex);
			return (T)val;
		}
		if (t == java.sql.Date.class) {
			Object val = set.getDate(columnIndex);
			return (T)val;
		}
		if (t == java.sql.Time.class) {
			Object val = set.getTime(columnIndex);
			return (T)val;
		}
		if (t == java.sql.Timestamp.class) {
			Object val = set.getTimestamp(columnIndex);
			return (T)val;
		}
		if (t == Byte.class) {
			Object val = set.getByte(columnIndex);
			return (T)val;
		}
		return (T)set.getObject(columnIndex);
	}

  

/**
	 * 取得ResultSet中的值
	 * @param t
	 * @param set
	 * @param columns
	 * @param field
	 * @return
	 * @throws SQLException
	 */
	public static <T> T ReadValue(Class<T> t, ResultSet set, Map<String, Integer> columns, String field) throws SQLException {
		if (columns == null) {
			columns = GetFieldIndex(set);
		}
		if (columns == null) {
			return null;
		}
		if (!columns.containsKey(field)) {
			return null;
		}

		int index = columns.get(field);
		return ReadValue(t, set, index);
	}

  

	/**
	 * 取得列名对应的列索引
	 * @param set
	 * @return
	 * @throws SQLException
	 */
	public static Map<String, Integer> GetFieldIndex(ResultSet set) throws SQLException {
		if (set == null) {
			return null;
		}
		ResultSetMetaData meta = set.getMetaData();
		if (meta == null) {
			return null;
		}
		Map<String, Integer> map = new HashMap<String, Integer>();
		int count = meta.getColumnCount();
		for (int i = 0; i < count; i++) {
			map.put(meta.getColumnName(i), i);
		}
		return map;
	}

  其实GetFieldIndex还是可以扩展的,例如包含数据的类型,暂时不需要,也没有进行扩展.

2 数据到对象的映射

下面是数据到对象的映射

接口:

/**
	 * 根据ResultSet装载对象
	 * @param cls
	 * @param t
	 * @param set
	 * @param columns
	 * @return
	 * @throws SQLException
	 */
	public static <T> boolean FillObject(Class<T> cls, T t, ResultSet set, Map<String, Integer> columns) throws SQLException

 实现:

	/**
	 * 根据ResultSet装载对象
	 * @param cls
	 * @param t
	 * @param set
	 * @param columns
	 * @return
	 * @throws SQLException
	 */
	public static <T> boolean FillObject(Class<T> cls, T t, ResultSet set, Map<String, Integer> columns) throws SQLException {
		if (cls == null || t == null || set == null) {
			return false;
		}

		if (columns == null) {
			columns = GetFieldIndex(set);
		}

		final Map<String, Integer> cols = columns;
		return HiCBO.FillObjectEx(t, cls, new IEventRet8Param<Object, String>(){
			@Override
			public final Object OnEvent(String v) {
				try {
				return ReadValue(Object.class, set, cols, v);
				} catch (Exception ex) {
					ex.printStackTrace();
					return null;
				}
			}
		});
	}

  

/**
	 * 创建并装载对象数据
	 * @param cls
	 * @param set
	 * @return
	 */
	public static <T> T CreateObject(Class<T> cls, ResultSet set, Map<String, Integer> columns) {
		try
		{
			T t = cls.newInstance();
			FillObject(cls, t, set, columns);
			return t;
		} catch (Exception ex) {
			ex.printStackTrace();
			return null;
		}
	}

  注: CreateObject中,如果T没有默认构造函数,则会存在问题,编译时期不会进行错误提示,这一点需要注意.

取得队列:

/**
	 * 取得Set的列表
	 * @param cls
	 * @param set
	 * @return
	 * @throws SQLException
	 */
	public static <T> List<T> GetResultsList(Class<T> cls, ResultSet set) throws SQLException {
		if (cls == null || set == null) {
			return null;
		}		

		Map<String, Integer> columns = GetFieldIndex(set);
		if (columns == null) {
			return null;
		}
		if (!set.first()) {
			return null;
		}

		List<T> list = new ArrayList<T>();
		T t = GetFirst(cls, set, columns);
		if (t != null) {
			list.add(t);
		}
		while (set.next()) {
			T it = CreateObject(cls, set);
			if (it != null) {
				list.add(it);
			}
		}
		return list;
	}

  

时间: 2024-10-07 22:46:37

Java中,将ResultSet映射为对象和队列及其他辅助函数的相关文章

Java中Comparable和Comparator实现对象比较

1.通过Comparable实现排序 package Comparable; import java.util.Arrays; public class ComparableUser implements Comparable<ComparableUser> { private String id; private int age; public ComparableUser(String id, int age) { this.id = id; this.age = age; } publi

(转)Java 中关于String的空对象(null) ,空值(empty),空格

原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例化该对象,因此,空对象在调用所有对象方法时候都会抛出异常,如s.length(), s.isEmpty()等方法. 空值: String k = ""; 空值是指一个字符床对象已经实例化,即系统已经给该变量分配了空间,只是对象的内容为空. 空格: String n = " &qu

Java中的mutable和immutable对象实例讲解

1.mutable(可变)和immutable(不可变)类型的区别 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改. 不可变数据类型:其内部的操作不会改变内部的值,一旦试图更改其内部值,将会构造一个新的对象而非对原来的值进行更改. 2.mutable和immutable类型的优缺点   mutable immutable 优点 可变类型会减少数据的拷贝次数,从而其效率 要高于immutable 由于内部数据不可变,所以对其频发修改会产生大量的临时拷贝,浪费空间 缺点

java中的战斗机——类与对象

1. java语言的特点——面向对象编程.万物皆对象,每个对象,我们会编写一个类来描述对象的行为和属性,类是对象的描述,对象是类的实例. 2.实例化对象,在java中,new关键字用于实例化一个对象,new运算符在内存中创建一个对象并且返回对新创建的对象的一个引用. 3. this关键字.每个对象都能使用this来引用本身,如果一个类的方法需要访问该类本身的成员变量或者其他方法,就应该用this引用. 4.本章是个难点,比较的抽象,希望在以后能把他们的关系搞透彻. 5.java学习,行且益坚,再

Java中如何判断两个对象是否相等(Java equals and ==)

原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解equals和hashCode方法: 1.equals的作用及与==的区别. 2.hashcode的作用及与equals的关系. 1.equals的作用及与==的区别. equals被用来判断两个对象是否相等. equals通常用来比较两个对象的内容是否相等,==用来比较两个对象的地址是否相等. e

Java中四种遍历Map对象的方法

方法一:在for-each循环中使用entry来遍历,通过Map.entrySet遍历key和value,这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for(Map.Entry<Integer,Integer> entry:map.entrySet()){ System.out.println("key="

学习java中对《类与对象》的认知

在学习<类与对象>章节中,我们知道了面向对象的编程语言中,类是一个独立的程序单位,是具有相同属性和方法的一组对象的集合, 在 Java 程序中,自定义类的一般格式为: class 类名 { 数据成员1 数据成员2 数据成员3 …… 成员方法1 成员方法2 } 类的说明部分由关键字 class 与类名组成,注意的是类名的命名遵循 Java 标识符的定义规则.类体是类声明中花括号所包括的全部内容,它又是由成员变量(属性)和成员方法(方法)两部分组成. 说了类,接着就是对象的剖知了,对象是把客观世界

Java 中的resultset详解

结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据的方法主要是getXXX() ,他的参数可以使整型表示第几列(是从1开始的),还可以是列名.返回的是对应的XXX类型的值.如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false. 使用getString()可以返回所有的列的

java中四种引用类型(对象的强、软、弱和虚引用)

对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出O