内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。
将JavaBean中的属性封装起来进行操作。在程序把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息,即属性的信息。
getPropertyDescriptors(),获得属性的描述,可以采用遍历BeanInfo的方法,来查找、设置类的属性。
通过内省机制改进Orm类,代码如下:
package orm; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import util.JdbcUtils; /** * * @author fengzb * * @param <T> */ public class Orm2<T> { private static final int NOT_FOUND = -1; /** * 获得映射数据库后的一个装配好的实体对象bean * * @param sql * @param clazz * @return * @throws Exception */ public T getBean(String sql, Class<T> clazz) throws Exception { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); T t = clazz.newInstance(); int[] pos = mapColumnsToProperties(rs, clazz); if(rs.next()){ callSetter(t,pos,rs); } return t; } finally { JdbcUtils.free(rs, ps, conn); } } /** * 获得映射数据库后的装配好的实体对象bean List * * @param sql * @param clazz * @return * @throws Exception */ public List<T> getBeanList(String sql, Class<T> clazz) throws Exception { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; List<T> ts = new ArrayList<T>(); try { conn = JdbcUtils.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); T t = null; int[] pos = mapColumnsToProperties(rs, clazz); while(rs.next()){ t = clazz.newInstance(); callSetter(t,pos,rs); ts.add(t); } return ts; } finally { JdbcUtils.free(rs, ps, conn); } } /** * 利用Java反射与内省(Introspector)机制进行装配 * * @param t * @param pos * @param rs * @throws Exception */ private void callSetter(T t, int[] pos, ResultSet rs) throws Exception { ResultSetMetaData rsmd = rs.getMetaData(); PropertyDescriptor[] props = null; BeanInfo beanInfo = Introspector.getBeanInfo(t.getClass()); props = beanInfo.getPropertyDescriptors(); for(int i = 1; i<=rsmd.getColumnCount();i++){ if(pos[i]!= NOT_FOUND){ props[pos[i]].getWriteMethod().invoke(t, rs.getObject(i)); } } } /** * 找到resultset中每个值对应 bean中属性的位置 * * @param rs * @param clazz * @return * @throws SQLException * @throws IntrospectionException */ private int[] mapColumnsToProperties(ResultSet rs,Class<T> clazz) throws SQLException, IntrospectionException{ ResultSetMetaData rsmd = rs.getMetaData(); int columnLength = rsmd.getColumnCount(); int[] columnsToProperties = new int[columnLength+1]; PropertyDescriptor[] props = null; BeanInfo beanInfo = Introspector.getBeanInfo(clazz); props = beanInfo.getPropertyDescriptors(); Arrays.fill(columnsToProperties,NOT_FOUND); for(int col = 1; col <= columnLength; col++){ String columnName = rsmd.getColumnLabel(col); if (null == columnName || 0 == columnName.length()) { columnName = rsmd.getColumnName(col); } for(int i=0;i<props.length;i++){ if(props[i].getName().equalsIgnoreCase(columnName)){ columnsToProperties[col] = i; break; } } } return columnsToProperties; } }比较两种方式的执行效率:
package orm; import java.util.List; import model.User; import org.junit.Test; public class OrmTest { @Test public void ormTest() throws Exception{ long start = System.currentTimeMillis(); Orm<User> orm = new Orm<User>(); User user= (User) orm.getBean("SELECT userId ,department,division,email,employeeNo,name,passwordMD5,phone,position,state,type FROM tb_user",User.class); System.out.println(user); List<User> userList= orm.getBeanList("SELECT userId,department,division,email,employeeNo,name,passwordMD5,phone,position,state,type FROM tb_user",User.class); for(User u : userList){ System.out.println(u); } System.out.println("耗时:"+(System.currentTimeMillis() - start)+"ms"); } @Test public void orm2Test() throws Exception{ long start = System.currentTimeMillis(); Orm2<User> orm2 = new Orm2<User>(); User user2 = orm2.getBean("SELECT userId,department,division,email,employeeNo,name,passwordMD5,phone,position,state,type FROM tb_user", User.class); System.out.println(user2); List<User> userList2= orm2.getBeanList("SELECT userId,department,division,email,employeeNo,name,passwordMD5,phone,position,state,type FROM tb_user",User.class); for(User u : userList2){ System.out.println(u); } System.out.println("耗时:"+(System.currentTimeMillis() - start)+"ms"); } }
结果如下:
User [userId=1, department=321, division=3213, email=321, employeeNo=321, name=321, passwordMD5=321, phone=321, position=321, state=321, type=21] User [userId=1, department=321, division=3213, email=321, employeeNo=321, name=321, passwordMD5=321, phone=321, position=321, state=321, type=21] User [userId=2, department=321, division=3213, email=321, employeeNo=321, name=321, passwordMD5=321, phone=321, position=321, state=321, type=21] 耗时:464ms User [userId=1, department=321, division=3213, email=321, employeeNo=321, name=321, passwordMD5=321, phone=321, position=321, state=321, type=21] User [userId=1, department=321, division=3213, email=321, employeeNo=321, name=321, passwordMD5=321, phone=321, position=321, state=321, type=21] User [userId=2, department=321, division=3213, email=321, employeeNo=321, name=321, passwordMD5=321, phone=321, position=321, state=321, type=21] 耗时:35ms
可见用内省机制改进后执行效率得到很大提高。
相关推荐
在本篇讨论中,我们将深入探讨“基于Java的简易ORM框架实现”。ORM,全称Object-Relational Mapping,是将数据库中的数据与程序中的对象进行映射的技术,它简化了数据库操作,使得开发者可以像操作对象一样操作...
随着信息技术的不断发展,企业对于数据的管理和操作需求日益增长。传统的JDBC(Java Database Connectivity)虽然可以实现...本项目旨在开发一个基于Java的简易ORM框架,为企业提供轻量级、高效的数据访问解决方案。
EzeOrm是一个由Java开发的轻量级ORM框架,其主要目标是简化数据库操作,将对象与关系数据库之间的映射关系自动化处理,从而减少开发者在数据访问层的代码编写工作。ORM框架允许开发者以面向对象的方式操作数据库,...
在这个简易版ORM框架中,我们模仿了著名的MyBatis框架,旨在简化数据库操作,提高开发效率。 在手写这个框架的过程中,我们可以理解以下核心概念和知识点: 1. **数据访问层(DAL,Data Access Layer)**:ORM框架...
EzeOrm 是一个使用java 编写的简易ORM(Object Relational Mapping 对象关系映射)框架。 关于ORM框架的简介请参考 。帮助程序员更加简单的将自己的java 程序与数据库相连接。 数据库支持 暂只支持 Mysql 项目状态 ...
3. **数据访问层(DAO)**:用于与数据库交互,可能包含SQL查询或ORM框架如Hibernate、MyBatis。 4. **轻量级框架**:可能使用Spring Boot简化配置,提供依赖注入,便于模块化开发。 **三、数据库管理** 1. **关系...
综上所述,"JAVA SSH 三大框架实现的简易票务系统"是一个典型的Java Web 应用示例,涵盖了用户交互、业务逻辑处理和数据存储的关键环节,为开发者提供了学习和实践的平台。对于想要深入了解Java Web 开发的人员来说...
【简易Java框架开源论坛系统】是一个基于Java编程语言开发的开放源代码的社区交流平台。这个系统旨在提供一个简洁、高效且易于维护的环境,让用户能够进行问题讨论、分享知识和经验,促进技术交流。其核心特点在于...
首先,我们要明确“简易Java框架开源订销管理系统”是基于Java编程语言构建的,这表明系统主要依赖Java的强大功能和跨平台特性。Java以其“一次编写,到处运行”的理念,成为许多开发者首选的开发语言,尤其是在企业...
ORM框架可以将Java对象与数据库表对应,减少直接SQL操作,提高开发效率。 四、RESTful API设计 考虑到系统的开放性和可扩展性,系统可能会采用RESTful API设计,提供标准的HTTP接口供外部系统调用。这种方式便于与...
数据持久化是将数据保存到硬盘,即使系统重启也能恢复,这通常通过序列化或ORM框架(如Hibernate)来实现。异常处理则确保了程序在遇到错误时能够优雅地退出,而不是突然崩溃,这通常通过try-catch-finally语句来...
Hibernate作为持久化框架,实现了对象关系映射(ORM),使得JAVA对象可以直接操作数据库,减少了大量SQL编写工作。 人力资源管理系统(HRMS)的核心功能包括员工信息管理、招聘管理、培训管理、考勤管理、薪酬福利...
【Java简易网盘源码】是一个基于Java技术栈开发的在线存储系统,它结合了后端的Spring、Spring MVC和JPA框架,以及前端的Thymeleaf模板引擎,为用户提供文件上传、下载和分享等基本功能。这个项目旨在帮助开发者理解...
Hibernate是一个强大的ORM框架,它将Java对象与数据库表映射,使得开发者可以使用Java对象进行数据库操作,而无需直接编写SQL语句。Hibernate支持CRUD(创建、读取、更新、删除)操作,以及复杂的查询功能。它的二级...
【Java简易BBS】是一个基于Java技术开发的轻量级论坛系统,专为初学者和小型社区设计。这个系统提供了一个完整的论坛功能集,让用户能够方便地进行交流、分享知识和建立讨论板块。 该系统的核心架构可能采用了MVC...
总之,基于SSH框架的简易博客系统是一个综合运用了后端开发技术、前端设计和数据库管理的实例,对学习和理解Java Web开发具有很好的实践价值。通过这个项目,开发者可以深入理解MVC模式,掌握SSH框架的协同工作,...
《基于Java的简易在线商城系统详解》 在线商城系统是电子商务的重要组成部分,它为商家与消费者提供了便捷的交易环境。本项目是一个简单的Java Web在线商城系统,采用Struts2和Hibernate框架进行开发,旨在帮助初学...