`

基于java 简易ORM 框架实现(二)

阅读更多

 

   内省(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

 
 
 可见用内省机制改进后执行效率得到很大提高。

 

  • orm.rar (14.2 KB)
  • 下载次数: 2
分享到:
评论

相关推荐

    基于java 简易ORM 框架实现(一)

    在本篇讨论中,我们将深入探讨“基于Java的简易ORM框架实现”。ORM,全称Object-Relational Mapping,是将数据库中的数据与程序中的对象进行映射的技术,它简化了数据库操作,使得开发者可以像操作对象一样操作...

    基于Java的简易ORM框架项目.zip

    随着信息技术的不断发展,企业对于数据的管理和操作需求日益增长。传统的JDBC(Java Database Connectivity)虽然可以实现...本项目旨在开发一个基于Java的简易ORM框架,为企业提供轻量级、高效的数据访问解决方案。

    EzeOrm纯手撸的一套简易javaorm框架。暂只支持mysql。

    EzeOrm是一个由Java开发的轻量级ORM框架,其主要目标是简化数据库操作,将对象与关系数据库之间的映射关系自动化处理,从而减少开发者在数据访问层的代码编写工作。ORM框架允许开发者以面向对象的方式操作数据库,...

    手写简易版ORM框架(仿mybatis)

    在这个简易版ORM框架中,我们模仿了著名的MyBatis框架,旨在简化数据库操作,提高开发效率。 在手写这个框架的过程中,我们可以理解以下核心概念和知识点: 1. **数据访问层(DAL,Data Access Layer)**:ORM框架...

    EzeOrm:一套简易java orm框架。暂只支持mysql

    EzeOrm 是一个使用java 编写的简易ORM(Object Relational Mapping 对象关系映射)框架。 关于ORM框架的简介请参考 。帮助程序员更加简单的将自己的java 程序与数据库相连接。 数据库支持 暂只支持 Mysql 项目状态 ...

    基于JAVA:todolist,带简易后端

    3. **数据访问层(DAO)**:用于与数据库交互,可能包含SQL查询或ORM框架如Hibernate、MyBatis。 4. **轻量级框架**:可能使用Spring Boot简化配置,提供依赖注入,便于模块化开发。 **三、数据库管理** 1. **关系...

    JAVA 三大框架实现的简易票务系统

    综上所述,"JAVA SSH 三大框架实现的简易票务系统"是一个典型的Java Web 应用示例,涵盖了用户交互、业务逻辑处理和数据存储的关键环节,为开发者提供了学习和实践的平台。对于想要深入了解Java Web 开发的人员来说...

    简易java框架开源论坛系统

    【简易Java框架开源论坛系统】是一个基于Java编程语言开发的开放源代码的社区交流平台。这个系统旨在提供一个简洁、高效且易于维护的环境,让用户能够进行问题讨论、分享知识和经验,促进技术交流。其核心特点在于...

    简易java框架开源订销管理系统

    首先,我们要明确“简易Java框架开源订销管理系统”是基于Java编程语言构建的,这表明系统主要依赖Java的强大功能和跨平台特性。Java以其“一次编写,到处运行”的理念,成为许多开发者首选的开发语言,尤其是在企业...

    简易java框架开源订销管理系统 v0.1

    ORM框架可以将Java对象与数据库表对应,减少直接SQL操作,提高开发效率。 四、RESTful API设计 考虑到系统的开放性和可扩展性,系统可能会采用RESTful API设计,提供标准的HTTP接口供外部系统调用。这种方式便于与...

    基于java和mysql的简易图书管理系统.zip

    数据持久化是将数据保存到硬盘,即使系统重启也能恢复,这通常通过序列化或ORM框架(如Hibernate)来实现。异常处理则确保了程序在遇到错误时能够优雅地退出,而不是突然崩溃,这通常通过try-catch-finally语句来...

    基于JAVA语言和SSH框架的人力资源管理系统的简易设计

    Hibernate作为持久化框架,实现了对象关系映射(ORM),使得JAVA对象可以直接操作数据库,减少了大量SQL编写工作。 人力资源管理系统(HRMS)的核心功能包括员工信息管理、招聘管理、培训管理、考勤管理、薪酬福利...

    Java简易网盘源码

    【Java简易网盘源码】是一个基于Java技术栈开发的在线存储系统,它结合了后端的Spring、Spring MVC和JPA框架,以及前端的Thymeleaf模板引擎,为用户提供文件上传、下载和分享等基本功能。这个项目旨在帮助开发者理解...

    基于SSH框架的BBS简易论坛

    Hibernate是一个强大的ORM框架,它将Java对象与数据库表映射,使得开发者可以使用Java对象进行数据库操作,而无需直接编写SQL语句。Hibernate支持CRUD(创建、读取、更新、删除)操作,以及复杂的查询功能。它的二级...

    java简易bbs

    【Java简易BBS】是一个基于Java技术开发的轻量级论坛系统,专为初学者和小型社区设计。这个系统提供了一个完整的论坛功能集,让用户能够方便地进行交流、分享知识和建立讨论板块。 该系统的核心架构可能采用了MVC...

    基于SSH框架的简易博客系统

    总之,基于SSH框架的简易博客系统是一个综合运用了后端开发技术、前端设计和数据库管理的实例,对学习和理解Java Web开发具有很好的实践价值。通过这个项目,开发者可以深入理解MVC模式,掌握SSH框架的协同工作,...

    java简易在线商城(带数据库)

    《基于Java的简易在线商城系统详解》 在线商城系统是电子商务的重要组成部分,它为商家与消费者提供了便捷的交易环境。本项目是一个简单的Java Web在线商城系统,采用Struts2和Hibernate框架进行开发,旨在帮助初学...

Global site tag (gtag.js) - Google Analytics