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. JBoss 7 配置成windows启动服务

    将Jboss7 server 配置成一个windows启动服务的两个文件,部署步骤如下: 1.    先检查是否配置java_home和jboss_home的环境变量,如没配置上先配置,如我的是JBO ...

  2. JQ 使用模板

    1.首先需要添加模板JS文件,

  3. myBatis 切换数据源(spring事务)理解

    1. mybatis (SqlSessionTemplate)的动态代理 a) sqlSession的结构 b)SqlSession 结构 public class SqlSessionTemplat ...

  4. 面试&笔试---c语言之字符串处理

    1.字串拷贝库函数strcpy 函数介绍: 原型声明:extern char *strcpy(char *dest,const char *src); 头文件:string.h 功能:把从src地址开 ...

  5. MOSFET shunt regulator substitutes for series regulator

    You would normally use a series linear regulator or a dc/dc converter to obtain 3V dc from a higher ...

  6. NUMA架构

    参考: http://www.ibm.com/developerworks/cn/linux/l-numa/ http://blog.sina.com.cn/s/blog_3f5c2f8c01000b ...

  7. 跨域策略文件crossdomain.xml

    Web站点通过crossdomain.xml文件(放于站点根目录)配置提供允许的域跨域访问本域内容的权限 以土豆的为例: <cross-domain-policy> <allow-a ...

  8. [Linux] du-查看文件夹大小-并按大小进行排序

    reference : http://blog.csdn.net/jiaobuchong/article/details/50272761# 某天,我想检查一下电脑硬盘的的使用情况,作为一个命令控,废 ...

  9. XSS盗COOKIE

    XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆.故将跨站脚本攻击缩写为XSS. XSS是一种 ...

  10. c# 注册表操作,创建,删除,修改,判断节点是否存在

    用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和 删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1:要操作注册表,我们必须 ...