Java中ResultSet数据自动填充到类中&类实例填充PreparedStatement

需求:

(1)提取ResultSet中值到一个类中挺麻烦的,需要new一个变量,使用对应成员的Set方法赋值,能不能根据类的Class,直接提取出ResultSet中的数据,最后返回实例化的类?

(2)可以用PreparedStatement预编译带变量的sql语句,在execute之前需要将变量值填充进去,一个一个设置太麻烦了,能不能提供一个类变量,使用类成员变量的值自动填充PreparedStatement?

这样的功能许多开源的框架可以实现,但是不想因为这么一点点的需求去学习那么庞大的一套框架,于是自己实现了一下,总结下自己的实现思路。

实现这套框架下面两个问题是必须考虑到的:

数据库表的字段名称可能和类的成员名称不一样。举个例子数据库表中经常有这样的命名modify_time,在类中很少会使用下划线,一般倾向于modifyTime这样的命名方式。

预编译的sql语句中变量的顺序和类中成员变量的顺序可能会不同。

怎么将类成员的值对应到预编译好的PreparedStatement中对应的变量上。

解决问题1和问题2的方法是为类成员提供别名,使用java中的Annotation(标注)机制,标注接口如下:

1 @Target(ElementType.FIELD)

2 @Retention(RetentionPolicy.RUNTIME)

3 public @interface Column {

4     String value();

5 }

标注的例子:

public class Work extends WorkAbstraction{

    @Column(value = "coop_type")
    private Integer coopType;

    private String subtitle;
    private String coworker;
    private String tutor;

    @Column(value = "create_time")
    private String createTime;

    @Column(value = "modify_time")
    private String modifyTime;
    private String content;
}

在数据库中有一个work表,有一个字段名是modify_time,对应实体类Work中相应字段被命名为modifyTime,使用@Column(value = "modify_time")为属性modifyTime提供别名modify_time,对于没有别名的属性,默认其和ResultSet中的列名称相同。

仅仅提供别名是不够的,从ResultSet中可以获取到查询结果的列名称字段,此时如果想要将ResultSet中的数据填充到某个class中,还需要一个数据结构:

HashMap<Class<?>,HashMap<String,Field>> mappingPools;

HashMap的主键是数据类的Class,HashMap的Value还是一个Map,HashMap<String,Field>,该Map的主键是类中成员变量的别名,value是java反射类型Field,利用java反射机制就可以很容易通过Field向数据类填充数据。

接下来的问题就是已知class,怎么解析出上面的HashMap结构,代码如下:

