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. Rails -- 关于Migration

    Rails -- 关于Migration 无聊去逛博客,发现一篇介绍Migration,挺详细的,留个链接,以后需要的时候看. 链接: http://www.cnblogs.com/orez88/ar ...

  2. python开发_python文件操作

    关于python文件操作的详细说明,大家可以参考:关于python的文件操作 官方API:os-Miscellaneous operating system interfaces 下面是我做的demo ...

  3. [转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案

    时间 2014-04-14 14:33:44  CSDN博客 原文  http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJ ...

  4. Javascript:父类可以调用子类吗?

    问:父类可以调用子类吗? 答:可以,经典的模板方法模式就是用的这个特性.

  5. Andorid之Annotation框架初使用(六)

    EVENT @Click :点击事件,只能有0个或1个参数,且参数为View @Click(R.id.myButton) void myButtonWasClicked() { [...] } @Cl ...

  6. [Clojure] A Room-Escape game, playing with telnet and pure-text commands - Part 1

    Code path: https://github.com/bluesilence/Lisp/tree/master/clojure/projects/room-escape As I have be ...

  7. C++keyword大总结

    register: 假设有一些变量使用频繁,则为存取变量的值少花一些时间, 能够将该局部变量的值放在CPU的寄存器中,须要时直接从寄存器 中取出參加运算,不必去内存中去存取. 由于寄存器的存取速度 远 ...

  8. POJ 3069 Saruman&#39;s Army

    Saruman's Army Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6688   Accepted: 3424 De ...

  9. Ubuntu12.04 挂载exFat格式U盘的方法(转)

    原文链接:Ubuntu12.04 挂载exFat格式U盘的方法 首先关于exFAT ,这里就不多作解释了,   再介绍一个软件fuse-exfat,   https://code.google.com ...

  10. MySQL模糊查询(like)时区分大小写

    问题说明:通过上面的语句,你会发现MySQL的like查询是不区分大小写的,因为我的失误,把Joe写成了joe才发现了这个东东吧.但是,有时候,我们需要区分大小写的是,该怎么办呢?解决方法如下: 方法 ...