项目实战,通过类对象,反射类属性等信息。通过数据库连接信息,获取所有的对象以及结果

依旧是项目内的需求: 基于mysql进行的操作,因为要作为通用产品模型,对接不同地市,就是没有确定的mapper可用。所以采用jdbc去封装。

场景一:

条件:已经根据IDEA的database插件,利用POJO生成对应的实体类。

需求:获取所有表内容 (select * ),list输出。

  

public static final String ENTRY_PATH = "com.ucap.exchange.dataexchange.entity";
    public static List<ComplexResults> getData(Connection conn) {
    //获取实体类包路径
        String packageName = ENTRY_PATH;    //
        Set<String> classNames = getClassName(packageName, false);
        List<ComplexResults> resultList = new ArrayList();
        for (String className : classNames) {
            String tableName = className.substring(className.lastIndexOf(".") + 1);
            String sql = "select * from " + tableName ;
            try {
                Class tableNameClass = Class.forName(className);
                List fserd = queryToObj(tableNameClass, conn, sql);
                for (Object obj : fserd) {
                    ComplexResults complexResults = new ComplexResults(null, tableName, System.currentTimeMillis(), ExchangeConstants.INSERT, obj, null);
                    resultList.add(complexResults);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return resultList;
    }
/** * @param <T>   封装对象的泛型 * @param clazz 实体类对象 * @param sql   sql语句 * @return list */public static <T> List<T> queryToObj(Class<T> clazz, Connection conn, String sql) {    try {        // 1. 获取结果集        PreparedStatement ps = conn.prepareStatement(sql);        ResultSet rs = ps.executeQuery();

        // 2. 将查询的结果和字段名称获取 获取所有的字段        ResultSetMetaData metaData = rs.getMetaData();

        // 用来保存对象的        ArrayList<T> cols = new ArrayList<>();        while (rs.next()) {            // 创建对象            T obj = clazz.newInstance();            for (int i = 1; i <= metaData.getColumnCount(); i++) {                // 通过反射获取对应的字段                Field filed = clazz.getDeclaredField(metaData.getColumnLabel(i).toLowerCase());                filed.setAccessible(true);                Object value = rs.getObject(metaData.getColumnLabel(i));                filed.set(obj, value);            }            cols.add(obj);        }        return cols;    } catch (Exception e) {        e.printStackTrace();    }    return null;}

/** * 获取某包下所有类 * * @param packageName 包名 * @param isRecursion 是否遍历子包 * @return 类的完整名称 */public static Set<String> getClassName(String packageName, boolean isRecursion) {    Set<String> classNames = null;    ClassLoader loader = Thread.currentThread().getContextClassLoader();    String packagePath = packageName.replace(".", "/");

    URL url = loader.getResource(packagePath);    if (url != null) {        String protocol = url.getProtocol();        if (protocol.equals("file")) {            classNames = getClassNameFromDir(url.getPath(), packageName, isRecursion);        } else if (protocol.equals("jar")) {            JarFile jarFile = null;            try {                jarFile = ((JarURLConnection) url.openConnection()).getJarFile();            } catch (Exception e) {                e.printStackTrace();            }

            if (jarFile != null) {                getClassNameFromJar(jarFile.entries(), packageName, isRecursion);            }        }    } else {        /*从所有的jar包中查找包名*/        classNames = getClassNameFromJars(((URLClassLoader) loader).getURLs(), packageName, isRecursion);    }

    return classNames;}
 
ComplexResults 是我封装的一个结果集对象,显式写一个构造方法,new对象时,生成实例用的。
queryToObj 方法,根据sql查询结果集获取结果 getMetaData(),再通过反射获取对应的字段 key,利用sql结果集 Set.getObject(key),获取值,把结果进行封装返回。
getClassName 方法,根据包路径获取包下对应实体对象放入set集合。

场景二:优化版。(去掉了实体类的绑定)

条件:已有数据库连接,动态扫描表结构。无实体类。

需求:获取所有表内容 (select * ),list输出。

  public static final String EXCLUDE_TABLE = "sys_datachange_log";
  public static List<ComplexResults> getData(Connection conn) throws SQLException {

        DatabaseMetaData dbmd = conn.getMetaData();
//        获取所有表            //获取数据库实例
        String catalog = conn.getCatalog();
        List<String> stringList = new ArrayList<>();      //获取所有的表对象
        ResultSet tableRet = dbmd.getTables(catalog, null, null, new String[]{"TABLE"});
        while (tableRet.next()) {
            stringList.add(tableRet.getString("TABLE_NAME"));
        }
        List<ComplexResults> resultList = new ArrayList();
        for (String m_TableName : stringList) {
            if (!EXCLUDE_TABLE.equals(m_TableName)) {
                String columnName;
                String columnType_Sql;
                String columnType_Java;          //获取表内的列,属性等信息
                ResultSet colRet = dbmd.getColumns(catalog, "%", m_TableName, "%");
                Map sqlResultsMap = new HashMap();
                while (colRet.next()) {
                    columnName = colRet.getString("COLUMN_NAME");
                    columnType_Sql = colRet.getString("TYPE_NAME");

                sqlResultsMap.put(columnName,columnType_Sql);
            }
                String sql = "select * from " + m_TableName;
                List<Entity> entityList = SqlExecutor.query(conn, sql, new EntityListHandler());
                for (Entity entity : entityList) {
                    ComplexResults complexResults = new ComplexResults(null, m_TableName, System.currentTimeMillis(), ExchangeConstants.INSERT, entity, sqlResultsMap);
                    resultList.add(complexResults);
                }
            }
        }
        return resultList;

    }
EXCLUDE_TABLE 此表是一个日志表,不需要获取内容。合理的利用了java.sql包下的 一些方法。再写第二个实现的时候,我对结果集对象 ComplexResults类 进行了修正,以便后面的逻辑更加方便使用。
 

原文地址:https://www.cnblogs.com/justtodo/p/11990759.html

时间: 2024-08-19 20:41:29

项目实战,通过类对象,反射类属性等信息。通过数据库连接信息,获取所有的对象以及结果的相关文章

通过反射获取某个对象下的属性值,或通过父类获取

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; /** * 通过反射获取某个对象下的属性值,或通过父类获取 * User: wangyongfei * Date

python中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

类对象.类属性与实例对象.实例属性的区别 在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性.类属性在内存中只有一份,在__init__外部定义. 通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性.实例属性在各自对象的内存中都保存一份,在__init__方法内部定义. 实例方法.类方法.静态方法的区别 这三种方法都是保存在类的内存中,调用者不同. 实例方法由对象调用,至少一个self参数,self代表对象的引用. 类方法有类调用,至少一个cls参数,并且

PHP的反射类ReflectionClass、ReflectionMethod使用实例

PHP5 具有完整的反射API,添加对类.接口.函数.方法和扩展进行反向工程的能力. 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类.方法.属性.参数等的详细信息,包括注释.这种动态获取的信息以及动态调用对象的方法的功能称为反射API.反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用. 其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言. PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注

php反射类 ReflectionClass

什么是php反射类,顾名思义,能够理解为一个类的映射.举个样例: class fuc {        //定义一个类static function ec() {echo '我是一个类';}}$class=new ReflectionClass('fuc');    //建立 fuc这个类的反射类 echo $class; //输出这反射类 Class [ class A ] { @@ F:\phpweb\myPHP\test.php 23-30 - Constants [0] { } - St

C# 反射之属性操作

一.反射-类操作 //1.获取对象所有的属性名 Student stu = new Student(); //获取当前类名称 Console.WriteLine(stu.GetType().Name); //命名空间 和名称 Console.WriteLine(stu.GetType().FullName); //2.指定类型,动态创建对象 Student stu2 = Activator.CreateInstance<Student>(); Console.WriteLine(stu2.To

第二百五十节,Bootstrap项目实战--响应式导航

Bootstrap项目实战--响应式导航 学习要点: 1.响应式导航 一.响应式导航 基本导航组件+响应式 第一步,声明导航区域,设置导航默认样式,设置导航条固定在顶部navbar样式class类,写在导航<nav>里,声明导航区域(项目实战Bootstrap)navbar-default样式class类,写在导航<nav>里,设置导航默认样式(项目实战Bootstrap)navbar-fixed-top样式class类,写在导航<nav>里,设置导航条固定在顶部(项目

使用 Date 和 SimpleDateFormat 类表示时间、Calendar类和Math类

一. Date 和 SimpleDateFormat类表示时间 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类.这个类最主要的作用就是获取当前时间,我们来看下 Date 类的使用: 使用 Date 类的默认无参构造方法创建出的对象就代表当前时间,我们可以直接输出 Date 对象显示当前的时间,显示的结果如下: 其中, Wed 代表 Wednesday (星期三), Jun 代表 June (六月), 11 代表 11 号, CST 代表

Java 中常用的类:包括基本类型的包装类、Date 类、SimpleDateFormat 类、 Calendar 类、 Math 类

JAVA中的包装类 包装类里没有String,它是引用数据类型 基本类型是不能调用方法的,而其包装类具有很多方法 包装类主要提供了两大类方法: 1. 将本类型和其他基本类型进行转换的方法 2. 将字符串和本类型及包装类互相转换的方法 基本类型 对应的包装类 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean Integer m=new Intege

遍历JavaScript某个对象所有的属性名称和值

1 /* 2 * 用来遍历指定对象所有的属性名称和值 3 * obj 需要遍历的对象 4 */ 5 function allPrpos(obj) { 6 // 用来保存所有的属性名称和值 7 var props = ""; 8 // 开始遍历 9 for(var p in obj){ 10 // 方法 11 if(typeof(obj[p])=="function"){ 12 obj[p](); 13 }else{ 14 // p 为属性名称,obj[p]为对应属性

JSP 获取Spring 注入对象

<%@ page import="org.springframework.web.context.support.WebApplicationContextUtils"%> <%@ page import="org.springframework.context.ApplicationContext"%> ServletContext sc = this.getServletConfig().getServletContext(); Appl