程序目的:传入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;
}
}
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("驱动加载出错");
}
}
}
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(0, 1).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);
}
}
}
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(0, 1).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实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...
要使用反射模拟Hibernate的JDBC操作,我们需要遵循以下步骤: 1. **获取Class对象**:首先,我们需要得到目标类的Class对象,这可以通过`Class.forName()`方法实现,传入类的全名(包括包名)。 2. **创建对象**:...
于是,使用Facade模式和反射技术模拟Hibernate框架技术演示怎样书封装数据库的操作。 环境:Windows XP Professional, JDK 1.6, Eclipse 3.3 Europa, SQL Server 2000 使用步骤: 1. 下载解压之后,使用Eclipse导入...
本项目通过Java的反射和注解技术,试图模拟Hibernate的部分功能,以便更好地理解和掌握ORM的核心原理。 1. **Java反射**: 反射是Java提供的一种强大的动态类型特性,允许程序在运行时获取类的信息(如类名、属性、...
2、DDL操作、建表、删表、trunacte,Sequence创建和TABLE模拟Sequence等,都做了支持。 3、对SQL语法操作和函数的改写与支持。其他特性轻量 该框架对应用环境、连接池、 是否为J2EE应用等没有特殊要求。可以和EJB...
【hibernate注解功能模拟】这一主题主要涵盖了三个核心概念:Hibernate、Annotation(注解)和Reflection(反射)。在Java编程中,这三个概念对于理解对象关系映射(ORM)框架,尤其是Hibernate的工作机制至关重要。...
- 在实际项目中,通常不会直接使用 JDBC 进行数据库操作,而是结合 ORM 框架或自定义 DAO 层来提高开发效率和代码质量。 - DAO (Data Access Object) 层专门用于处理与数据库相关的逻辑。 **7.2 DAO 设计模式简介**...
1.2.模拟自定义ORM步骤: - 创建映射文件(如`hibernate-mapper.xml`),定义实体类与数据表的对应关系。 - 根据映射文件和实体类,获取数据库表字段。 - 使用反射技术为PreparedStatement的参数赋值。 - 执行...
3. SqlSession:它模拟了 JDBC 中的 Connection 对象,提供了执行 SQL 语句并返回结果的能力,同时也可以获取 Mapper 接口。在每次事务完成后,SqlSession 需要被关闭。 4. SQL Mapper:由 Java 接口和 XML 文件...
- **使用反射机制和ORM思想封装JDBC工具:** ORM是将对象模型映射到关系数据库的技术,这里会介绍如何使用反射机制封装JDBC。 **2.6 SQL优化** - **数据库常见笔试题和面试题:** 分析并解答数据库领域的常见面试...
Java程序员面试准备主要涵盖三个核心领域:Java语法、数据库理解和框架与工具的运用。下面将对这些领域进行详细的解析。 **Java语法** 1. **Java纯语法**:基础语法是面试中的常见考点,包括变量、数据类型、运算符...
至于`lib`目录,通常包含了一系列Hibernate 3.3运行所需的依赖库,这些库涵盖了JDBC驱动、日志框架(如log4j)、XML解析器、反射增强工具等。例如,JDBC驱动用于与各种数据库进行通信,log4j提供日志记录服务,DOM4J...
数据库技术也是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. **项目...
- **数据库连接**:了解JDBC(Java Database Connectivity)的基本原理,能够使用JDBC驱动进行数据库连接和操作。 - **事务处理**:理解事务的概念,包括ACID特性,能够使用事务处理确保数据的一致性和完整性。 - **...
7. **反射机制**:反射是Java的一个强大特性,允许运行中的Java程序动态访问和修改其他类的信息。 8. **JDBC**:Java数据库连接,是与各种数据库交互的标准API,涉及连接管理、SQL语句执行、结果集处理等。 9. **...
最后,模拟Spring的实现将帮助我们理解Spring的内部工作原理,比如如何通过反射创建bean,如何解析和加载bean的配置信息,以及如何实现AOP的动态代理等。这种实践过程不仅加深了对Spring的理解,也为日常开发中的...
- **反射与注解**:反射是Java动态特性的体现,注解则是元数据的一种形式,二者都是Java高级编程的重要组成部分。 #### 二、数据库&JDBC编程 **1. SQL基础(重点)** - **SQL基础**:包括SQL语句的基本结构、数据...
7. **spring-jdbc.jar**:提供对JDBC数据库访问的抽象,简化了数据库操作。 8. **spring-orm.jar**:扩展了Spring的DAO特性,支持iBATIS、JDO、OJB、TopLink等ORM框架。大部分类依赖于spring-dao.jar。 9. **...