原地址 :http://www.cnblogs.com/bluedream2009/archive/2009/10/23/1588782.html
上一篇我们使用了结果集元数据实现了将结果集封装到List<Map<K,V>>中返回.
ORM:对象-关系数据库映射(Object/Relation Mapping).以简单的方式提供了领域对象模型与数据库间的映射.典型的Hibernate,iBatis
这里仅是练习.功能还很弱.
程序目的:传入sql语句返回字段如果和传入对象模型的setXX方法对应则自动赋值.并返回该对象.
首先构建User模型.应该和数据库字段相对应.数据库结构如下:
package com.test.reflection;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import com.test.jdbc.DBUtils;
public class ORMExample {
public static void main(String[] args) {
User user = (User) getObject(
"select id, firstname, lastname, age from users where id = 1",
User.class);
System.out.println(user);
}
public static <T>T getObject(String sql, Class<T> clazz) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = DBUtils.getConn();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
// 必须有无参的构造函数
T obj = null;
// 获得共有方法
Method[] ms = clazz.getMethods();
// 通过结果集元数据获得列数
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
obj = clazz.newInstance();
for (int i = 1; i <= columnCount; i++) {
String colName = rsmd.getColumnLabel(i);
String methodName = "set"
+ colName.substring(0, 1).toUpperCase()
+ colName.substring(1);
// 循环读取所有方法
for (Method m : ms) {
// 列名和set方法名如果相同则调用该方法
if (methodName.equals(m.getName())) {
m.invoke(obj, rs.getObject(colName));
}
}
}
}
return obj;
} catch (Exception e) {
throw new RuntimeException();
} finally {
DBUtils.free(rs, ps, conn);
}
}