利用反射技术将查询结果封装为对象

Posted 星朝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用反射技术将查询结果封装为对象相关的知识,希望对你有一定的参考价值。

public class ORMTest extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建sql语句
String sql = "select username as Username,password as Password from user where id<?";
//创建个数组,用于给sql语句中的sql赋值
Object obj[] = new Object[]{1020};
try {
//调用getObject方法得到一个Object对象的集合
List<Object> list = getObject(sql, obj, User.class);
//将list存在request域中
request.setAttribute("list", list);
//转发到index.jsp页面
request.getRequestDispatcher("/index.jsp").forward(request, response);
} catch (InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException e) { e.printStackTrace();
}

}
static List<Object> getObject(String sql,Object obj[],Class clazz) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Connection conn=null;
PreparedStatement ps = null;
ResultSet rs = null;
JDBCUtils utils = JDBCUtils.getInstance();
List<Object> list = new ArrayList<>();
try {
conn = utils.getConnection();
ps = conn.prepareStatement(sql);
//获取参数的元数据
ParameterMetaData pmd = ps.getParameterMetaData();
//获取?个数
int count = pmd.getParameterCount();
//将数组中的元素对应的赋值给sql中的?
for(int i=1;i<=count;i++){
ps.setObject(i, obj[i-1]);
}
//执行sql
rs=ps.executeQuery();
//得到传进来的Bean的所有方法
Method ms[] = clazz.getMethods();
//遍历结果集
while(rs.next()){
//得到结果集元数据
ResultSetMetaData rsmd = rs.getMetaData();
//得到一个结果集的列数
int columnCount = rsmd.getColumnCount();
//得到bean的实例对象
Object object = clazz.newInstance();
//遍历结果集的列
for(int i=1;i<=columnCount;i++){
String columnLabel =rsmd.getColumnLabel(i);//得到列的别名
//得到别名后 可以得到这个列的bean的set方法
String methodName = "set"+columnLabel;
//遍历bean的所有方法
for (Method method : ms) {
//如果有和这个列的set方法相同的方法 if(method.getName().equals(methodName)){
//就将数据库查出来的这个列的值付给这个bean
method.invoke(object, rs.getObject(columnLabel));
}
}
}
//将这个bean添加到集合中 list.add(object); } } catch (SQLException e) {
e.printStackTrace();
}finally{
utils.free(conn, ps, rs);
}
return list;
}

}

//bean
public class User {
public User() {

}

public int id;
public String username;
public String password;
public String sex;
public String age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}

@Override
public String toString() {
return "id="+this.id+"username="+this.username+"password="+this.password
+"age="+this.age+"sex:"+this.sex;
}

}

以上是关于利用反射技术将查询结果封装为对象的主要内容,如果未能解决你的问题,请参考以下文章

利用java反射将结果集封装成为对象和对象集合

mybatis是如何将sql执行结果封装为目标对象并返回的?有哪些映射形式

java对jdbc操作结果简单的映射封装

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

利用java反射将map值封装到对象中

Mybatis是如何将sql执行结果封装为目标对象并返回的?