`
vampire1126
  • 浏览: 87852 次
  • 性别: 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滴)

分享到:
评论

相关推荐

    hibernate-orm-5.0源代码

    Hibernate ORM 5.0中的实体管理是其核心功能之一。通过注解或XML配置,开发者可以定义实体类,实现对象与数据库表之间的映射。源码中,`SessionFactory`负责创建`Session`实例,而`Session`是操作实体的主要接口,...

    Hibernate ORM 新特性之 Service(Registry).

    通过这种方式,Hibernate ORM引入了更灵活和模块化的架构,使得扩展和定制更加方便。内置的Services涵盖了各种功能,如配置解析、JDBC连接管理、JNDI查找等。这些Services的详细信息可以通过查阅官方文档或相关资料...

    Hibernate-ORM-5.4.30 官方文档: 入门指南

    总而言之,Hibernate ORM 5.4.30 入门指南是一份宝贵的学习资源,尤其对于那些希望在Java应用程序中实现高效、优雅数据库操作的开发者来说更是如此。通过逐步的教程和实例代码,用户能够快速掌握Hibernate的基本使用...

    应用jsp和hibernate设计实现在线通讯录.doc

    本文档中所设计的在线通讯录系统是使用 JSP 和 Hibernate 实现的,该系统主要包括用户管理、抄表管理和电费管理等几个功能模块。使用 JSP 实现用户界面,使用 Hibernate 实现与数据库的交互,实现了数据的持久化和...

    org.springframework.orm.hibernate3.LocalSessionFactoryBean

    这包括Spring ORM模块以及Hibernate核心库等。 2. **版本不兼容**:如果项目的依赖管理不善,可能会出现不同库之间版本冲突的问题,导致某些类找不到或不可用。 3. **配置错误**:Spring的配置文件可能存在错误,...

    spring-orm-hibernate4源码

    Spring的ORM模块提供了与Hibernate的无缝集成,使得开发者可以在不脱离Spring的上下文环境中使用Hibernate的强大功能。 在Spring与Hibernate4的集成中,主要涉及以下几个核心概念: 1. **SessionFactory**: ...

    cxf+spring+hibernate整合添加功能实现修改版

    【标题】"cxf+spring+hibernate整合添加功能实现修改版"涉及的是一个集成开发环境中的核心技术栈,即Apache CXF、Spring框架和Hibernate ORM的整合应用,旨在实现服务添加功能的优化。Apache CXF是一个开源的WS-*...

    spring学习:hibernate orm集成

    Spring和Hibernate是两个非常流行的Java开发框架,Spring提供了全面的企业级应用开发解决方案,而Hibernate则是Java领域中最著名的ORM框架之一。本文将详细介绍如何在Spring项目中集成Hibernate,实现高效的数据库...

    hibernate struts2 spring

    1. Hibernate:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以用面向对象的方式处理数据,而无需编写大量的SQL语句。Hibernate提供了一种映射机制,将...

    Hibernate最小功能包

    1. **Hibernate Core**: 这是Hibernate的基础模块,提供了ORM的主要功能,包括实体管理、会话管理和查询语言(HQL)。它包含了Entity Manager接口以及其实现,使得对象与数据库表之间的映射变得简单。 2. **Hibernate...

    Spring+SpringMVC+Hibernate+mysql+maven多模块

    标题 "Spring+SpringMVC+Hibernate+mysql+maven多模块" 涉及的是一个常见的Java Web开发技术栈,这个组合常用于构建大型、复杂的Web应用程序。以下是对这些技术及其结合方式的详细解释: 1. **Spring框架**:Spring...

    Spring数据库访问之ORM(三)

    1. Hibernate概述:Hibernate是Java领域最流行的ORM框架之一,它不仅提供了JPA规范的实现,还具有自己的扩展特性。 2. Spring整合Hibernate:Spring通过SessionFactory和TransactionManager的配置,实现了与...

    java订单管理系统,使用springMVC、hibernate、jui实现

    其次,Hibernate作为ORM(Object-Relational Mapping)框架,实现了Java对象与数据库表之间的映射,简化了数据库操作。在订单管理系统中,Hibernate通过实体类和配置文件,自动处理SQL语句,减少了开发者对数据库...

    java springmvc4.0+hibernate4.1 jar架包

    开发者在项目中引入这些jar,就可以利用SpringMVC的MVC功能和Hibernate的ORM能力,构建出高性能、易维护的Java Web应用。 总的来说,这个压缩包提供了构建基于Java SpringMVC 4.0和Hibernate 4.1应用的基础,帮助...

    Hibernate源码

    【标题】"Hibernate源码"涉及的是Java领域中著名的对象关系映射(ORM)框架Hibernate的核心源代码。ORM框架允许开发者使用面向对象的方式来操作数据库,而无需直接编写SQL语句,极大地提高了开发效率和代码可读性。...

    Spring之ORM模块代码详解

    Spring的ORM模块是其核心组件之一,用于整合各种Object-Relational Mapping(ORM)框架,如Hibernate、JDO、TopLink、iBatis等。这个模块使得开发者可以在Spring的管理下方便地使用这些ORM框架,简化了数据访问层...

    org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException

    标题中的"org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException"是一个具体的异常类型,源自Spring框架的Hibernate4模块。这个异常通常在乐观锁(Optimistic Locking)机制失败时抛出,...

    spring mvc+hibernate实现的用户管理系统

    Spring MVC和Hibernate是JavaEE开发中非常流行的框架,分别用于实现MVC设计模式和提供ORM(对象关系映射)功能。整合这两种技术可以提高开发效率,增强系统的可维护性和扩展性。 首先,Spring MVC是一个强大的MVC...

    hibernate5.1.10源码包

    通过阅读这些源码,你可以深入理解Hibernate的工作原理,学习如何实现ORM框架,以及优化数据库访问性能。同时,这也是提升Java开发技能和数据库设计能力的好途径。如果你希望深入学习Hibernate,可以从这些模块入手...

Global site tag (gtag.js) - Google Analytics