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. Problem G: 切煎饼

    Description 王小二自夸刀工不错,有人放一张大的圆煎饼在砧板上,问他:饼不允许离开砧板,切100刀最多能切多少块? Input 多组测试数据,每组输入1个整数,代表切的刀数 Output 每 ...

  2. 树形DP+(分组背包||二叉树,一般树,森林之间的转换)codevs 1378 选课

    codevs 1378 选课 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond  题目描述 Description 学校实行学分制.每门的必修课都有固定的学分 ...

  3. python开发_python代码风格(coding style)

    我们要做python开发,我想python中的代码风格我们有必要了解一下 这样对我们自己和他们所编写的代码都有好处的. 下面是8点重要代码风格注意事项: ONE : Use 4-space inden ...

  4. mybatis源码分析(1)-----sqlSessionFactory创建

    1. 首先了解一下mybatis,包含核心jar ,以及spring相关jar. <!-- Mybatis相关组件 --> <dependency> <groupId&g ...

  5. 一个iframe注入漏洞,也是微软的 Application["error"] 漏洞

    最近学校进行安全等级评估,有人给我打电话,说我之前写的一个网站存在iframe注入漏洞,页面是error页面.我于是用netsparker扫描了自己的网站,果然发现error页面存在漏洞,我写网站的时 ...

  6. Inverted bipolar transistor doubles as a signal clamp

    A number of circuits, such as level detectors and AM demodulators, benefit from a rectifier with a l ...

  7. Spring SetFactoryBean实例

    SetFactoryBean 类为开发者提供了一种可在 Spring bean 配置文件创建一个具体的Set集合(HashSet 和 TreeSet). 这里有一个 ListFactoryBean.例 ...

  8. 【spring boot】启动类启动 错误: 找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 的解决方案

    导入的一个外部的spring boot项目,运行启动类,出现错误:找不到或无法加载主类 com.codingapi.tm.TxManagerApplication 解决方案: 将所有错误处理完成后,再 ...

  9. Ubuntu OS应用Runtime Enviroment

    在这篇文章中.我们将介绍Ubuntu OS的Runtime Environment.在文章"App confinement: Security policy for click packag ...

  10. iOS: iOS各种设备信息获取

    Author:si1ence Link:http://www.jianshu.com/p/b23016bb97af 为了统计用户信息.下发广告,服务器端往往需要手机用户设备及app的各种信息,下面讲述 ...