operamasks+hibernate(泛型)+spring 整合框架 - 个人工程备份.不喜勿下
部署到 operamasks 下 . 编译前需要清理下工程
修改数据库连接. 建一个表. 放几条数据, 修改下sql
就可以测试了.
框架说明:
GenericDao (泛型接口)
package org.framework.dao; /** * 该类为hibernaeDao的基础类,所以其它模块的类的dao都集成该接口 * @author cheafen * @version 1.0 05/30/2007 * @since 1.0 */ import java.io.Serializable; import java.util.List; import java.util.Map; public interface GenericDao<T,ID extends Serializable> { /** * <strong>根据对象id获得一个对象</strong> * @param id 对象主键id * @return 返回一个对象类型 */ T loadObjectById(ID id); /** * <strong>保存一条记录</strong> * @param entity 一个对象实体 * @return 返回保存的对象实体 */ T save(T entity); /** * <strong>保存一条新的记录或者跟新一条新的记录</strong> * @param entity 一个对象实体 * @return 返回保存/更新的对象实体 */ T saveOrUpdate(T entity); /** * <strong>更新一条记录</strong> * @param entity 一个对象实体 * @return 返回更新的对象实体 */ T update(T entity); /** * <strong>执行del 或者 update语句 </strong> * <li> delete from com.jpc.model.JpcUser us where us.id>0 * <li> update com.jpc.model.JpcUser us set us.ucode = 'admin' where id in (0,1,2,3,4) * @param ts 多个对象实体 * @param isHql 是否是 Hibernate语言 */ void executeDelOrUpdateHql(String hql); /** * <strong>删除一个对象实体</strong> * @param entity 对象实体 */ void delete(T entity); /** * <strong>查询出所有的对象集合</strong> * @return 返回一个对象实体的集合 */ List<T> findAll(); /** * <strong>根据条件列出对象实体集合</strong> * @param cmd可以是HQL/SQL语句 也可以是XML中配置的HQL语句的查询相关关键字 * <li> 例如: from com.jpc.model.JpcUser as p where p.ucode = ? * <li> 例如: findUserBycode 这里HQL语句在XML中声明 * <li> 例如: select JPC_JPCUSER as p where p.ucode = ? //前提该表必须有相应的po * @param page 显示的第几个页面 * @param count 一共返回的条数 * @param params 参数数组 * @return 返回集合为count条记录的集合 */ List<T> findListByCmd(String cmd ,int page,int count,Object... params); /** * <strong>根据动态querySql来列出对象实体集合-适合对象为动态结构的数据表</strong> * <li> 例如: select did,ucode,uname,email或者* from D_FILE1 as u where u.uname = '李春雨' //表名为数据库中的名称 返回单个对象为Map的list * <li> 注意: map 获取值必须大写 即: map.get("TITLE") * @param querySql 查询语句 * @param page 显示的第几页面 * @param count 集合的条数 每页显示的条目数 * @return 返回集合为count条记录的集合 * 注意: 查询字段中不能存在大字段类型 */ List<Map> findMapListByDynSql(String querySql,int page,int count); /** * <strong>返回实体类对象/或者单个对象例如Max/min等</strong> * 根据cmd对应语句查询可以执行如下操作:count、max、min、sum、avg * <li> from net.vscholl.user.User as user where user.userCode = '刘玉华' and ... * <li> from com.jpc.model.JpcUser as p where p.ucode = ? * <li> select max(did) from d_file1 where title like '%我们%' * <li>count: select count(*) from net.vschool.user.User as user * <li>max: select max(user.id) from net.vschool.user.User as user * <li>min: select min(user.id) from net.vschool.user.User as user * <li>sum: select sum(user.id) from net.vschool.user.User as user * <li>avg: select avg(user.id) from net.vschool.user.User as user * <li> 返回一条记录<font color=red>obj对象</font>的时候 object 可以强制转换成Object[] 数组,保存该记录内多个key-value * <li> 例如: select * from JPC_USER as u where u.did = 2 可强制转换成Object[] * <li> 根据cmd对应语句查询可以执行如下操作:count、max、min、sum、avg 这个时候则是Object对象 * <li> 例如: select MAX(did) from JPC_USER as u where u.did = 2 返回为Object 不可转换为数组 * @param querySql 可以是xml中定义的query Name 也可以是Hql语句 也可以是 SQL语句 * @param params ? 的数组对象 用来简化sql * @return 单挑记录或者cout . max obj等等 * 注意: 如果返回结果不是实体对象的情况下,返回为数组 则返回结果中(即查询字段中)不能存在大字段类型 */ Object queryForCmd(String querySql , Object... params); /** * 获取单条记录对象(Map) * @param querySql sql/hql/qname * @param params 参数 * @return 单条记录的Map对象 * 注意: 查询字段中不能存在大字段类型 */ Object queryForSingleResultMap(String querySql , Object... params); }
HibernateBaseDaoImpl (泛型实现类)
package org.framework.dao.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.List; import org.framework.dao.GenericDao; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * @author lovejj * */ public class HibernateBaseDaoImpl<T, ID extends Serializable> extends HibernateDaoSupport implements GenericDao<T, ID> { private Class<T> persistentClass = null; protected Query getQuery(Session session,String cmd) { Query query; try { query = session.getNamedQuery(cmd);//创建xml中声明的query名称 } catch (HibernateException e) { try{ query = session.createQuery(cmd);//否则创建Hibernate的SQL }catch (HibernateException ex) { query = session.createSQLQuery(cmd);//否则创建数据库SQL } } return query; } /* * Cmd parameter is the named query's name. Please refer to Hibernate Named * Query. * * @see com.zybedu.dao.FindCmdDao#findCmd(java.lang.String, * java.lang.Object[], int, int) */ @SuppressWarnings("unchecked") public List findListByCmd(final String cmd , final int page, final int count, final Object... params) { List result = null; Object o = this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = getQuery(session, cmd); if (params != null) { int len = params.length; for (int i = 0; i < len; i++) { query.setParameter(i, params[i]); } } if (page > 0) { int maxResult = count; if (count < 1) maxResult = 1; int first = (page - 1) * maxResult; query.setFirstResult(first); query.setMaxResults(maxResult); } else { } List list = query.list(); org.hibernate.Hibernate.initialize(list); return list; } }); if (o != null) result = (List) o; return result; } public void delete(T entity) { this.getHibernateTemplate().delete(entity); this.getSession().flush(); } @SuppressWarnings("unchecked") public List<T> findAll() { List list = this.getHibernateTemplate().loadAll( this.getPersistentClass()); org.hibernate.Hibernate.initialize(list); return list; } @SuppressWarnings("unchecked") public T loadObjectById(ID id) { return (T) this.getHibernateTemplate().get(this.getPersistentClass(), id); } public T saveOrUpdate(T entity) { this.getHibernateTemplate().saveOrUpdate(entity); return entity; } public T save(T entity) { this.getHibernateTemplate().save(entity); return entity; } public T update(T entity) { this.getHibernateTemplate().update(entity); return entity; } public void executeDelOrUpdateHql(final String hql) { Object o = this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = getQuery(session, hql); query.executeUpdate(); return null; } }); } protected Class<T> getPersistentClass() { if (this.persistentClass == null) { this.persistentClass = (Class<T>) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } return this.persistentClass; } public List findMapListByDynSql(String querySql ,final int page, final int count) { List result = null; final String fullHql = querySql; // LazyParser parser=parsers.get(cmd); if (fullHql != null) { Object o = this.getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = getQuery(session, fullHql);//创建sql对象 if (page > 0) { int maxResult = count; if (count < 1) maxResult = 1; int first = (page - 1) * maxResult; query.setFirstResult(first); query.setMaxResults(maxResult); } return query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list(); } }); if (o != null) result = (List) o; } return result; } public Object queryForCmd(String querySql , final Object... params) { Object result = null; final String fullHql = querySql; // LazyParser parser=parsers.get(cmd); if (fullHql != null) { Object o = this.getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = getQuery(session, fullHql); if (params != null) { int len = params.length; for (int i = 0; i < len; i++) { query.setParameter(i, params[i]); } } return query.uniqueResult(); } }); if (o != null) result = o; } return result; } public Object queryForSingleResultMap(String querySql, final Object... params ) { Object result = null; final String fullHql = querySql; // LazyParser parser=parsers.get(cmd); if (fullHql != null) { Object o = this.getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query query = getQuery(session, fullHql); if (params != null) { int len = params.length; for (int i = 0; i < len; i++) { query.setParameter(i, params[i]); } } return query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).uniqueResult(); } }); if (o != null) result = o; } return result; } }
满足了有实体对象的所有增删查改操作. 满足了没有实体对象的增删查改操作
调用:
1. 可以自定义Dao
public interface UserDao extends GenericDao<User, Serializable> { }
并且注入到Service中使用
2. 可以直接调用
@ManagedProperty("#{genericDao}") private GenericDao<SUser, Integer> genericDao;
前提: 将泛型接口声明在spring-beans中
<bean id="genericDao" class="org.framework.dao.impl.HibernateBaseDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
解析:
1. 例如: objectDao.queryForCmd("select usercode,passwd,did,pid from s_user t where t.did = 1") 返回的是长度为4的一个数组
2. 例如: SUser user = (SUser) genericDao.queryForCmd("from com.jj.demo.hbm.SUser as u where u.did = 1"); 返回的是SUser对象
3. 例如: objectDao.queryForSingleResultMap("select * from F_D_FILE1 where did = ?",3); 返回单条记录为一个map
4. 例如: objectDao.queryForCmd("from com.jj.demo.hbm.FDFile as fd where fd.fieldname = ?","CREATOR"); 返回为一个FDFile对象
5. 例如: objectDao.findMapListByDynSql("select * from d_file1", -1, -1); 返回为每条记录为一个map的多条记录list
6. 例如: objectDao.queryForCmd("select count(*) from s_all"); 返回为一个结果obj . 可转换为整型
List<Map> ls = objectDao.findMapListByDynSql("select * from D_FILE1", 1, 30); for (Map map : ls) { System.out.println(map.get("TITLE")); }
打印如下
办公楼室内装修工程厨具供货合同(高伟力) 办公楼室内装修工程施工(大堂)的补充协议(高伟力) 办公楼室内装修工程玻纤板供货合同(高伟力) 工程项目咨询合同(高伟力) 办公楼室内装修工程玻璃墙面补充合同(高伟力) ......