采用反射模拟简单的ORMapping
来源:互联网 发布:网络暑假工招聘 编辑:程序博客网 时间:2024/05/01 02:38
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;
}
}
- 采用反射模拟简单的ORMapping
- Delphi下ORMapping的简单实现
- 反射的作用之spring的简单模拟
- 反射的作用之spring的简单模拟
- 模拟实现hibernate原理,采用java反射机制
- 采用反射调用android隐藏的api
- 使用反射和注解简单模拟服务器
- 历史车轮下的ORMapping技术
- 总结: 设计实体 和 ormapping 的思路
- ormapping框架和jdbc的比较
- 使用过滤器+反射+枚举,简单模拟sturts2运行方式,编写一个属于自己的框架
- 利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)
- 反射的简单应用
- 简单的反射机制
- 反射的简单理解
- 简单的反射
- 反射的简单例子
- 反射的简单理解
- 唐骏资料
- COM编程入门
- 《程序员》火热七月:中国ISV生存现状调查报告
- String和StringBuffer的区别
- 关于 FROM tableA,tableB 和 tableA LEFT JOIN tableB on 的区别
- 采用反射模拟简单的ORMapping
- Sql Server 导出数据库结构
- apt-get 命令
- 思维导图工具的比较
- 售前分析
- 关注CMMI
- HibernateSynchronizer的安装与使用
- Buffalo 学习笔记- buffalo.js 源代码注释(三)
- Enjoy work