关于对象关系映射(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;
}

  

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

  1. java中集合Collection转list对象

    参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...

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

    原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...

  3. Java中创建(实例化)对象的五种方式

    Java中创建(实例化)对象的五种方式1.用new语句创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3.运用反 ...

  4. 使用java中的反射获得object对象的属性值

    知识点:使用java中的反射获得object对象的属性值 一:场景 这两天开发代码时,调用别人的后台接口,返回值为Object对象(json形式的),我想获得object中指定的属性值,没有对应的ge ...

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

    1.mutable(可变)和immutable(不可变)类型的区别 可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改. 不可变数据类型:其内部的操作不会改变内部的值,一旦试图 ...

  6. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  7. java中的几种架构对象(PO,VO,DAO,BO,POJO)

    java中的几种对象(PO,VO,DAO,BO,POJO)   一.PO :(persistant object ),持久对象 可以看成是与数据库中的表相映射的java对象.使用Hibernate来生 ...

  8. JAVA中利用反射机制进行对象和Map相互转换的方法

    JAVA的反射机制主要作用是用来访问对象的属性.方法等等.所以,JAVA中对象和Map相互转换可以利用JAVA的反射机制来实现.例子如下: 一.对象转Map的方法 public static Map& ...

  9. Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?

    Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Integer),包装类自然就是对象了. 基本类型一直都是Java语言的一部分,这主要是基于程序性能的考量, 基本 ...

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

    对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2 ...

随机推荐

  1. 基于 Github 平台的 .NET 开源项目模板 - 发布与归档 相关

    CHANGELOG.md 案例 ## [1.0.1.2] - 2023-03-10 ### myproject2 _ 1.0.1: - 初步版本 简单实现 还未优化 - fix warning ## ...

  2. pycharm配置默认镜像地址

    使用pycharm编写接口自动化测试时,需要下载很多安装包,不指定镜像时下载可能很慢,可以设置默认镜像 命令:pip config set global.index-url 镜像地址 查看已设置的默认 ...

  3. 鸿蒙NEXT开发案例:随机数生成

    [引言] 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表.生成的结果可以通过点击"复制"按钮复制到剪 ...

  4. Java根据前端返回的字段名进行查询数据的方法

    在Java后端开发中,根据前端返回的字段名动态查询数据库是一种常见的需求.这种需求通常通过使用反射和动态SQL来实现.下面是一个完整的代码示例,它展示了如何根据前端返回的字段名动态查询数据库中的数据. ...

  5. Java的多线程编程模型5--从AtomicInteger开始(自增长实现)

    AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicIn ...

  6. SAX,DOM,JAXP,JDOM,DOM4J比较分析

    第一:首先介绍一下SAX,DOM,JAXP,JDOM,DOM4J的基本知识:(注意:至于 JAXP JAXB JAXM JAXR JAX-RPC 分别指什么,查看http://gceclub.sun. ...

  7. Linux 文件删除空间没有释放问题

    最近阿里云频频告警.磁盘使用率飙升90%以上.遂查看磁盘使用情况 df -h 发现使用率却是很高 之后,通过du -h --max-depth=1 / 查看哪个目录下占用的资源较多并进行删除 后来发现 ...

  8. 使用联邦学习法训练强化学习算法以实现对抗攻击性:读论文——小型微型计算机系统(中文CCF B)《面向深度强化学习的鲁棒性增强方法》

    论文地址: http://xwxt.sict.ac.cn/CN/Y2024/V45/I7/1552 PS: 这个学习率有些奇怪,用数据量占一次优化的总数据量的大小作为学习率,这或许也是真的有独创性的操 ...

  9. 树莓派设置CPU运行的核心数为3,保留核心4号

    具体步骤:1.打开终端,输入 sudo nano /boot/cmdline.txt2.在第一行最后空一格加上isolcpus=33.保存

  10. 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器

    1.前言 我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化.本章将要介绍的就是:@Pr ...