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

Hibernate工具类

阅读更多
package cn.pde.utils;

import java.sql.Connection;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.hibernate.jdbc.Work;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.AbstractEntityPersister;


/**
 * Hibernate工具类 
 * @author yaha
 *
 */
public class HibernateUtil {
	
	/**
	 * 获取实体某个属性在相应数据库表中对应的字段名
	 * @param entityClass 实体类型
	 * @param fieldName  属性名
	 * @return
	 */
	public static String getColumnNameByFieldName(Class<?> entityClass,String fieldName) {
		String ret = null;
		if(entityClass != null) {
			try{
				SessionFactory factory = (SessionFactory)SpringUtils.getApplicationContext().getBean("hibernateSessionFactory");
				AbstractEntityPersister classMetadata = (AbstractEntityPersister)factory.getClassMetadata(entityClass);
				ret = classMetadata.getPropertyColumnNames(fieldName)[0];
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return ret;
	}
	
	
	/**
	 * 获取实体类映射表的字段名数组
	 * @param entityClass
	 * @return
	 */
	public static String[] getPropertyNames(Class<?> entityClass) {
		String[] ret = new String[]{};
		if(entityClass != null) {
			try{
				SessionFactory factory = (SessionFactory)SpringUtils.getApplicationContext().getBean("hibernateSessionFactory");
				ClassMetadata classMetadata = factory.getClassMetadata(entityClass);
				String[] propertys = classMetadata.getPropertyNames(); //获取普通字段
				String identifier =  classMetadata.getIdentifierPropertyName();  //获取主键
				ret = new String[1 +propertys.length];
				ret[0] = identifier;
				System.arraycopy(propertys, 0, ret, 1, propertys.length);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return ret;
	}
	
	/**
	 * 得到实体属性所字段的类型码
	 * @param entityClass
	 * @param propertyName
	 * @return 类型码(参见:java.sql.Types)
	 */
	public static Integer getColumnTypeNumByPropertyName(final Class<?> entityClass, final String propertyName) {
		return getColumnTypeNumByColumnName(entityClass, HibernateUtil.getColumnNameByFieldName(entityClass, propertyName));
	}
	
	/**
	 * 得到字段的类型码
	 * @param entityClass
	 * @param columnName
	 * @return 类型码(参见:java.sql.Types)
	 */
	public static Integer getColumnTypeNumByColumnName(final Class<?> entityClass, final String columnName) {
		final List<Integer> ret = new ArrayList<Integer>();
		SessionFactory factory = (SessionFactory)SpringUtils.getApplicationContext().getBean("hibernateSessionFactory");
		factory.openSession().doWork(new Work() {
			@Override
			public void execute(Connection conn) throws SQLException {
				Statement stmt = null;
				ResultSetMetaData rsmd = null;
				stmt = conn.createStatement();
				rsmd = stmt.executeQuery("select " + columnName + " from " + getTableNameByClass(entityClass)).getMetaData();
				try {
					ret.add(rsmd.getColumnType(1));
					
				}catch (Exception e) {
					e.printStackTrace();
				}finally {
					try {
						if(stmt != null) {
							stmt.close();
						}
						if(conn != null) {
							conn.close();
						}
					}catch(SQLException e) {
						e.printStackTrace();
					}
				}
				
			}
		});
		return ret.isEmpty() ? null : ret.get(0);
	}
	
	/**
	 * 获取实体类的数据库表名
	 * @param entityClass
	 * @return
	 */
	public static String getFieldNameByColumnName(Class<?> entityClass,String columnName) {
		String ret = null;
		if(entityClass != null) {
			try{
				SessionFactory factory = (SessionFactory)SpringUtils.getApplicationContext().getBean("hibernateSessionFactory");
				AbstractEntityPersister classMetadata = (AbstractEntityPersister)factory.getClassMetadata(entityClass);
				String[] props = classMetadata.getPropertyNames();
				start : {
					for(String prop : props) {
						for(String column : classMetadata.getPropertyColumnNames(prop)) {
							if(column.equalsIgnoreCase(columnName)) {
								ret = prop;
								break start;
							}
						}
					}
				}
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return ret;
	}
	/**
	 * 获取实体类的数据库表名
	 * @param entityClass
	 * @return
	 */
	public static String getTableNameByClass(Class<?> entityClass) {
		String ret = null;
		if(entityClass != null) {
			try{
				SessionFactory factory = (SessionFactory)SpringUtils.getApplicationContext().getBean("hibernateSessionFactory");
				AbstractEntityPersister classMetadata = (AbstractEntityPersister)factory.getClassMetadata(entityClass);
				ret = classMetadata.getTableName();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return ret;
	}
	
	/**
	 * 通过表名获取对应的实体类类型
	 * @param tableName
	 * @return
	 */
	public static Class<?> getEntityClassByTableName(String tableName) {
		Class<?> ret = null;
		if(!StringUtils.isBlank(tableName)) {
			try{
				SessionFactory factory = (SessionFactory)SpringUtils.getApplicationContext().getBean("hibernateSessionFactory");
				Map<String,ClassMetadata> metaMap = factory.getAllClassMetadata();
				for (String key : (Set<String>) metaMap.keySet()) {
					AbstractEntityPersister classMetadata = (AbstractEntityPersister) metaMap.get(key);
					if(classMetadata.getTableName().equalsIgnoreCase(tableName)) {
						ret = classMetadata.getMappedClass();
						break;
					}
				}
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
        return ret;
	}
	
	/**
	 * 把字符串型的值组装成实体属性
	 * @param entityClass
	 * @param propertyName
	 * @param propertyValue
	 * @return
	 */
	public static Object getPropertyValue(Class<?> entityClass, String propertyName,String propertyValueStr) {
		Object ret = null;
		Integer typeNum = getColumnTypeNumByPropertyName(entityClass, propertyName);
		switch(typeNum) {
		case Types.VARCHAR :
			ret = propertyValueStr;
			break;
		case Types.INTEGER :
			ret = Integer.valueOf(propertyValueStr);
			break;
		case Types.BIGINT :
			ret = Long.valueOf(propertyValueStr);
			break;
		case Types.DOUBLE :
			ret = Double.valueOf(propertyValueStr);
			break;
		case Types.FLOAT :
			ret = Float.valueOf(propertyValueStr);
			break;
		case Types.DATE :
		case Types.TIME :
		case Types.TIMESTAMP:
			SimpleDateFormat dateFormat =   new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			try {
				ret = dateFormat.parse(propertyValueStr);
			} catch (ParseException e) {
				System.out.println("字符串转换成日期出错,字符串格式须为:yyyy-MM-dd HH:mm:ss");
			}
			break;
		case Types.BIT :
			ret = ("true".equalsIgnoreCase(propertyValueStr) || "yes".equalsIgnoreCase(propertyValueStr)) ? Boolean.TRUE : Boolean.FALSE;
			break;
		}
		return ret;
	}
	
}

分享到:
评论

相关推荐

    hibernate工具类大全

    这个“Hibernate工具类大全”压缩包包含了一系列资源,可以帮助开发者更高效地搭建和使用Hibernate框架。以下是对这些资源的详细解释: 1. **jar包**: Hibernate的核心功能依赖于一组jar包,包括`hibernate-core....

    hibernate的大部分的工具类

    首先,让我们深入了解一下Hibernate工具类的重要性。在进行数据库操作时,开发人员经常需要执行一些通用的任务,例如创建会话工厂、打开和关闭数据库连接、管理事务等。Hibernate工具类可以提供这些功能的封装,减少...

    Spring+Hibernate工具类所有增删改查

    标题"Spring+Hibernate工具类所有增删改查"暗示了这是一个集合了Spring和Hibernate框架中用于基本数据库操作的工具类库。这些工具类通常包含了一系列静态方法,用于执行常见的数据库CRUD(创建、读取、更新、删除)...

    hibernate工具类

    hibernate工具类,帮助hibernate持久化类,连接数据库,操作表。

    hibernate+spring配置文件

    配置时需要指定Hibernate的配置文件(如`hibernate.cfg.xml`),以及实体类所在的包名。 - **DataSource**:定义数据源,这是连接数据库的关键。可以使用Apache的Commons DBCP或C3P0等连接池。 - **...

    超好用的hibernate查询工具类

    本篇将详细讲解一个“超好用的Hibernate查询工具类”,以及如何利用它来提升开发效率。 首先,我们需要理解Hibernate的基本概念。Hibernate是一种持久化框架,它可以将Java对象映射到数据库表,从而避免了编写大量...

    Hibernate笔记 马士兵

    第12课 使用hibernate工具类将对象模型生成关系模型 19 第13课 ID主键生成策略 20 一、 Xml方式 20 元素(主键生成策略) 20 二、 annotateon方式 21 1、AUTO默认 21 2、IDENTITY 22 3、SEQUENCE 22 4、为Oracle指定...

    hibernate5类包

    这个“hibernate5类包”包含了Hibernate 5.2.11.Final版本的所有核心组件和其他相关模块,使得开发者能够方便地在项目中集成和使用Hibernate。 在Hibernate 5.2.11.Final版本中,主要包含以下几个关键知识点: 1. ...

    java util工具类

    java util帮助类,包括日期工具类、字符串处理工具类、上传工具类、http请求工具类、hibernate工具类、MD5工具类、分页工具类等。 CodeStringUtil.java CreateFileUtil.java DateUtil.java FileCopy.java ...

    封装了一个Hibernate增删改查的工具类

    本篇将详细介绍一个基于Hibernate封装的增删改查工具类,该工具类整合了util、comm.util以及beanutils等库,旨在提高开发效率,降低代码复杂度,方便开发者快速地获取session和sessionFactory。 首先,让我们理解...

    ahibernate-ex

    【标题】"ahibernate-ex" 是一个针对Java开发者的开源项目,主要目的是提供一个改进版的AHibernate工具类。这个工具类旨在简化Hibernate框架的使用,让开发者在处理数据库操作时更加高效和便捷。 【描述】提到的...

    myeclipse 连接 ACCESS 数据库 HIBERNATE

    7. **测试连接**:在项目中创建一个测试类,使用Hibernate工具类和DAO进行数据库连接测试,确保能够正常读取和操作数据。 在提供的压缩包文件中,`META-INF`目录通常包含`hibernate.cfg.xml`和其他元数据;`docs`...

    hibernate反向生成数据库表.doc

    2. 使用Hibernate工具类`HibernateTool`执行反向工程。例如,通过调用`HibernateUtil.generateSchema()`方法,该方法会读取配置文件和反向工程文件,然后根据这些信息生成数据库表。 ```java import org.hibernate....

    马士兵hibernate笔记

    第12课讲述了如何使用Hibernate工具类将对象模型转化为关系模型,简化了数据库表的设计。第13课专注于ID主键的生成策略,包括Xml方式和AnnotateOn方式,如AUTO、IDENTITY、SEQUENCE、TABLE等策略,并讨论了联合主键...

    hibernate hql where语句拼接工具类

    本文将深入探讨“hibernate hql where语句拼接工具类”,并结合给出的`HqlWhere.java`文件,来讲解如何构建这样的工具类以及其背后的原理和用途。 首先,我们需要理解HQL中的WHERE子句。WHERE子句用于在查询结果中...

Global site tag (gtag.js) - Google Analytics