内省(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
可见用内省机制改进后执行效率得到很大提高。
相关推荐
NULL 博文链接:https://fengzhenbing98.iteye.com/blog/2194829
随着信息技术的不断发展,企业对于数据的管理和操作需求日益增长。传统的JDBC(Java Database Connectivity)虽然可以实现...本项目旨在开发一个基于Java的简易ORM框架,为企业提供轻量级、高效的数据访问解决方案。
EzeOrm 是一个使用java 编写的简易ORM(Object Relational Mapping 对象关系映射)框架
EzeOrm 是一个使用java 编写的简易ORM(Object Relational Mapping 对象关系映射)框架。 关于ORM框架的简介请参考 。帮助程序员更加简单的将自己的java 程序与数据库相连接。 数据库支持 暂只支持 Mysql 项目状态 ...
本资源为自定义持久层框架源码 适合有一定java基础对框架原理刚开始研究的同学。 源码中使用的mysql版本为8.0,使用5.0的同学请自行替换对象maven中mysql驱动版本, 连接的驱动类。
它基于Java语言实现,支持多种主流数据库,如MySQL、Oracle等,适用于JSP和Java Web应用程序。通过使用EasyDBO,开发者可以更便捷地操作数据库,提高开发效率。在毕业设计或课程设计中,学生可以选择使用EasyDBO作为...
一款简易使用的orm框架 1. 框架设计 1.1. 总体流程 > 1. 对于数据库的“增删改”操作,将对象输入,通过ORM框架处理,构建SQL语句,然后写入数据库,如图1所示; 2. 对于查询数据库的操作,输入要输出对象的Class,...
这个项目是一个基于Java语言开发的Web应用程序,采用SSM(Spring+SpringMVC+MyBatis)或SSH(Spring+SpringMVC+Hibernate)框架进行开发,使用MySQL作为数据存储,JSP作为页面开发。 项目的目标是构建一个高效、可靠...
这个项目是一个基于Java语言开发的Web应用程序,采用SSM(Spring+SpringMVC+MyBatis)或SSH(Spring+SpringMVC+Hibernate)框架进行开发,使用MySQL作为数据存储,JSP作为页面开发。 项目的目标是构建一个高效、可靠...
看过Hibernate/iBatis的强大,但对于小型应用而言,却显得过于庞大,于是,我决定自己写一个泛型的简易版ORM框架,仅支持单表数据映射,关联映射业务逻辑请自行处理。 配置非常简单,如果有不清楚的地方,可以到我的...
Sparkweb MVC 框架介绍 一、什么是 Sparkweb ? Sparkweb 是一个超轻量级的简易高效的 Java WEB 开发框架,其设计思想...Sparkweb框架包括:基础的MVC、国际化、JavaBean验证器、缓存 和 可选的 ORM 实现。 四、Sparkweb
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...
您可以使用Java像ThinkPHP框架的M方法一样,一行代码搞定数据库操作。以免造成内存溢出。也可以设置手动关闭以替换连接连接,无需重新设置连接实例参数,认为JD内部已做多线程安全处理,详见【0x0A 多线程安全】 。 ...
其开发宗旨是简单、快速的进行 Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpcliten… 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计...
用户管理采用ORM框架对数据库进行操作,用户登录时需要验证时的验证码采用AJAX对后台进行请求,动态验证验证码的正确性,用户可以实时刷新验证码。 用户请求主页时对后台请求,后台返回JSON数据供浏览器解析并向用户...
当当的基于jdbc协议的数据库分库分表解决方案,完美衔接spring+mybaits的ORM层实现(暂不支持oracle)。在本项目中用于实现CRUD的分库分表及读写分离。 #####github: 集成方式:嵌入式 使用依赖:jar包 项目配置文件...
java简易版开心农场源码 使用文档(完善进度70%,可以预览) QQ交流群:531812227 使用单位或项目: 宁波农行 山东农信 成都银行 中国建行上海开发中心 合肥农信 浦发电销 拉卡拉支付集团 中化壹化网 中化石化销售 苏州...
我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式,将应用程序的逻辑和界面分离,提供了更好的代码组织和可维护性。我们选择ASP.NET MVC...