`

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

阅读更多

     ORM的全称是Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。

    有时基于工作需要,需要自己改写orm框架,orm核心技术还是java反射机制,泛型等。

    

package orm;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
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.List;

import util.JdbcUtils;

/**
 * 
 * @author fengzb
 * 
 * @param <T>
 */
public class Orm<T> {

	/**
	 * 获得映射数据库后的一个装配好的实体对象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();
			String[] colNames = getColNames(rs);

			T t = null;
			if (rs.next()) {
				t = clazz.newInstance();
				callSetter(t, colNames, 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;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			String[] colNames = getColNames(rs);

			List<T> objects = new ArrayList<T>();
			while (rs.next()) {
				T t = (T) clazz.newInstance(); //
				callSetter(t, colNames, rs);
				objects.add(t);
			}
			return objects;
		} finally {
			JdbcUtils.free(rs, ps, conn);
		}
	}


	/**
	 * 获取要映射的数据库表的列名
	 * @param rs
	 * @return
	 * @throws Exception
	 */
	private String[] getColNames(ResultSet rs) throws Exception {
		ResultSetMetaData rsmd = rs.getMetaData();
		int count = rsmd.getColumnCount();
		String[] colNames = new String[count];
		for (int i = 1; i <= count; i++) {
			colNames[i - 1] = rsmd.getColumnLabel(i);
		}
		return colNames;
	}
	
	/**
	 * 通过数据库表的列名加上‘set’,找到java bean类的set方法,利用反射机制进行装配
	 * @param object
	 * @param colNames
	 * @param rs
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws SQLException
	 */
	private void callSetter(T object, String[] colNames, ResultSet rs)
			throws IllegalAccessException, InvocationTargetException,
			SQLException {
		Method[] ms = object.getClass().getMethods();
		for (int i = 0; i < colNames.length; i++) {
			String colName = colNames[i];
			String methodName = "set" + colName;
			for (Method m : ms) {
				if (methodName.equalsIgnoreCase(m.getName())) {
					m.invoke(object, rs.getObject(colName));
					break;
				}
			}
		}
	}
}

 数据库表和java bean的映射是通过数据库列名 映射到bean的属性名;

 

数据库表tb_users

CREATE
    TABLE tb_user
    (
        userId INT NOT NULL AUTO_INCREMENT,
        department VARCHAR(255),
        division VARCHAR(255),
        email VARCHAR(255),
        employeeNo VARCHAR(255),
        name VARCHAR(255),
        passwordMD5 VARCHAR(255),
        phone VARCHAR(255),
        position VARCHAR(255),
        state INT NOT NULL,
        type INT NOT NULL,
        PRIMARY KEY (userId)
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8

 

java实体bean 类

package model;

public class User {
	private String	department;
	private String	division;
	private String	email;
	private String	employeeNo;
	private String	name;
	private String	passwordMD5;
	private String	phone;
	private String	position;
	private int	state;
	private int	type;
	private int	userId;
	
	//get set 方法
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "User [userId=" + userId + ", department=" + department
				+ ", division=" + division + ", email=" + email
				+ ", employeeNo=" + employeeNo + ", name=" + name
				+ ", passwordMD5=" + passwordMD5 + ", phone=" + phone
				+ ", position=" + position + ", state=" + state + ", type="
				+ type + "]";
	}
}

 

 

测试类

package orm;

import java.util.List;
import model.User;
import org.junit.Test;

public class OrmTest {
	@Test
	public void ormTest() throws Exception{
		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);
		}
	}
}

  仅仅通过数据库列名与bean属性名进行映射,比较简单,当数据库中列名与bean属性名不一致时,

可以通过别名解决

例如bean中为depart,数据库中为department

		User user= (User) orm.getBean("SELECT userId ,department depart,division,email,employeeNo,name,passwordMD5,phone,position,state,type FROM tb_user",User.class);

 

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

相关推荐

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

    在本篇“基于Java简易ORM框架实现(二)”中,我们将深入探讨如何构建一个简单的对象关系映射(Object-Relational Mapping,ORM)框架。ORM框架是Java开发中常用的一种技术,它允许开发者以面向对象的方式操作数据库,...

    基于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框架...

    基于JAVA:todolist,带简易后端

    【标题】"基于JAVA:todolist,带简易后端"是一个项目,它使用Java编程语言构建了一个简单的待办事项管理应用。这个应用不仅包含了前端用户界面,还配备了一个基础的后端系统,用于数据存储和处理。让我们深入探讨...

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

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

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

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

    简易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简易网盘源码

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

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

    在IT行业中,构建一个基于JAVA语言和SSH框架的人力资源管理系统是一项常见的任务,它涉及到企业信息化建设的关键领域。本文将详细解析这个系统的设计原理、主要技术栈以及实施过程中的核心知识点。 首先,JAVA语言...

    基于Springboot + Mybatis框架实现的一个简易的商场购物系统后端.zip

    【标题】"基于Springboot + Mybatis框架实现的一个简易的商场购物系统后端"是一个典型的Web应用开发项目,主要用于教学和实践目的,特别是在计算机类的毕业设计中常见。这个项目结合了Spring Boot和Mybatis两个主流...

    基于SSH框架的BBS简易论坛

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

    java简易bbs

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

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

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

Global site tag (gtag.js) - Google Analytics