java jdbc ResultSet结果通过java反射赋值给java对象

在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了。

因为很多情况下数据不止一条,所以返回的是对象类的一个集合。

需要注意的地方:在这里,数据库字段命名格式为:user_name 下划线格式,而java类型的命名格式为驼峰命名格式。

具体代码如下:

package com.xc.sap.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import cnblogs.com.ooo0.oracle.OperateOracle;

public class Test {

    public static void main(String[] args) {
        try {
            // oracle数据库连接
            OperateOracle oo = new OperateOracle();//https://www.cnblogs.com/ooo0/p/10225374.html
            Connection connection = oo.getConnection();

            String mainSql = "select * from users";
            PreparedStatement pstm = connection.prepareStatement(mainSql);
            ResultSet rs = pstm.executeQuery();

            ArrayList<Users> putResult = ResultSetPropertiesSimplifyHelps.putResult(rs, Users.class);

            for (int i = 0; i < putResult.size(); i++) {
                System.out.println(putResult.get(i).toString());
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
package com.xc.sap.util;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;

/**
 * java jdbc ResultSet结果通过java反射赋值给java对象
 *
 * @author xc
 */
public class ResultSetPropertiesSimplifyHelps {

    /**
     * 把ResultSet的结果放到java对象中
     *
     * @param <T>
     * @param rs
     *            ResultSet
     * @param obj
     *            java类的class
     * @return
     */
    public static <T> ArrayList<T> putResult(ResultSet rs, Class<T> obj) {
        try {
            ArrayList<T> arrayList = new ArrayList<T>();
            ResultSetMetaData metaData = rs.getMetaData();
            /**
             * 获取总列数
             */
            int count = metaData.getColumnCount();
            while (rs.next()) {
                /**
                 * 创建对象实例
                 */
                T newInstance = obj.newInstance();
                for (int i = 1; i <= count; i++) {
                    /**
                     * 给对象的某个属性赋值
                     */
                    String name = metaData.getColumnName(i).toLowerCase();
                    name = toJavaField(name);// 改变列名格式成java命名格式
                    String substring = name.substring(0, 1);// 首字母大写
                    String replace = name.replaceFirst(substring, substring.toUpperCase());
                    Class<?> type = null;
                    try {
                        type = obj.getDeclaredField(name).getType();// 获取字段类型
                    } catch (NoSuchFieldException e) { // Class对象未定义该字段时,跳过
                        continue;
                    }

                    Method method = obj.getMethod("set" + replace, type);
                    /**
                     * 判断读取数据的类型
                     */
                    if (type.isAssignableFrom(String.class)) {
                        method.invoke(newInstance, rs.getString(i));
                    } else if (type.isAssignableFrom(byte.class) || type.isAssignableFrom(Byte.class)) {
                        method.invoke(newInstance, rs.getByte(i));// byte 数据类型是8位、有符号的,以二进制补码表示的整数
                    } else if (type.isAssignableFrom(short.class) || type.isAssignableFrom(Short.class)) {
                        method.invoke(newInstance, rs.getShort(i));// short 数据类型是 16 位、有符号的以二进制补码表示的整数
                    } else if (type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)) {
                        method.invoke(newInstance, rs.getInt(i));// int 数据类型是32位、有符号的以二进制补码表示的整数
                    } else if (type.isAssignableFrom(long.class) || type.isAssignableFrom(Long.class)) {
                        method.invoke(newInstance, rs.getLong(i));// long 数据类型是 64 位、有符号的以二进制补码表示的整数
                    } else if (type.isAssignableFrom(float.class) || type.isAssignableFrom(Float.class)) {
                        method.invoke(newInstance, rs.getFloat(i));// float 数据类型是单精度、32位、符合IEEE 754标准的浮点数
                    } else if (type.isAssignableFrom(double.class) || type.isAssignableFrom(Double.class)) {
                        method.invoke(newInstance, rs.getDouble(i));// double 数据类型是双精度、64 位、符合IEEE 754标准的浮点数
                    } else if (type.isAssignableFrom(BigDecimal.class)) {
                        method.invoke(newInstance, rs.getBigDecimal(i));
                    } else if (type.isAssignableFrom(boolean.class) || type.isAssignableFrom(Boolean.class)) {
                        method.invoke(newInstance, rs.getBoolean(i));// boolean数据类型表示一位的信息
                    } else if (type.isAssignableFrom(Date.class)) {
                        method.invoke(newInstance, rs.getDate(i));
                    }
                }
                arrayList.add(newInstance);
            }
            return arrayList;

        } catch (InstantiationException | IllegalAccessException | SQLException | SecurityException | NoSuchMethodException | IllegalArgumentException
                | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 数据库命名格式转java命名格式
     *
     * @param str
     *            数据库字段名
     * @return java字段名
     */
    public static String toJavaField(String str) {

        String[] split = str.split("_");
        StringBuilder builder = new StringBuilder();
        builder.append(split[0]);// 拼接第一个字符

        // 如果数组不止一个单词
        if (split.length > 1) {
            for (int i = 1; i < split.length; i++) {
                // 去掉下划线,首字母变为大写
                String string = split[i];
                String substring = string.substring(0, 1);
                split[i] = string.replaceFirst(substring, substring.toUpperCase());
                builder.append(split[i]);
            }
        }

        return builder.toString();
    }

}

参考文章:

https://blog.csdn.net/a975261294/article/details/70049963

优化内容:

1.NoSuchFieldException异常处理,Class对象未定义该字段时,跳过

2.完善了大部分的基本数据类型的取值 http://www.runoob.com/java/java-basic-datatypes.html

原文地址:https://www.cnblogs.com/ooo0/p/10225311.html

时间: 2024-10-27 06:42:06

java jdbc ResultSet结果通过java反射赋值给java对象的相关文章

java jdbc与odbc数据库的连接mysql数据库

1.jdbc连接数据库要添加mysql-connector-java-5.1.38-bin.jar库 2.odbc连接数据库要添加odbc数据源 3.测试代码 DBHelper.java代码jdbc连接数据库 import java.beans.Statement;import java.sql.DriverManager;import com.mysql.jdbc.Connection;import com.mysql.jdbc.PreparedStatement;import com.sun

Java JDBC 操作

1.简介 JDBC(Java DataBase Connectivity) 是一种可用于执行SQL语句的Java API,是一套面向对象的应用程序接口, 统一了数据库的访问方式,数据库厂商提供了实现接口的类,称为'驱动程序'.因此JDBC并不能直接访问数据库, 需要依赖数据库厂商提供的JDBC驱动程序. --SQL语言: 数据定义语言(Data Definition Language,DDL)如:create,alter,drop等 数据操纵语言(Data Manipulation Langua

java jdbc 连接mysql 数据库

JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver").newInstance(); JDBC URL 定义驱动程序与数据源之间的连接 标准语法: <protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<data source identif

java JDBC 的使用总结

一.最原始的使用方式: 1.连接工具类: 抽取工具类:   1.创建一个类,并将其构造方法私有化 2.准备一个空该类的对象,用private修饰 3.向外界提供一个可以获取到该类对象的方法 getIns()(ps:该方法要用static修饰) 4.将加载驱动的代码放到 getIns()中 5.在该类中创建一个可以获得链接对象一个公共的方法 6.在该类中创建一个关闭资源的方法(对于每一个资源的非空判断 需要使用try catch finally结构) 抽取配置文件 解决硬编码: 1.准备一个叫db

Java JDBC下执行SQL的不同方式

Java JDBC简介 ? 数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用,使用Java JDBC API进行编程,可以为多种关系数据库提供统一访问. jdbc的驱动通常有四种类型 ? JDBC-ODPC桥: 它将JDBC API映射到ODPC API.再让JDBC-ODPC调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll) 本地API驱动 直接将JDBC API映射成数据库特定的客

学习Java JDBC,看这篇就够了

JDBC (Java DB Connection)---Java数据库连接 JDBC是一种可用于执行SQL语句的JAVA API(ApplicationProgramming Interface应用程序设计接口).它由一些Java语言编写的类和界面组成. JDBC为数据库应用开发人员和数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯JAVA语言编写完整的数据库应用程序. JDBC代表JAVA数据库连接.它是一个软件层,允许开发者在JAVA中编写客户端/服务器应用. 一.

Java JDBC连接MySQL

简单地JDBC小实例 package com.javaJDBCTest; import java.sql.DriverManager; import java.sql.ResultSet; import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement; public class JDBCTestDemo1 { public static void main(String args[]) throws Exception { /

java 面向对象编程-- 第十三章 反射、类加载与垃圾回收

1.狭义JavaBean规范 Javabean必须包含一个无参数的public构造方法,方便通过反射的方式产生对象. 属性必须都是私有的. Javabean必须包含符合命名规范的get和set方法,以便访问Javabean的属性. Javabean应该是可序列化(serializable)的. 2.反射 在编译时,并不清楚应该加载哪个类.类的加载是在运行期间进行的.通过反射,可以对类进行加载.探知.自审. 可以通过对象.getClass()或者通过类名.class或者通过Class.forNam

Java JDBC高级特性

1.JDBC批处理 实际开发中需要向数据库发送多条SQL语句,这时,如果逐条执行SQL语句,效率会很低,因此可以使用JDBC提供的批处理机制.Statement和PreparedStatemen都实现了批处理.测试表结构如下: Statement批处理程序示例 1 package server; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 impor