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框架。以下是对这些资源的详细解释: 1. **jar包**: Hibernate的核心功能依赖于一组jar包,包括`hibernate-core....
首先,让我们深入了解一下Hibernate工具类的重要性。在进行数据库操作时,开发人员经常需要执行一些通用的任务,例如创建会话工厂、打开和关闭数据库连接、管理事务等。Hibernate工具类可以提供这些功能的封装,减少...
标题"Spring+Hibernate工具类所有增删改查"暗示了这是一个集合了Spring和Hibernate框架中用于基本数据库操作的工具类库。这些工具类通常包含了一系列静态方法,用于执行常见的数据库CRUD(创建、读取、更新、删除)...
hibernate工具类,帮助hibernate持久化类,连接数据库,操作表。
配置时需要指定Hibernate的配置文件(如`hibernate.cfg.xml`),以及实体类所在的包名。 - **DataSource**:定义数据源,这是连接数据库的关键。可以使用Apache的Commons DBCP或C3P0等连接池。 - **...
本篇将详细讲解一个“超好用的Hibernate查询工具类”,以及如何利用它来提升开发效率。 首先,我们需要理解Hibernate的基本概念。Hibernate是一种持久化框架,它可以将Java对象映射到数据库表,从而避免了编写大量...
第12课 使用hibernate工具类将对象模型生成关系模型 19 第13课 ID主键生成策略 20 一、 Xml方式 20 元素(主键生成策略) 20 二、 annotateon方式 21 1、AUTO默认 21 2、IDENTITY 22 3、SEQUENCE 22 4、为Oracle指定...
这个“hibernate5类包”包含了Hibernate 5.2.11.Final版本的所有核心组件和其他相关模块,使得开发者能够方便地在项目中集成和使用Hibernate。 在Hibernate 5.2.11.Final版本中,主要包含以下几个关键知识点: 1. ...
java util帮助类,包括日期工具类、字符串处理工具类、上传工具类、http请求工具类、hibernate工具类、MD5工具类、分页工具类等。 CodeStringUtil.java CreateFileUtil.java DateUtil.java FileCopy.java ...
本篇将详细介绍一个基于Hibernate封装的增删改查工具类,该工具类整合了util、comm.util以及beanutils等库,旨在提高开发效率,降低代码复杂度,方便开发者快速地获取session和sessionFactory。 首先,让我们理解...
【标题】"ahibernate-ex" 是一个针对Java开发者的开源项目,主要目的是提供一个改进版的AHibernate工具类。这个工具类旨在简化Hibernate框架的使用,让开发者在处理数据库操作时更加高效和便捷。 【描述】提到的...
7. **测试连接**:在项目中创建一个测试类,使用Hibernate工具类和DAO进行数据库连接测试,确保能够正常读取和操作数据。 在提供的压缩包文件中,`META-INF`目录通常包含`hibernate.cfg.xml`和其他元数据;`docs`...
2. 使用Hibernate工具类`HibernateTool`执行反向工程。例如,通过调用`HibernateUtil.generateSchema()`方法,该方法会读取配置文件和反向工程文件,然后根据这些信息生成数据库表。 ```java import org.hibernate....
第12课讲述了如何使用Hibernate工具类将对象模型转化为关系模型,简化了数据库表的设计。第13课专注于ID主键的生成策略,包括Xml方式和AnnotateOn方式,如AUTO、IDENTITY、SEQUENCE、TABLE等策略,并讨论了联合主键...
本文将深入探讨“hibernate hql where语句拼接工具类”,并结合给出的`HqlWhere.java`文件,来讲解如何构建这样的工具类以及其背后的原理和用途。 首先,我们需要理解HQL中的WHERE子句。WHERE子句用于在查询结果中...