ORM框架如Hibernate中,可以根据某个bean的类型得到数据库中的记录,如session.get(Object.Class);那么它背后是怎么实现的呢。
这里来模拟一下采用反射的简单ORMapping.
代码如下:
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* 模拟简单的ORMapping.所影射的对象必须符合JavaBean规范
* @author soft01
*
*/
public class ORMUtil {
/**
* 假设子段名和属性名一样
* @param querySql 查询语句
* @param classType 查询的Bean类型
* @return 查询的Bean对象
*/
public static Object getObject(String querySql,Class<?> classType) {
Object obj = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getMySqlConnection();
ps = conn.prepareStatement(querySql);
rs = ps.executeQuery();
//得到结果集元数据对象
ResultSetMetaData rsmd = rs.getMetaData();
//得到列数
int col = rsmd.getColumnCount();
while(rs.next()) {
//利用反射创建一个该类的实例,必须要有无参构造
obj = classType.newInstance();
String columnName = null;
String setMethodName = null;
for(int i = 1; i <= col; i++) {
columnName = rsmd.getColumnName(i);
//拼接set方法
setMethodName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
Method[] methods = classType.getDeclaredMethods();
for(Method m : methods) {
if(m.getName().equals(setMethodName)) {
//调用set方法设置bean的属性值
m.invoke(obj, rs.getObject(columnName));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, ps, conn);
}
return obj;
}
/**
* 查询出所有的数据并将其封装成为一个对象的List返回
*
* @param sql
* @param classType
* @return
*/
public static List<? extends Object> getObjects(String querySql,Class<?> classType) {
List<Object> objects = new ArrayList<Object>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getMySqlConnection();
ps = conn.prepareStatement(querySql);
rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int col = rsmd.getColumnCount();
while(rs.next()) {
Object obj = classType.newInstance();
String columnName = null;
String setMethodName = null;
for(int i = 1; i <= col; i++) {
columnName = rsmd.getColumnName(i);
setMethodName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
Method[] methods = classType.getDeclaredMethods();
for(Method m : methods) {
if(m.getName().equals(setMethodName)) {
m.invoke(obj, rs.getObject(columnName));
}
}
}
objects.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, ps, conn);
}
return objects;
}
}