需求:将查询的结果封装为对象返回
使用到的知识点:
1.结果集的元数据信息(从结果集获取列名存入数组中)
java.sql.ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
2.使用反射。用从结果集中取出的列名加上字符串拼接,运用反射的技术获取方法。
版本一:
package com.us.test;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.us.daoimpl.jdbcUtils;
import com.us.sqltable.userInfo;
public class Reflecttest {
public static void main(String[] args) {
userInfo user = getUser("select * from userInfo where id =1");
System.out.println(user.getUsername());
}
static userInfo getUser(String sql) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
userInfo user=null;
try {
conn = jdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
java.sql.ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
//用一个数组存放列名
for (int i=0;i<count;i++) {
colNames[i] = rsmd.getColumnName(i+1);
}
user = new userInfo();
Method[] mds = user.getClass().getMethods();
while(rs.next()) {
for (int i=0;i<colNames.length;i++ ) {
String colName = colNames[i];
String methodName = "set" + colName.substring(0, 1).toUpperCase()+colName.substring(1);
//Method md = user.getClass().getMethod(methodName,Object.class);
for (Method md :mds) {
if (methodName.equals(md.getName())) {
md.invoke(user, rs.getObject(colName));
}
}
}
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
jdbcUtils.free(rs, ps, conn);
}
return user;
}
}
版本二:(可以对不同的表进行操作)
package com.us.test;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.us.daoimpl.jdbcUtils;
import com.us.sqltable.userInfo;
public class Reflecttest2 {
public static void main(String[] args) throws ClassNotFoundException {
/*userInfo user = getUser("select * from userInfo where id =1");
System.out.println(user.getUsername());*/
/*Object obj= getObject("select * from userInfo where id =1", Class.forName("com.us.sqltable.userInfo"));
System.out.println(obj);*/
userInfo user = (userInfo) getObject("select * from userInfo where id =1", Class.forName("com.us.sqltable.userInfo"));
System.out.println(user.getUsername());
}
static Object getObject(String sql,Class clazz) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Object obj=null;
try {
conn = jdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
java.sql.ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
//用一个数组存放列名
for (int i=0;i<count;i++) {
colNames[i] = rsmd.getColumnName(i+1);
}
obj = clazz.newInstance();
Method[] mds = clazz.getMethods();
while(rs.next()) {
for (int i=0;i<colNames.length;i++ ) {
String colName = colNames[i];
String methodName = "set" + colName.substring(0, 1).toUpperCase()+colName.substring(1);
//Method md = user.getClass().getMethod(methodName,Object.class);
for (Method md :mds) {
if (methodName.equals(md.getName())) {
md.invoke(obj, rs.getObject(colName));
}
}
}
}
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
jdbcUtils.free(rs, ps, conn);
}
return obj;
}
}