springMVC3+hibernate3升级为springMVC4+hibernate4步骤
来源:互联网 发布:问道手游刷道辅助软件 编辑:程序博客网 时间:2024/05/19 17:07
import java.io.Serializable; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.sql.CallableStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.Id; import javax.persistence.Transient; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.orm.hibernate4.SessionFactoryUtils; import org.springframework.stereotype.Repository; /**@version 20151231 * SuperBaseDaoImpl中主要实现和数据库相关的操作逻辑,不涉及和视图层或控制层的一些操作; * 其它dao可以继承此dao然后扩展; * @author tingfeng * 1.get时主要返回单个对象; * 2.find使用的hql语句进行操作,主要返回list; */ @SuppressWarnings("unchecked") @Repositorypublic abstract class SuperBaseDaoImpl{ @Autowiredprivate SessionFactory sessionFactory; private Session session; public SessionFactory getSessionFactory() { return sessionFactory; } /** * 返回当前的Session,如果为null,返回SessionFactory的CurrentSession; * @return */ public Session getCurrentSession() { if(session!=null) return session; return this.getSessionFactory().getCurrentSession(); } /** * 此时获取当前session,不是从SessionFactory中取Session,可能为null; * 如果需要从SessionFactory中取,用getCurrentSession()方法; * @return */ public Session getBeanSession() { return session; } public void setSession(Session session) { this.session = session; } /** * 返回存储此对象的主键 */ public <T> Serializable save(T o){ return this.getCurrentSession().save(o); } public <T> void saveByCollection(Collection<T> collection){ for(T t:collection){ this.save(t); } } public <T> void update(T o) { this.getCurrentSession().update(o); } public <T> void saveOrUpdate(T o) { this.getCurrentSession().saveOrUpdate(o); } /**更新一个实体中指定的字段 * 这里columnNames和columnsValues的名字和值得顺序必须一致; * @param t * @param columnNames * @param columnValues * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws SecurityException * @throws NoSuchFieldException */ public <T> void updateByColumns(T t,List<String> columnNames,List<?> columnValues) throws NoSuchFieldException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ String tableNameString=t.getClass().getSimpleName(); String hqlString="update "+tableNameString+" table_ set "; for(int i=0;i<columnNames.size();i++){ hqlString+=columnNames.get(i)+"="+columnValues.get(i); } hqlString+=" where table_."+this.getPkName(t.getClass())+"="+this.getPkValue(t).toString(); this.executeHql(hqlString); } /**更新一个实体中除开指定的字段之外的字段 * 这里columnNames和columnsValues的名字和值得顺序必须一致; * @param t * @param columnNames * @param columnValues * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws SecurityException * @throws NoSuchFieldException */ public <T> void updateByExceptColumns(T t,List<String> exceptColumnNames,List<?> columnValues) throws NoSuchFieldException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ List<String> columnNames=this.getEntityColumnNames(t.getClass(), exceptColumnNames); String tableNameString=t.getClass().getSimpleName(); String hqlString="update "+tableNameString+" table_ set "; for(int i=0;i<columnNames.size();i++){ hqlString+=columnNames.get(i)+"="+columnValues.get(i); } hqlString+=" where table_."+this.getPkName(t.getClass())+"="+this.getPkValue(t).toString(); this.executeHql(hqlString); } public <T> T get(Class<T> c, Serializable id) { return (T) this.getCurrentSession().get(c,id); } public <T> T get(String hql) { return this.get(hql, null); } public <T> T get(String hql, Map<String, Object> params) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, params); List<T> l = q.list(); if (l != null && l.size() > 0) { return l.get(0); } return null; } public <T> void delete(T o) { this.getCurrentSession().delete(o); } /** * 从数据库中找出此id对象并删除 * @param entityClass * @param id */ public <T, PK extends Serializable> void delete(Class<T> entityClass, PK id) { getCurrentSession().delete(get(entityClass, id)); } /**hql语句,"delete from "+tableName+" where "+columnName+" in ("+columnValues+")" * 用in语句删除指定表中,包含有指定值得指定列的记录; * @param tableName * @param columnName * @param columnValues 如1,3,4这种in语句参数需要的内容 * @throws Exception */ public void deleteByColumns(String tableName,String columnName,String columnValues) throws Exception { /* if(com.tingfeng.sql.utils.SqlUtils.sqlValidate(columnValues)){ throw new Exception("列名字数据中包含sql关键字!"); } */ String hql="delete from "+tableName+" where "+columnName+" in ("+columnValues+")"; this.executeHql(hql); } /** * hql语句,"delete from "+tableName+" where "+columnName+" in ("+columnValues+")" * 用in语句删除指定表中,包含有指定值得指定列的记录; * @param tableName * @param columnName * @param columnValues 一个参数值的集合 */ public void deleteByColumns(String tableName,String columnName,Collection<?> columnValues) { String hql="delete from "+tableName+" where "+columnName+" in (:columnValues)"; Map<String,Object> params=new HashMap<String, Object>(); params.put("columnValues",columnValues); this.executeHql(hql,params); } /** * 如果有id并存在于数据库中,则更新,否则保存 * @param model */ public <T> void merge(T model) { getCurrentSession().merge(model); } public <T> List<T> findList(String hql) { Query q = this.getCurrentSession().createQuery(hql); return q.list(); } public <T> List<T> findList(String hql, Map<String, Object> params) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, params); return q.list(); } /** * * @param hql * @param topCount 返回前topCount条记录 * @return */ public <T> List<T> findTopList(String hql, int topCount) { // 获取当前页的结果集 Query query = this.getCurrentSession().createQuery(hql); query.setFirstResult(0); if(topCount<0) topCount=0; query.setMaxResults(topCount); return query.list(); } /** * 用hql语句,得到当前表的所有记录 * @param tableName * @return */ public <T> List<T> findAll(String tableName){ String hqlString="select * from "+tableName; return this.findList(hqlString); } /** * * @param hql * @param params * @param page 当前页码 * @param rows 每页显示的记录数量 * @return */ public <T> List<T> findList(String hql, Map<String, Object> params, int page, int rows) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, params); if(page<1) page=1; if(rows<0) rows=0; return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list(); } public <T> List<T> findList(String hql, int page, int rows) { return this.findList(hql, null, page,rows); } public Long getCountByHql(String hql) { Query q = this.getCurrentSession().createQuery(hql); return (Long) q.uniqueResult(); } public Long getCountByHql(String hql, Map<String, Object> params) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, params); return (Long) q.uniqueResult(); } /** * 根据HQL语句返回一个值,如分布获取总页数 */ public Object getCountByHql(String hql, Object... params) { Query query = getCurrentSession().createQuery(hql); this.setParameterToQuery(query, params); return query.uniqueResult(); } /** * 根据HQL语句,获得查找总记录数的HQL语句 如: select ... from Orgnization o where o.parent is * null 经过转换,可以得到: select count(*) from Orgnization o where o.parent is null * @param hql * @return */ protected String getCountQuery(String hql) { int index = hql.toLowerCase().indexOf("from"); int last = hql.toLowerCase().indexOf("order by"); if (index != -1) { if (last != -1) { return "select count(*) " + hql.substring(index, last); } return "select count(*) " + hql.substring(index); } return null; } public int executeHql(String hql) { Query q = this.getCurrentSession().createQuery(hql); return q.executeUpdate(); } public int executeHql(String hql, Map<String, Object> params) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, params); return q.executeUpdate(); } public int executeHql(String hql,Object... objects) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, objects); return q.executeUpdate(); } /** * * @param hql * @param objects 参数,其顺序应该和?占位符一一对应 * @return */ public int executeHql(String hql,List<?> objects) { Query q = this.getCurrentSession().createQuery(hql); this.setParameterToQuery(q, objects); return q.executeUpdate(); } /** * @param q * @param params 当前支持普通对象,数组,集合三种类型的参数 */ protected void setParameterToQuery(Query q,Map<String, Object> params){ if (params != null && !params.isEmpty()) { for (String key : params.keySet()) { if(params.get(key) instanceof Object[]){ Object[] objs=(Object[]) params.get(key); q.setParameterList(key, objs); }else if(params.get(key) instanceof Collection<?>){ Collection<?> collection=(Collection<?>) params.get(key); q.setParameterList(key, collection); }else{ q.setParameter(key, params.get(key)); } } } } /** * @param q * @param params 当前支持普通对象,不支持集合与数组 */ protected void setParameterToQuery(Query q,Object... params){ if (params != null && params.length>0) { for (int i=0;i<params.length;i++) { Object object=params[i]; q.setParameter(i,object); } } } /** * @param q * @param params 当前支持普通对象,不支持集合与数组 */ protected void setParameterToQuery(Query q,List<?> params){ if (params != null && !params.isEmpty()) { for (int i=0;i<params.size();i++) { Object object=params.get(i); q.setParameter(i,object); } } } /**************************************************************** ******* 上面是和hql相关的操作,下面是和sql相关的操作**************** ****************************************************************/ public <T> T getCountBySql(String sql) { return this.getCountBySql(sql,new HashMap<String, Object>()); } /** * 根据SQL语句返回一个值,如分布获取总页数 */ public <T> T getCountBySql(String sql, Object... params) { Query query = getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); this.setParameterToQuery(query, params); return (T) query.uniqueResult(); } /** * 根据SQL语句返回一个值,如分布获取总页数 */ public <T> T getCountBySql(String sql,Map<String,Object> params) { Query query = getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); this.setParameterToQuery(query, params); return (T) query.uniqueResult(); } public List<Map<String, Object>> findListBySql(String sql) { return this.findListBySql(sql, new HashMap<String, Object>()); } public List<Map<String, Object>> findListBySql(String sql,Map<String,Object> params) { SQLQuery query = this.getCurrentSession().createSQLQuery(sql); query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); this.setParameterToQuery(query, params); return query.list(); } /** * 根据SQL语句返回一个集合 */ public List<Map<String, Object>> findListBySql(String sql, Object... params) { Query query = getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); this.setParameterToQuery(query, params); return query.list(); } /** *调用存储过程 */ public <T> List<T> execProc(String hql) { Query q = this.getCurrentSession().getNamedQuery(hql); return q.list(); } /** * <b>function:</b> 执行原生态的sql语句,添加、删除、修改语句 * @createDate 2010-8-2 下午05:33:42 * @author hoojo * @param sql * 将要执行的sql语句 * @return int * @throws Exception */ public int executeBySql(String sql) throws Exception { try { return this.getCurrentSession().createSQLQuery(sql).executeUpdate(); } catch (Exception e) { throw new RuntimeException(e); } } public <T> List<T> callProcedure(String procString, List<Object> params) throws Exception { ResultSet rs = null; CallableStatement stmt = null; try { stmt = (CallableStatement)SessionFactoryUtils.getDataSource(this.getSessionFactory()).getConnection() .prepareCall(procString); if (params != null) { int idx = 1; for (Object obj : params) { if (obj != null) { stmt.setObject(idx, obj); } else { stmt.setNull(idx, Types.NULL); } idx++; } } rs = stmt.executeQuery(); List list = new ArrayList(); ResultSetMetaData md = rs.getMetaData(); // 得到结果集(rs)的结构信息,比如字段数、字段名等 int columnCount = md.getColumnCount(); // 返回此 ResultSet 对象中的列数 Map rowData = new HashMap(); while (rs.next()) { rowData = new HashMap(columnCount); for (int i = 1; i <= columnCount; i++) { rowData.put(md.getColumnName(i), rs.getObject(i)); } list.add(rowData); } return list; } catch (SQLException e) { e.printStackTrace(); throw new Exception("调用存储过程的时候发生错误[sql = " + procString + "]", e); } finally { rs.close(); stmt.close(); } } /** * 返回此类的列的属性名称,不包含静态属性和Transient * @param entity * @return */ private List<String> getEntityColumnNameList(Class<?> cls){ List<String> list=new ArrayList<String>(); Class<?> clazz=cls; Field[] fs=clazz.getDeclaredFields(); String filedName=null; for(Field field:fs){ boolean isStatic = Modifier.isStatic(field.getModifiers()); if(isStatic) continue; field.setAccessible(true); filedName=field.getName(); Annotation[] as=field.getAnnotations(); boolean isTransaction=false; for(int i=0;i<as.length;i++){ Annotation a=as[i]; if(a instanceof Transient){ isTransaction=true; break; } } if(!isTransaction){ list.add(filedName); } } return list; } /** * 得到除开指定名称的属性列 */ protected List<String> getEntityColumnNames(Class<?> cls,String... exceptCoulumns){ List<String> nameList=getEntityColumnNameList(cls); if(exceptCoulumns!=null){ for(String s:exceptCoulumns){ nameList.remove(s); } } return nameList; } /** * 得到除开指定名称的属性列 */ protected List<String> getEntityColumnNames(Class<?> cls,List<String> exceptCoulumns){ List<String> nameList=getEntityColumnNameList(cls); if(exceptCoulumns!=null){ for(String s:exceptCoulumns){ nameList.remove(s); } } return nameList; } /** * 获取主键名称 * * @return 没有逐渐则返回null; */ private String getPkName(Class<?> cls) { String pkname=null; // 标注在getter方法上 Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { if (method.getName().startsWith("get")) { if (method.isAnnotationPresent(Id.class)) { String temp = method.getName().replaceAll("^get", ""); // 将第一个字母变成小写 pkname = this.firstLetterToLower(temp); break; } } } if(pkname==null){ Field[] fields=cls.getDeclaredFields(); for(Field field:fields){ if(field.isAnnotationPresent(Id.class)){ return field.getName(); } } } return pkname; } private Object getPkValue(Object t) throws NoSuchFieldException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Field field=t.getClass().getField(this.getPkName(t.getClass())); try { Method method = t.getClass().getMethod("get"+ this.firstLetterToLower(field.getName()));// 此方法不需要参数,如:getName(),getAge() return method.invoke(t); } catch (NoSuchMethodException e) { return field.get(t); } } private String firstLetterToLower(String srcString) { StringBuilder sb = new StringBuilder(); sb.append(Character.toLowerCase(srcString.charAt(0))); sb.append(srcString.substring(1)); return sb.toString(); } }
常用方法:
//插入对象
public <T> Serializable save(T o)
//更新对象
public <T> void update(T o)
//根据ID获取对象
public <T> T get(Class<T> c, Serializable id)
//删除对象
public <T> void delete(T o)
//hql无参数查询,返回list
public <T> List<T> findList(String hql)
//hql有参数查询,返回list
public <T> List<T> findList(String hql, Map<String, Object> params)
//hql分页查询
public <T> List<T> findList(String hql, Map<String, Object> params, int page, int rows)
public <T> List<T> findList(String hql, int page, int rows)
//更新或者删除
public int executeHql(String hql)
public int executeHql(String hql, Map<String, Object> params)
方法/经验:
先更换所有的java包
1、修改dao的时候,使用junit测试
2、dao类注释:@Repository; 方法注释:@Transactional
3、xml文件中3.0修改为4.0
4、hibernate配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${hibernate.dialect}</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><prop key="hibernate.format_sql">${hibernate.format_sql}</prop><!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --><prop key="hiberate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop></props></property><property name="packagesToScan"><list><value>com.webyun.datashare.common.model</value></list></property></bean>
5、hibernate事务管理
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property><property name="dataSource" ref="dataSource" /></bean><tx:annotation-driven transaction-manager="transactionManager"/>
6、junit测试
import java.util.List;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.webyun.datashare.common.model.UserMessage;import com.webyun.datashare.message.dao.UserMessageDao;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration({ "classpath:applicationContext.xml"})public class TestUserMessageDao {@Resourceprivate UserMessageDao dao;@Testpublic void testGetPageList(){List<UserMessage> pageList = dao.getPageList(1, 2, 1, 10);System.out.println(pageList.size());}
常见报错解决:http://www.cnblogs.com/hafiz/p/5812873.html
参考:[1] http://www.cnblogs.com/hafiz/p/5812873.html
参考:[2] http://blog.csdn.net/selaginella/article/details/8799563
- springMVC3+hibernate3升级为springMVC4+hibernate4步骤
- <三>、hibernate3转换为hibernate4
- 关于将Hibernate2升级为Hibernate3的基本步骤说明
- Hibernate3升级Hibernate4.3后报“HHH000223”
- Hibernate2升级为Hibernate3
- springMvc3 + hibernate4 jar包
- springmvc3+hibernate3整合问题
- spring4+springmvc4+hibernate4异常
- springmvc4+spring4+hibernate4搭建
- SpringMVC4+Hibernate4学习笔记
- SpringMVC4+Spring+Hibernate4整合
- SpringMVC4+Hibernate4 问题汇总
- Hibernate3升级到Hibernate4后的修改点
- Hibernate3升级至Hibernate4.3报“数字溢出”
- SpringMVC4+Spring4+Hibernate4框架整合
- SpringMVC4+Spring4+Hibernate4框架整合
- hibernate4 比 hibernate3 优点
- hibernate3与hibernate4区别
- jfianl中的图形验证
- Python 闭包问题
- 快速查找SO所对应的交货单DN及PO
- 阿里云服务器连接不上3306端口,解决
- 抽象类和接口的区别 转
- springMVC3+hibernate3升级为springMVC4+hibernate4步骤
- Java中有意思的n++
- GKCoherentNoiseSource
- HTML 文档元素
- java中基本类型占用字节数
- MySQL中的存储引擎
- Android——各种动画Drawable
- Hibenate 一对一双向关联关系
- Ubuntu无法找到add-apt-repository问题的解决方法(转)