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实现)的更多相关文章

  1. Java JDBC利用反射技术将查询结果封装为对象

    1.JDBC将返回结果集封装成对象demo class JdbcDemo { /** * 获取数据库列名 * @param rs * @return */ private static String[ ...

  2. java_jdbc_反射技术将查询结果封装为对象

    package cn.itcast.Reflect; import java.lang.reflect.InvocationTargetException; import java.lang.refl ...

  3. [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程

    [.net 面向对象程序设计进阶] (20) 反射(Reflection)(上)利用反射技术实现动态编程 本节导读:本节主要介绍什么是.NET反射特性,.NET反射能为我们做些什么,最后介绍几种常用的 ...

  4. hibernate将本地SQL查询结果封装成对象

    hibernate将本地SQL查询结果封装成对象 不知道大家有没有碰过这种情况,迫于很多情况只能用native SQL来查询(如:复杂统计等),然而使用native查询后,结果会被放到object里, ...

  5. JDBC 利用反射 配置文件

    import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.s ...

  6. 利用反射技术实现POJO的数据库操作

    记得第一次写项目的时候,傻傻的数据库一张表,代码里就写一个DAO类,几张表就写几个DAO类,大量的反复代码,自己粘着都嫌烦,后来接触了Hibernate,不得不说对我们这样的小白用处还是非常大的.那么 ...

  7. 【转】【Java】利用反射技术,实现对类的私有方法、变量访问

    java关于反射机制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基于java的反射机制. 下面是一个关于利用java的反射机制,实现了对私 ...

  8. 利用反射把数据库查询到的数据转换成Model、List(改良版)

    之前也写过一篇这样的博文,但是非常的粗糙.    博文地址 后来看到了一位前辈(@勤快的小熊)对我的博文的评论后,让我看到了更加优雅的实现方式,于是重构了之前的代码. public static Li ...

  9. C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

随机推荐

  1. 【8.31校内测试】【找规律二分】【DP】【背包+spfa】

    打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16.. ...

  2. tomcat使用Eclipse进行远程调试(线上调试)

    什么是远程调试,就是在A机器上利用Eclipse单步跟踪调试B机器上的Web应用,当然调试A机器上Web应用也是没有问题的,90%我都是调试本机的Web应用,远程调试的意义我想我不用说了,大家都会想到 ...

  3. Ehcache缓存时间设置

    timeToLiveSeconds和timeToIdleSecondstimeToLiveSeconds=x:缓存自创建日期起至失效时的间隔时间x:timeToIdleSeconds=y:缓存创建以后 ...

  4. 原生javascript知识点

    JAVASCRIPT 1.变量 1.1概念 变量源于数学,是计算机语言中存储计算结果或表示值抽象概念 计算机有个地方叫内存,变量都会将值存入到内存中,变量就是指向这个值的名字 1.2命名规则 1. 由 ...

  5. iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET

    iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex

  6. js实现大转盘抽奖游戏实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Centos7 内核从3.10升级到4.12过程

    http://blog.csdn.net/youshijifen/article/details/73472434

  8. jdbc分页

    分页是一个被讲到烂掉的话题,今天我再拾起来踹几脚吧 (Hibernate的分页做得很好很强大,用的人都知道 ,这个就不用再说了) 1.为什么要分页?    首先是数据量太大会影响查询和传输的性能,关键 ...

  9. 在 Linux 系统中安装Load Generator ,并在windows 调用

    原文地址:http://www.blogjava.net/qileilove/archive/2012/03/14/371861.html 由于公司需要测试系统的最大用户承受能力,所以需要学习使用lo ...

  10. Android开发中适配多种 ROM 的快捷方式是如何实现的?

    在安卓开发中,要提高开发效率,掌握一些快捷方式是必不可少的,特别是对于android入门阶段的童鞋而言,非常重要.今天小编在安卓开发教程网站上,搜罗了一些常用的Android 适配多种 ROM 的快捷 ...