packagecom.test.reflection;
importjava.lang.reflect.Method;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.ResultSetMetaData;
importcom.test.jdbc.DBUtils;
publicclassORMExample{
publicstaticvoidmain(String[]args){
Useruser=(User)getObject(
"selectid,firstname,lastname,agefromuserswhereid=1",
User.class);
System.out.println(user);
}
publicstatic<T>TgetObject(Stringsql,Class<T>clazz){
Connectionconn=null;
PreparedStatementps=null;
ResultSetrs=null;
try{
conn=DBUtils.getConn();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
//必须有无参的构造函数
Tobj=null;
//获得共有方法
Method[]ms=clazz.getMethods();
//通过结果集元数据获得列数
ResultSetMetaDatarsmd=rs.getMetaData();
intcolumnCount=rsmd.getColumnCount();
if(rs.next()){
obj=clazz.newInstance();
for(inti=1;i<=columnCount;i++){
StringcolName=rsmd.getColumnLabel(i);
StringmethodName="set"
+colName.substring(0,1).toUpperCase()
+colName.substring(1);
//循环读取所有方法
for(Methodm:ms){
//列名和set方法名如果相同则调用该方法
if(methodName.equals(m.getName())){
m.invoke(obj,rs.getObject(colName));
}
}
}
}
returnobj;
}catch(Exceptione){
thrownewRuntimeException();
}finally{
DBUtils.free(rs,ps,conn);
}
}
}
数据库值如下:
代码运行结果为:
id:1firstname:咖lastname:咖age:23
具体的方法可见代码注释.通过反射获取方法和元数据的列比较相同的便动态执行.
下篇将要介绍自己写连接池.待续.
优质内容筛选与推荐>>
1、最短路总结2、Kubernetes-1.4.x集群3、移动端兼容性浅析4、Spring Boot全日志设置5、spring aop 获取拦截的方法(Method对象)
长按二维码向我转账
受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。