62,635
社区成员




import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;
public class MetaDataRef<T> {
/**
* 泛型查询
* @param sql SQL语句
* @param args 查询语句的参数
* @param ClassName 类的完全限定名;
* @return
* */
public List<T> generalSearch(String sql,Object[]args,String className){
//存储返回的集合对象;
List<T>list=new ArrayList<T>();
Connection conn=DaoFactory.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
try{
//使用反射获取类的相关信息
Class<T>clazz=(Class<T>)Class.forName(className);
Field[]fields=clazz.getDeclaredFields();
Method method=null;
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
ResultSetMetaData resmd=null;
//获取结果集的元数据;
resmd=rs.getMetaData();
//获取一共多少列;
int columnCount=resmd.getColumnCount();
//获取输出列的名称;
while(rs.next()){
T obj=clazz.newInstance(); //创建一个新对象;
for(int i=1;i<=columnCount;i++){
String cname=resmd.getColumnClassName(i); //获取每一列的名称;
int cType=resmd.getColumnType(i); //获取每一列的类型;
for(Field f:fields){//循环实体类的实列
if(cname.equals(f.getName())) //如果列名和属性名相同;
{
//封装数据;
String firstLetter=f.getName().substring(0,1).toUpperCase();
String methodName="set"+firstLetter+f.getName().substring(1);
//如果列是整型的
if(cType==Types.INTEGER){
method=clazz.getMethod(methodName, Integer.class);
method.invoke(obj,rs.getInt(i));
}else if(cType==Types.VARCHAR){
method=clazz.getMethod(methodName, String.class);
method.invoke(obj,rs.getString(i));
}else if(cType==Types.TIMESTAMP){
method=clazz.getMethod(methodName, Date.class);
method.invoke(methodName,rs.getDate(i));
}else if(cType==Types.NUMERIC){
method=clazz.getMethod(methodName, Double.class);
method.invoke(obj,rs.getDouble(i));
}
}
}
}
list.add(obj);
}
}catch(Exception e){
e.printStackTrace();
}
return list;
}
}
////
import java.util.List;
public class TestFlec {
/**
* @param args
*/
public static void main(String[] args) {
String sql="select * from bookinfo";
MetaDataRef<Book>mdt=new MetaDataRef<Book>();
System.out.println(mdt);
List<Book>list=mdt.generalSearch(sql,null,Book.class.getName());
System.out.println("Id Name Type Status");
System.out.println(Book.class.getName());
for(Book book:list){
System.out.println(book.getId()+"\t"+book.getName()+"\t"+book.getType()+"\t"+book.getStatus());
}
}
}