如何使用Java反射机制实现对任意表的任意查询结果的封装

2020-10-14 20:00发布

5条回答

/**

* 通用查询:

* 实现对任意表的任意查询

* @param 形参泛型:

* 声明了一个泛型,相当于方法的形参,方法调用时传入实参泛型,相当于一个占位符

* @param cls 类对象

* @param sql

* @param params:Sql占位符的值

* @return 多行/单行数据都可以封装到一个List中

*/

public static List generalQuery(Class cls,

String sql,Object... params){ 

List list = new ArrayList<>();

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

try {

conn = DBUtil.getConnection();

pstmt = conn.prepareStatement(sql);

//给占位符赋值

// params的长度为多少:表示就有几个?

for (int i = 0; i < params>

// 注意占位符的下标从1开头

pstmt.setObject(i+1, params[i]);

}

rs = pstmt.executeQuery();

while (rs.next()) {

// 数据库的一行记录对应一个Java对象

X x = cls.newInstance();

// 从ResultSet中取出的数据封装到x对象中 :

// 使用反射给x对象的属性赋值

// 获取属性名:列名和属性名相同  

// 获取列名:通过ResultSetMetaData(封装了列的所有信息)

ResultSetMetaData md = rs.getMetaData();

// 获取列总数

int columnCount = md.getColumnCount();

// 有多少列就给多少属性赋值:一个列对应一个属性

// columnNo:列名

for (int columnNo = 1; columnNo <= columnCount; columnNo++) {

// 通过列号获取列名

String columnName = md.getColumnName(columnNo);

// 使用反射给属性赋值

Field field = cls.getDeclaredField(columnName);

field.setAccessible(true);

field.set(x,  rs.getObject(columnName));

}

//最终把取出的一行添加到List中

list.add(x);

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return list;

}

一周热门 更多>