Query 查询 封装 sql 传入进来 stu 改成 泛型
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
public class Demo02 {
//@Test
public <T> List<T> query(String sql,Class<T> clazz,Object [] params) {
//返回值用list接收
List<T> list = new ArrayList<T>();
//1.获取conn
Connection conn = JDBCUtils.getConn();
PreparedStatement ps = null;
ResultSet rs = null;
try {
//2.获取执行sql语句的对象
ps = conn.prepareStatement(sql);
//3.设置参数
if (params != null && params.length > 0) {
//通过循环遍历每一个参数
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1 , params[i]);
}
}
//4.执行查询
rs = ps.executeQuery();
//5.获取rs中列的信息
ResultSetMetaData rsmd = rs.getMetaData();
//获取rs数据集中所有列 getColumnCount
while (rs.next()) {
T t = clazz.newInstance();
Map<String, Object> map = new HashMap<String, Object>();
//拿到列的字段 key
int columnCount = rsmd.getColumnCount();
for (int i = 0; i < columnCount; i++) {
//获取每列的字段 key
String key = rsmd.getColumnName(i + 1);
//获取每字段对应的属性
Object value = rs.getObject(key);
//把获取的字段存到 map
map.put(key, value);
}
//把map转成JavaBean对象
t = mapToJavaBean(map,clazz);
list.add(t);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return list;
}
/**
* 通过 反射 把map转成 java对象
* @param <T>
* @param map
* @param clazz
* @throws IllegalAccessException
* @throws InstantiationException
*/
private <T> T mapToJavaBean(Map<String, Object> map, Class<T> clazz) throws InstantiationException, IllegalAccessException {
//创建一个无参的的构造
T t = clazz.newInstance();
//拿到clazz对象中所有的属性
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs) {
//通过属性拿到map中的值
String key = f.getName();
Object value = map.get(key.toUpperCase());
//获取的私有构造进行暴力访问
f.setAccessible(true);
//反射操作属性
if (f.getType() == int.class) {//类型和数据中的类型进行判断
int val = Integer.valueOf(value.toString());
f.set(t, val);
}
if (f.getType() == String.class) {//类型和数据中的类型进行判断
f.set(t, value);
}
}
return t;
}
@Test
public void name() {
List<Stu> list = query("select * from t_stu", Stu.class, null);
System.out.println(list);
}
}