通过反射获得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、然后最后把数据返回回去。