public class BeanMappingPool {
    private static Lock lock = new ReentrantLock();
    private static HashMap<Class<?>,HashMap<String,Field>> mappingPools;
    static{
        mappingPools = new HashMap<Class<?>,HashMap<String,Field>>();
    };
    public static HashMap<String,Field> GetFieldsMap(Class<?> objClass){
        if(mappingPools.get(objClass) != null)
            return mappingPools.get(objClass);
        lock.lock();
        if(mappingPools.get(objClass) != null){
            lock.unlock();
            return mappingPools.get(objClass);
        }
        HashMap<String,Field> pools = new HashMap<String,Field>();
        for(;objClass != Object.class; objClass = objClass.getSuperclass())
            for(Field f: objClass.getDeclaredFields()){
                f.setAccessible(true);
                Column col = f.getAnnotation(Column.class);
                if(col != null)
                    pools.put(col.value(), f);
                else
                    pools.put(f.getName(), f);
            }
        mappingPools.put(objClass, pools);
        lock.unlock();
        return pools;
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索resultset的...
, string
, private
, 变量
, 成员变量的使用问题
, resultset
, 一个
成员
java 自动填充网页、java resultset、java resultset 遍历、java resultset 行数、java.sql.resultset,以便于您获取更多的相关知识。

时间: 2025-01-01 02:39:17

Java中ResultSet数据自动填充到类中&amp;类实例填充PreparedStatement的相关文章

c#-如何把datagridview中的数据保存到SQL数据库中?VB.NET或C#

问题描述 如何把datagridview中的数据保存到SQL数据库中?VB.NET或C# 如下图:已经实现从EXCEL导入数据到Datagridview中,现在要把其中的数据保存到数据库的AAAie表里面.请用代码说明,谢谢. 解决方案 取数据用ado.net保存到SQL Server数据库.http://blog.csdn.net/lysc_forever/article/details/7697536 解决方案二: 方法1.创建一个数据库,表,表名自取,表的字段和Excel相同,取Excel

如何从sqlite数据库中获取数据并显示在listview中?

问题描述 如何从sqlite数据库中获取数据并显示在listview中? 在登录页面后,我想在listview中把Apple显示成A,Boy显示成B等等,直到F.但是在程序中当我完全登录后,只有登录表成功创建,主菜单还是没有创建. 我想在test database中创建主菜单,然后我想从主菜单表(mainmenu table)中获取数据再显示在listview中. 我使用了下面的代码: if(username.length()>0&&password.length()>0) {

mysql-MySQL数据库从表1(table1)中导出数据到(table2)中。会有多列。

问题描述 MySQL数据库从表1(table1)中导出数据到(table2)中.会有多列. table1 字段:id name url table2: 需要获取 table1 中的id url 请问怎样实现? 用sql实现的时候需要注意字段名字和顺序吗? 解决方案 字段名称随便,但是要对应起来,包括类型. create table table2 ( id int primary key, name varchar(20), ) insert into table2(id,name) select

关于从oracle 数据库中导出数据到csv格式文件中

问题描述 关于从oracle 数据库中导出数据到csv格式文件中 最近有个任务是从oracle中导出数据到csv 中的,因为数据库中的数据比较多,大概30万条,请问下,有哪个大神做个这种的,能不能导入这么大的数据 解决方案 将数据从DataGridView中导出成CSV格式文件oracle数据库的表数据导出为csv文件oracle数据库怎么导入csv格式文件呢 解决方案二: 不可以,分批导就行了 解决方案三: 可以使用常用的连接数据库的工具进行导入和导出,导出的时候导出行号,导入的时候建个表,行

从数据库中取得数据,复选框中与之相等则选中

问题描述 从数据库中取得数据,复选框中与之相等则选中 从数据库中取得数据,后台返回的值与前台复选框的值一致则复选框默认被选中(使用aashx处理界面) 解决方案 取到数据后 循环你要更改的 复选框,值相同的 就选中 checked 解决方案二: 用js搞就好了..你的ashx是返回数据源的吧,处理界面是什么东东.. <input type="checkbox" name="ck" value="1" />1 <input typ

c++怎样从txt文档中读取数据写入到三维矩阵中

问题描述 c++怎样从txt文档中读取数据写入到三维矩阵中 用MATLAB获取了一幅彩色图像的像素值,得到一个400*300*3的三维矩阵,并保存到txt文档中,怎么写一个c++小程序,把txt中的数据写入到一个三维矩阵中? %读取第k个图像,所有像素 srcImg = imread(fullfile(SRC, srcName)); %保存像素值到txt文档,便于C++测试使用 fid = fopen('JPEG2TXT.txt', 'wt+'); if fid == -1, return, e

jsp-后台LIST中的数据如何在前台JSP中获得

问题描述 后台LIST中的数据如何在前台JSP中获得 我在后台的LIST中存放了custom_name,custom_phone,custom_email,custom_address四个值,怎么在前台JSP页面已经有的文本框中分别显示出来,不用foreach怎么实现(因为在JSP页面中我的文本框要一直显示出来,如果用foreach那么需要点击以后文本框才会显示) 最好直接给我代码,在下新手请多多包含 解决方案 用ajax获取后台的list数据,然后转换为json类型,再循环将对应的值放入到对应

请各位一下.如何将C#中的数据网格表中的数据导到EXCEL表中?

问题描述 请各位一下.如何将C#中的数据网格表中的数据导到EXCEL表中? 解决方案 解决方案二:是GridView导出EXCEL吗?解决方案三:从网上找到的,引用Excel库usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem

kindeditor sql-如何将kindeditor中的数据保存到SQL数据库中

问题描述 如何将kindeditor中的数据保存到SQL数据库中 主要就是我从数据库中读取了数据,然后显示在页面上.然后我在页面上通过kindeditor修改了那些数据.要怎么再保存进SQL数据库 解决方案 直接关闭即可以保存内容