`
vampire1126
  • 浏览: 87505 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

Hibernate之ORM功能模块实现

阅读更多

     Hibernate的ORM功能,简而言之就是用户传一个任意对象进去,然后系统自动生成相应的SQL语句并执行

因此,实现一个简易的ORM模块并不难,关键就在于对JAVA反射机制的使用和SQL语句的拼凑

 

     基本思路是:

            · 根据传入的Object来得到数据库的表名

            · 得到属性名和对应的值

            · 将所得信息进行整合,拼凑一条SQL语句

 

代码:

 

    1.   定义两个测试用的POJO类(省略get和set方法)

public class UserInfo {
	
	private int id;
	private String userName;
	private String userPwd;
	private int userAge;

}

 

public class Article {
	private int id;
    private String title;
    private String author;
    private String content;
    
}

 

   2.  然后写个数据库的连接静态类

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConnector {

	public static Connection conn;
	
	public static boolean buildConn(){
		try{
	    	Class.forName("com.mysql.jdbc.Driver");
	    	String url = "jdbc:mysql://localhost:3306/test";
	    	conn = DriverManager.getConnection(url,"root","password");
	    	return true;
	    }catch(Exception e){
	    	e.printStackTrace();
	    }
		return false;
	}
}

 

   3.  接下来是主体部分了

import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import cn.netjava.dao.DBConnector;
import cn.netjava.pojo.Article;
import cn.netjava.pojo.UserInfo;

public class ORMmodel {

	/**
	 * 插入数据
	 * @param obj 需要保存的对象
	 * @return 保存是否成功
	 */
	public boolean insert(Object obj){
		String sql = "insert into ";
		//得到表名
		String tableName = obj.getClass().getName();
		sql = sql + tableName.substring(tableName.lastIndexOf(".")+1) + "(";
		//得到properties和values
		Method[] methods = obj.getClass().getMethods();
		ArrayList<String> properties = getProperties(methods);
		ArrayList<Object> values = getValues(methods,obj);
		//拼接sql语句
		String sql1 = "";
		String sql2 = ") value (";
		for(int i=0;i<properties.size();i++){
			String property = properties.get(i);
			Object value = values.get(i);
			if(property.equals("Id")){//插入时id属性不需要处理,跳过
				continue;
			}
			sql1 += property + ",";
			sql2 += "'" + value + "',";
		}
		sql += sql1.substring(0,sql1.length()-1) + sql2.substring(0,sql2.length()-1) + ")";
		try{
			Statement state = DBConnector.conn.createStatement();
			state.executeUpdate(sql);
			return true;
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 删除对象
	 * @param obj
	 * @return
	 */
	public boolean delete(Object obj){
		String sql = "delete from ";
		//得到表名
		String tableName = obj.getClass().getName();
		sql = sql + tableName.substring(tableName.lastIndexOf(".")+1) + " where ";
		//得到properties和values
		Method[] methods = obj.getClass().getMethods();
		ArrayList<String> properties = getProperties(methods);
		ArrayList<Object> values = getValues(methods,obj);
		//拼接sql语句
		for(int i=0;i<properties.size();i++){
			String property = properties.get(i);
			Object value = values.get(i);
			
			if(property!=null&&value!=null){
				if(value instanceof Integer){              //如果属性类型为int而且
					int a = ((Integer) value).intValue();  //没被赋值时,默认是0,所以
					if(a==0){                              //此处对值为值为0的属性不做
						continue;                          //处理,跳过
					}                                      //(此处理只适用于不会出现值
				}                                          //为0的属性的对象,仅供测试)
				sql += property + "='" + value.toString() + "' and ";
			}
		}
		sql = sql.substring(0, sql.length()-5);
		try{
			Statement state = DBConnector.conn.createStatement();
			state.executeUpdate(sql);
			return true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 修改对象
	 * @param obj
	 * @return
	 */
	public boolean update(Object obj){
		String sql = "update ";
		//得到表名
		String tableName = obj.getClass().getName();
		sql += tableName.substring(tableName.lastIndexOf(".")+1) + " set ";
		//得到properties和values
		Method[] methods = obj.getClass().getMethods();
		ArrayList<String> properties = getProperties(methods);
		ArrayList<Object> values = getValues(methods,obj);
		//拼接sql语句
		String id = null;
		for(int i=0;i<properties.size();i++){
			String property = properties.get(i);
			Object value = values.get(i);
			if(property.equals("Id")){
				id = value.toString();
				continue;
			}
			if(value instanceof Integer){
				int a = ((Integer) value).intValue();
				if(a==0){
					continue;
				}
			}
			sql += property + "='" + value.toString() + "',";
		}
		sql = sql.substring(0,sql.length()-1) + " where id='" + id + "'";
		try{
			Statement state = DBConnector.conn.createStatement();
			state.executeUpdate(sql);
			return true;
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 查找所有包含指定属性的Object
	 * @param obj
	 * @return
	 */
	public ArrayList<Object> search(Object obj){
		ArrayList<Object> list = new ArrayList<Object>();
		String sql = "select * from ";
		//得到表名
		String tableName = obj.getClass().getName();
		sql += tableName.substring(tableName.lastIndexOf(".")+1) + " where ";
		//得到properties和values
		Method[] methods = obj.getClass().getMethods();
		ArrayList<String> properties = getProperties(methods);
		ArrayList<Object> values = getValues(methods,obj);
		//拼接sql语句
		for(int i=0;i<properties.size();i++){
			String property = properties.get(i);
			Object value = values.get(i);
			
			if(property!=null&&value!=null){
				if(value instanceof Integer){
					int a = ((Integer) value).intValue();
					if(a==0){
						continue;
					}
				}
				sql += property + "='" + value.toString() + "' and ";
			}
		}
		sql = sql.substring(0,sql.length()-5);
		try{
			Statement state = DBConnector.conn.createStatement();
			ResultSet set = state.executeQuery(sql);
			while(set.next()){
				if(tableName.substring(tableName.lastIndexOf(".")+1).equals("UserInfo")){
					UserInfo user = new UserInfo();
					user.setUserAge(set.getInt("userage"));
					user.setId(set.getInt("id"));
					user.setUserName(set.getString("username"));
					user.setUserPwd(set.getString("userpwd"));
					list.add(user);
				}
				if(tableName.substring(tableName.lastIndexOf(".")+1).equals("Article")){
					Article article = new Article();
					article.setAuthor(set.getString("author"));
					article.setId(set.getInt("id"));
					article.setContent(set.getString("content"));
					article.setTitle(set.getString("title"));
					list.add(article);
				}
			}
			return list;
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 根据方法名得到属性名的List
	 * @param methods
	 * @return
	 */
	private ArrayList<String> getProperties(Method[] methods){
		ArrayList<String> properties = new ArrayList<String>();
		for(Method m : methods){
			String methodName = m.getName();
			if(methodName.startsWith("get")&&!methodName.equals("getClass")){
				String property = methodName.substring(3);
				properties.add(property);
			}
		}
		return properties;
	}
	/**
	 * 得到属性对应的value
	 * @param methods
	 * @param obj
	 * @return
	 */
	private ArrayList<Object> getValues(Method[] methods,Object obj){
		ArrayList<Object> values = new ArrayList<Object>();
		for(Method m : methods){
			String methodName = m.getName();
			if(methodName.startsWith("get")&&!methodName.equals("getClass")){
				try{
					Object value = m.invoke(obj, null);
					values.add(value);
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
		return values;
	}
}

 

 

   4.  最后再自己写个main函数测试下

       

 

特别说明:

          ·以上代码测试前需要准备好一个数据库并预先定义好userinfo和article表

          ·修改数据时id属性不能为0(未定义的话id也会默认为0滴)

分享到:
评论

相关推荐

    基于spring+springmvc+hibernate的在线招标项目(免费提供源码)

    通过Spring框架实现了模块化的业务逻辑和依赖注入,Spring MVC负责处理用户请求和页面跳转,而Hibernate作为ORM框架则实现了数据持久化和访问。项目的亮点包括用户友好的界面设计、实时消息通知系统和安全可靠的数据...

    hibernate-3.2完整源码包和4.x模块(ogm、search、validator等)版本包.txt

    Hibernate是开源的ORM对象关系映射框架,包括Session、SessionFactory、Transaction、Query、Criteria和Configuration六核心类和接口。

    hibernate-orm-on-java9-modules

    Hibernate ORM 5作为Java 9自动模块 一个简单的测试平台,用于将Hibernate ORM 5用作(自动)JPMS模块。 一些值得注意的事情: 除了java.transaction和java.persistence之外,几乎所有依赖项都用作自动模块。 JDK...

    Hibernate源码

    Hibernate源码,包含hibernate-core、hibernate-ehcache、hibernate-c3p0、hibernate-osgi、hibernate-spatial等模块

    CRUD-Spring-Hibernate:示例 POC 以 Hibernate 作为 ORM 接触 Spring 的端到端流程

    ORM - Hibernate mysql数据库。 笔记 SQL 文件保存在 sql 文件夹下。 战争在目标文件夹下。 未来的增强 为登录身份验证实现 Spring 安全的全部范围。 使用 Hibernate 的所有关系概念。 为员工模块编写单元测试...

    车辆管理系统(struts+hibernate+spring+oracle).rar

    Hibernate作为ORM框架,负责将关系型数据库中的表映射成对象,简化了数据访问层的编码工作。Spring作为IoC容器,负责管理对象的生命周期和依赖关系,降低了各个模块之间的耦合度。Oracle作为关系型数据库,存储了...

    源码基于JSP的车辆管理系统(struts+hibernate+spring+oracle).rar

    Struts框架负责处理用户请求和页面跳转,Hibernate框架实现了对象关系映射(ORM),简化了数据库操作,而Spring框架则提供了依赖注入和事务管理等核心功能,降低了系统耦合度,提高了可维护性。 系统主要实现了车辆...

    基于JAVA+struts+hibernate实现的网络购物系统.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

    java项目源码之SaaS OA协同办公软件 v2.0的实现.rar

    Hibernate ORM:采用Hibernate框架实现对象关系映射,简化了数据持久化操作,提高了数据访问效率和可靠性。 RESTful API:设计符合RESTful风格的API接口,实现了前后端分离,提高了系统的可扩展性和灵活性。 JWT ...

    [其他类别]Struts+Hibernate实现MVC_strutsmvc.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

    java_jsp项目源码_网上书店(struts+hibernate+css+mysql)130223.rar

    2. 使用Hibernate作为ORM框架,实现了对数据库的抽象和封装,简化了数据库操作。 3. 采用MySQL作为数据库存储,具有较高的性能和可扩展性。 4. 使用CSS进行前端页面设计,实现了良好的用户界面和交互体验。 **二次...

    java简历范文.zip

    如:该项目主要功能模块分为首页Portlet展示、协同审批、协同工作、日历、资源管理、知识中心、新闻中心、通讯录、系统管理。是一套很好的办公自动化系统,用户能够轻松自定义表单、工作流、公文等,有良好的协同...

    车辆管理系统(struts+hibernate+spring+oracle)130225.rar

    Hibernate作为ORM框架,负责将Java对象映射到Oracle数据库中的表,使得开发者可以用面向对象的方式来操作数据库,而不需要编写复杂的SQL语句。Spring作为IoC容器,负责管理对象的生命周期和依赖关系,使得系统的各个...

    基于JAVA的两个通用安全模块的设计与实现.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

    JAVA物业管理系统设计与实现.rar

    Hibernate框架:用于实现对象关系映射(ORM),简化数据操作和管理,提高开发效率。 MySQL数据库:作为数据存储的选择,提供了稳定可靠的数据存储和管理功能。 安全性和权限控制: 对于系统的敏感操作,如用户管理...

    java开源项目:基于spring+springmvc+hibernate的在线招标项目(免费提供源码)

    1. 项目背景介绍 这个项目是一个基于Spring+Spring MVC+Hibernate的在线招标系统,旨在解决传统招标过程中的繁琐和低效问题,提高招标效率和透明...Hibernate框架: 负责对象关系映射(ORM),简化了数据访问层的开发。

    SpringBoot项目基于springboot框架开发的景区民宿预约系统的设计与实现.zip

    技术实现上,后端使用SpringBoot简化开发流程和配置工作,SpringMVC负责请求响应周期,MyBatis或Hibernate作为ORM工具与MySQL或其他数据库交互。前端可能采用Angular、React或Vue.js等现代JavaScript框架构建一个...

    支持多数据库的ORM框架ef-orm.zip

    整个框架只有两个JAR包,模块和功能都较为轻量。依赖少 整个框架只有三个jar库。间接依赖仅有commons-lang, slf4j等7个通用库,作为一个ORM框架,对第三方依赖极小。简单直接的API 框架的API设计直接面向数据库...

    Java课程设计大作业,包含面板设计,接口设计,各种功能植入

    题目/主题:确定项目的主题,例如预约挂号系统、图书管理系统等。 面板设计:根据需求设计系统的各个面板,包括登录界面、主界面、数据展示界面等。...测试和优化:完成功能实现后,进行测试,确保系统的稳定性和正确

    博客系统(struts+hibernate+spring)130225.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

Global site tag (gtag.js) - Google Analytics