`

JDBC之运用反射模拟ORM

    博客分类:
  • JDBC
 
阅读更多

程序目的:传入sql语句返回字段如果和传入对象模型的setXX方法对应则自动赋值.并返回该对象.

首先构建User模型.应该和数据库字段相对应.数据库结构如下:

User模型:

 

package com.test.reflection;

public class User {
    
private Integer id;
    
private String firstname;
    
private String lastname;
    
private Integer age;

    
// 约定的默认构造器(必须)
    public User() {

    }

    @Override
    
public String toString() {
        
return "id: " + this.id + " firstname: " + this.firstname
                
+ " lastname: " + this.lastname + " age: " + this.age;
    }

    
public Integer getId() {
        
return id;
    }

    
public void setId(Integer id) {
        
this.id = id;
    }

    
public String getFirstname() {
        
return firstname;
    }

    
public void setFirstname(String firstname) {
        
this.firstname = firstname;
    }

    
public String getLastname() {
        
return lastname;
    }

    
public void setLastname(String lastname) {
        
this.lastname = lastname;
    }

    
public Integer getAge() {
        
return age;
    }

    
public void setAge(Integer age) {
        
this.age = age;
    }

}

然后是上次提供的DBUtils:

package com.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public final class DBUtils {
    
private static String url = "jdbc:mysql://localhost:3306/mytest";
    
private static String user = "root";
    
private static String password = "root";

    
// 获得连接
    public static Connection getConn() throws SQLException {
        
return DriverManager.getConnection(url, user, password);
    }

    
// 释放连接
    public static void free(ResultSet rs, PreparedStatement ps, Connection conn) {
        
try {
            
if (rs != null) {
                rs.close();
            }
        } 
catch (SQLException e) {
            e.printStackTrace();
        } 
finally {
            
try {
                
if (ps != null) {
                    ps.close();
                }
            } 
catch (SQLException e) {
                e.printStackTrace();
            } 
finally {

                
try {
                    
if (conn != null) {
                        conn.close();
                    }
                } 
catch (SQLException e) {
                    e.printStackTrace();
                }

            }

        }

    }

    
// 加载驱动
    static {
        
try {
            Class.forName(
"com.mysql.jdbc.Driver");
        } 
catch (ClassNotFoundException e) {
            System.out.println(
"驱动加载出错");
        }
    }

}

最后最主要的ORMExample:

package com.test.reflection;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import com.test.jdbc.DBUtils;

public class ORMExample {

    
public static void main(String[] args) {
        User user 
= (User) getObject(
                
"select id, firstname, lastname, age from users where id = 1",
                User.
class);
        System.out.println(user);

    }

    
public static <T>T getObject(String sql, Class<T> clazz) {
        Connection conn 
= null;
        PreparedStatement ps 
= null;
        ResultSet rs 
= null;

        
try {
            conn 
= DBUtils.getConn();
            ps 
= conn.prepareStatement(sql);
            rs 
= ps.executeQuery();
            
// 必须有无参的构造函数
            T obj = null;
            
// 获得共有方法
            Method[] ms = clazz.getMethods();
            
// 通过结果集元数据获得列数
            ResultSetMetaData rsmd = rs.getMetaData();
            
int columnCount = rsmd.getColumnCount();
            
            
if (rs.next()) {
                obj 
= clazz.newInstance();
                
for (int i = 1; i <= columnCount; i++) {
                    String colName 
= rsmd.getColumnLabel(i);
                    String methodName 
= "set"
                            
+ colName.substring(01).toUpperCase()
                            
+ colName.substring(1);
                    
// 循环读取所有方法
                    for (Method m : ms) {
                        
// 列名和set方法名如果相同则调用该方法
                        if (methodName.equals(m.getName())) {
                            m.invoke(obj, rs.getObject(colName));
                        }
                    }
                }
            }
            
return obj;
        } 
catch (Exception e) {
            
throw new RuntimeException();
        } 
finally {
            DBUtils.free(rs, ps, conn);
        }
    }
}

数据库值如下:

代码运行结果为:

id: 1 firstname: 咖 lastname: 咖 age: 23

具体的方法可见代码注释.通过反射获取方法和元数据的列比较相同的便动态执行
以上摘自http://www.cnblogs.com/bluedream2009/archive/2009/10/23/1588782.html

分享到:
评论

相关推荐

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    使用java的反射机制来模拟hibernater的jdbc操作

    要使用反射模拟Hibernate的JDBC操作,我们需要遵循以下步骤: 1. **获取Class对象**:首先,我们需要得到目标类的Class对象,这可以通过`Class.forName()`方法实现,传入类的全名(包括包名)。 2. **创建对象**:...

    使用反射技术和Facade模式演示封装数据库操作--ORM原理

    于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK 1.6, Eclipse 3.3 Europa, SQL Server 2000 使用步骤: 1. 下载解压之后,使用Eclipse导入...

    java模拟hibernate实现

    本项目通过Java的反射和注解技术,试图模拟Hibernate的部分功能,以便更好地理解和掌握ORM的核心原理。 1. **Java反射**: 反射是Java提供的一种强大的动态类型特性,允许程序在运行时获取类的信息(如类名、属性、...

    支持多数据库的ORM框架ef-orm.zip

    2、DDL操作、建表、删表、trunacte,Sequence创建和TABLE模拟Sequence等,都做了支持。 3、对SQL语法操作和函数的改写与支持。其他特性轻量 该框架对应用环境、连接池、 是否为J2EE应用等没有特殊要求。可以和EJB...

    hibernate注解功能模拟

    【hibernate注解功能模拟】这一主题主要涵盖了三个核心概念:Hibernate、Annotation(注解)和Reflection(反射)。在Java编程中,这三个概念对于理解对象关系映射(ORM)框架,尤其是Hibernate的工作机制至关重要。...

    Hibernate5教程文档大纲

    1.2.模拟自定义ORM步骤: - 创建映射文件(如`hibernate-mapper.xml`),定义实体类与数据表的对应关系。 - 根据映射文件和实体类,获取数据库表字段。 - 使用反射技术为PreparedStatement的参数赋值。 - 执行...

    吴天雄-Mybatis笔记.doc

    3. SqlSession:它模拟了 JDBC 中的 Connection 对象,提供了执行 SQL 语句并返回结果的能力,同时也可以获取 Mapper 接口。在每次事务完成后,SqlSession 需要被关闭。 4. SQL Mapper:由 Java 接口和 XML 文件...

    java学习路线图

    - **使用反射机制和ORM思想封装JDBC工具:** ORM是将对象模型映射到关系数据库的技术,这里会介绍如何使用反射机制封装JDBC。 **2.6 SQL优化** - **数据库常见笔试题和面试题:** 分析并解答数据库领域的常见面试...

    10小时准备java程序员面试(送给临时抱佛脚的新人).pdf,这是一份不错的文件

    Java程序员面试准备主要涵盖三个核心领域:Java语法、数据库理解和框架与工具的运用。下面将对这些领域进行详细的解析。 **Java语法** 1. **Java纯语法**:基础语法是面试中的常见考点,包括变量、数据类型、运算符...

    hibernate 3.3 jar包

    至于`lib`目录,通常包含了一系列Hibernate 3.3运行所需的依赖库,这些库涵盖了JDBC驱动、日志框架(如log4j)、XML解析器、反射增强工具等。例如,JDBC驱动用于与各种数据库进行通信,log4j提供日志记录服务,DOM4J...

    学习java的30个目标

    数据库技术也是Java开发者必备技能之一,你需要掌握JDBC API,并能运用持久化/ORM框架,如Hibernate、JDO、CocoBase、TopLink、InsideLiberator或iBatis,以简化数据库操作。 理解对象关系的不匹配以及它如何影响...

    全套软件开发文档

    7. **数据库与ORM**:SQL基础,JDBC的使用,以及ORM框架如Hibernate或MyBatis的配置和操作。 8. **Web开发**:Servlet、JSP、JSF等Web开发技术,以及现代化的前端框架如React、Vue或Angular的结合使用。 9. **项目...

    Java_面试题总结(2011版)

    - **数据库连接**:了解JDBC(Java Database Connectivity)的基本原理,能够使用JDBC驱动进行数据库连接和操作。 - **事务处理**:理解事务的概念,包括ACID特性,能够使用事务处理确保数据的一致性和完整性。 - **...

    java企业开发项目经典书籍

    7. **反射机制**:反射是Java的一个强大特性,允许运行中的Java程序动态访问和修改其他类的信息。 8. **JDBC**:Java数据库连接,是与各种数据库交互的标准API,涉及连接管理、SQL语句执行、结果集处理等。 9. **...

    手写高仿真提炼Spring.zip

    最后,模拟Spring的实现将帮助我们理解Spring的内部工作原理,比如如何通过反射创建bean,如何解析和加载bean的配置信息,以及如何实现AOP的动态代理等。这种实践过程不仅加深了对Spring的理解,也为日常开发中的...

    java学习路线

    - **反射与注解**:反射是Java动态特性的体现,注解则是元数据的一种形式,二者都是Java高级编程的重要组成部分。 #### 二、数据库&JDBC编程 **1. SQL基础(重点)** - **SQL基础**:包括SQL语句的基本结构、数据...

    Spring——jar详解

    7. **spring-jdbc.jar**:提供对JDBC数据库访问的抽象,简化了数据库操作。 8. **spring-orm.jar**:扩展了Spring的DAO特性,支持iBATIS、JDO、OJB、TopLink等ORM框架。大部分类依赖于spring-dao.jar。 9. **...

Global site tag (gtag.js) - Google Analytics