• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

黄文超

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

通过反射获得JDBC

通过反射获得JDBC

1、一般的jdbc流程

1、加载驱动
2、获得连接
3、指定对应数据库,获取数据给到相应的对象(此时对象是已知的)
4、返回数据

2、通过类加载

代码:

package com.java.dao;

import com.java.bean.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * dao层测试
 */
public class JdbcDao {

    /**
     * 通过反射获取到所以的数据
     * @param cla 反射获得的类
     * @return list 返回一个list集合,就是所有的数据对象
     */
    public List<Object> getAllData(Class cla) {
        String url = "jdbc:mysql://localhost:3306/hc?serverTimezone=UTC";
        String username = "root";
        String password = "123456";
        List list = new ArrayList();
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url,username,password);
            Statement statement = con.createStatement();
            String sql = "select * from student";
            ResultSet resultSet = statement.executeQuery(sql);
            //获取元数据方便后续给类赋值
            ResultSetMetaData metaData = resultSet.getMetaData();
            //获取列的个数
            int columnCount = metaData.getColumnCount();
            String[] columNames = new String[columnCount];
            //将列名存入一个String字符串中

            for (int i=0;i<columnCount;i++) {
                columNames[i] = metaData.getColumnName(i+1);
//                  System.out.println(metaData.getColumnName(i));
            }
            //获取类中所有的方法
            Method[] methods = cla.getDeclaredMethods();
            //获取到这个类
            Constructor constructor = cla.getConstructor();
            Object object = constructor.newInstance();
            while(resultSet.next()) {
                for(Method method:methods) {
                    String name = method.getName();
//                System.out.println(name);
                    for(String columName:columNames) {
                        if(("set" + columName).equalsIgnoreCase(name)) {
                            method.invoke(object,resultSet.getObject(columName));
                            break;
                        }
                    }
                }
            }
            list.add(object);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return list;
    }
}

1、类加载
2、通过传递过来的类,到指定的数据库进行查询(但是需要数据库和bean里面的内容相匹配)
3、从数据库中获取对应的元数据
4、从元数据中获取对应的列名
5、获取到类中的方法
6、遍历元数据的列名,列名与方法名进行匹配,然后将数据赋给Object对象(因为Object对象是所有类的父类)
7、然后最后把数据返回回去。

posted on 2021-03-27 22:22  黄文超  阅读(193)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3