JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)
ORM(Object Relational Mapping)对象关系映射
public class ORMTest {
public static void main(String[] args) throws SQLException,
IllegalAccessException, InvocationTargetException, Exception {
User user = (User) getObject(
"select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1",
User.class);
System.out.println(user);
Bean b = (Bean) getObject(
"select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1",
Bean.class);
System.out.println(b);
}
static List<Object> getObjects(String sql, Class clazz)
throws SQLException, Exception, IllegalAccessException,
InvocationTargetException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
String[] colNames = getColNames(rs);
List<Object> objects = new ArrayList<Object>();
Method[] ms = clazz.getMethods();
while (rs.next()) {
Object object = clazz.newInstance();
for (int i = 0; i < colNames.length; i++) {
String colName = colNames[i];
String methodName = "set" + colName;
// Object value = rs.getObject(colName);
// try {
// Method m = clazz
// .getMethod(methodName, value.getClass());
// if (m != null)
// m.invoke(object, value);
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// //
// }
for (Method m : ms) {
if (methodName.equals(m.getName())) {
m.invoke(object, rs.getObject(colName));
break;
}
}
objects.add(object);
}
}
return objects;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
private static String[] getColNames(ResultSet rs) throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();
String[] colNames = new String[count];
for (int i = 1; i <= count; i++) {
colNames[i - 1] = rsmd.getColumnLabel(i);
}
return colNames;
}
static Object getObject(String sql, Class clazz) throws SQLException,
Exception, IllegalAccessException, InvocationTargetException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
String[] colNames = getColNames(rs);
Object object = null;
Method[] ms = clazz.getMethods();
if (rs.next()) {
object = clazz.newInstance();
for (int i = 0; i < colNames.length; i++) {
String colName = colNames[i];
String methodName = "set" + colName;
// Object value = rs.getObject(colName);
// try {
// Method m = clazz
// .getMethod(methodName, value.getClass());
// if (m != null)
// m.invoke(object, value);
// } catch (NoSuchMethodException e) {
// e.printStackTrace();
// //
// }
for (Method m : ms) {
if (methodName.equals(m.getName())) {
m.invoke(object, rs.getObject(colName));
break;
}
}
}
}
return object;
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
}
JDBC 利用反射技术将查询结果封装为对象(简单ORM实现)相关推荐
- 利用反射技术修改类中的字段(成员变量的反射)
题目:利用反射技术修改类中的字段及成员变量的反射 作者:Vashon 一.首先定义一个类如下: class ReflectPoint {private int x; //私有的public int y ...
- hibernate将本地SQL查询结果封装成对象
hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...
- C#反射技术之一动态读取和设置对象的属性值
要用C#反射技术的话,首先得引入System.Reflection 命名空间,这个命名空间里的类,具有动态加载程序集.类型,动态调用方法.设置和取得属性和字段的值.可以获取类型和方法的信息的功能. 要 ...
- Java项目开发心得(一):利用Java技术实现查询手机号码归属地
鉴于最近项目涉及到查询归属地的问题,今天在此做一下技术分享,如果有更好的建议,还请读者大神指出. 回归正题,关于手机号码归属地,想要查询的无非是运行商.省份.市之类的信息,那么就会涉及到Http请求以 ...
- 类选择器遍历赋值_利用反射实现配置表数据到类对象数据的转换
在游戏开发中,配置表是不可少的.通常我们将一个类,做成一个配置表,将配置表每列的索引都和类的字段名严格对应起来. 先实例化一个类的对象,然后通过反射来遍历类中的字段,通过field.SetValue( ...
- 设计模式之工厂方法模式、抽象工厂模式的概念和实现及使用“反射技术+读取配置文件”的方法对工厂模式进行改进(软件工程综合实践课程第三周个人作业)
文章目录 一.实验目的 二.知识总结 1.工厂方法模式简介 2.抽象工厂模式简介 3.工厂模式小结 4.利用"反射技术+读取配置文件"的方法改进程序 三.实验内容 1. 工厂模式实 ...
- 反射创建对象_如何应用Java反射技术灵活地创建程序类的对象实例
软件项目实训及课程设计指导--如何应用Java反射技术灵活地创建程序类的对象实例 1.如何应用属性配置文件实现对系统中的配置信息进行读写操作 Java中的属性配置文件主要可以作为软件应用系统及项目的配 ...
- 利用反射做一个简易 Spring IOC 容器,模仿其装配功能
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/wenwenaier/article/ details/115549343 自己用代码模仿一个简易的SpringIOC容器,模仿 ...
- java实现简单的orm_一种利用反射自动封装JavaBean的想法的实现(简单的ORM,较实用于JDBC查询)...
1.[代码]JavaBean小工具而已,还是挺方便的,你能懂得. package com.cnlive.util; import java.lang.reflect.Field; import jav ...
最新文章
- 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第15章-基于竞争关系的离散异构多智能体系统分组一致性
- java int == integer_java int与integer的区别
- 洛谷 P1849 [USACO12MAR]拖拉机Tractor
- 2010年IT人士必去的10个网站
- [SpringSecurity]web权限方案_CSRF功能
- c++ winpcap开发(2)
- leetcode Longest Consecutive Sequence
- 在远程MQ上启动应用程序时,IBM MQ更改用户标识
- jcr多久更新一次_科学网—你知道吗,SCI影响因子数据在7月又有更新了 - LetPub编辑的博文...
- python进阶-argparse
- 三星android智能手机usb驱动程序,三星手机驱动官方下载
- 降级至1.1.835教程
- 笔记本电脑一直卡在logo界面重启转圈,进U盘PE黑屏
- 访问页面升级访问_BPC页面访问缓慢无报错
- 截止频率计算公式wc_已知低通滤波器的传递函数是G(s)=(G0*Wc)/(s+Wc),截止频率不超过2HZ,怎么求?...
- 使用OMF(Oracle Managed Files,Oracle管理的文件)的场景示例
- iOS开发证书/发布证书不受信任
- 视频知识基础:什么是TS、PS流?
- XBee zigbee 使用指南--- XBee模块输入和输出
- 博一就完成了SCI论文发表要求是一种怎样的体验?
热门文章
- LeetCode 657 : Robot Return to Origin
- php400错误的请求,Wordpress中的Ajax返回400错误请求,但不确定如何进一步调试 - WordPress - srcmini...
- linux mysql5.7.11安装_Linux下安装MySQL 5.7.11
- java工作流 数据库设计_Java开发网
- OpenFeign的9个坑,每个都能让你的系统奔溃 OpenFeign
- QuartzCore框架-- iOS中的动画
- android中的Json一
- 给接口自动化测试框架增色,实现企业微信测试报告
- matlab根据 2 6,#2.6 应用MATLAB进行模型处理
- php清除账号登录,php实现账号登录/上传/下载/删除文件