谁能帮我解析一下代码? DAOjava 泛型 方法的,谢谢高手们 。

1340人阅读
在做管理系统时。通常基于Facade模式的系统持久化层要写许多Dao。这些dao里面的方法又是重复的,那么有没有什么好的方法来统一利用一个公共的Dao。&答案是可以的。这里我们接触到JDK5.0里面的一个新特性:泛型。&关于泛型的含义我这里就不再解释了。&下面我们以一个对用户管理和新闻管理的来示范。&首先是2个POJO。我这里只列出User& POJO。&(基于注释的Pojo)
package&com.&&
import&javax.persistence.C&&
import&javax.persistence.E&&
import&javax.persistence.GeneratedV&&
import&javax.persistence.GenerationT&&
import&javax.persistence.Id;&&
import&javax.persistence.T&&
@Table(name&=&"tb_user")&&
public&class&User&{&&
&&&&@GeneratedValue(strategy&=&GenerationType.IDENTITY)&&
&&&&private&int&&&
&&&&@Column(name&=&"username",&length&=&15)&&
&&&&private&String&&&
&&&&@Column(name&=&"password",&length&=&15)&&
&&&&private&String&&&
&&&&public&int&getId()&{&&
&&&&&&&&return&&&
&&&&public&void&setId(int&id)&{&&
&&&&&&&&this.id&=&&&
&&&&public&String&getUsername()&{&&
&&&&&&&&return&&&
&&&&public&void&setUsername(String&username)&{&&
&&&&&&&&this.username&=&&&
&&&&public&String&getPassword()&{&&
&&&&&&&&return&&&
&&&&public&void&setPassword(String&password)&{&&
&&&&&&&&this.password&=&&&
如果按照常规的Facade模式来设计,我们的思路是:&先创建一个UserDao的接口。&
package&com.oa.&&
import&java.util.L&&
import&com.oa.U&&
public&interface&UserDao&{&&
&&&&public&void&save(User&user);&&
&&&&public&void&delete(int&id);&&
&&&&public&void&update(User&user);&&
&&&&public&List&User&&query();&&
&&&&public&User&get(int&id);&&
然后实现这个接口:UserDaoImpl&
package&com.oa.dao.&&
import&java.util.L&&
import&org.springframework.context.annotation.S&&
import&org.springframework.stereotype.R&&
import&com.oa.U&&
import&com.oa.dao.MyHibernateDaoS&&
import&com.oa.dao.UserD&&
@Repository("userDao")&&
public&class&UserDaoImpl&extends&MyHibernateDaoSupport&implements&UserDao&{&&
&&&&public&void&delete(int&id)&{&&
&&&&&&&&super.getHibernateTemplate().delete(&&
&&&&&&&&&&&&&&&&super.getHibernateTemplate().load(User.class,&id));&&
&&&&public&User&get(int&id)&{&&
&&&&&&&&return&(User)&super.getHibernateTemplate().get("from&&User",&id);&&
&&&&@SuppressWarnings("unchecked")&&
&&&&public&List&User&&query()&{&&
&&&&&&&&return&super.getHibernateTemplate().find("from&User");&&
&&&&public&void&save(User&user)&{&&
&&&&&&&&super.getHibernateTemplate().save(user);&&
&&&&public&void&update(User&user)&{&&
&&&&&&&&super.getHibernateTemplate().update(user);&&
持久化层完毕。&接下来的是事务层&先创建一个UserService的接口。&
package&com.oa.&&
import&com.oa.U&&
public&interface&UserService&{&&
&&&&public&void&save(User&user);&&
&&&&public&void&update(User&user);&&
然后实现这个接口:UserServiceImpl。&在UserServiceImpl里引用UserDao来实现业务逻辑。&
package&com.oa.service.&&
import&com.oa.U&&
import&com.oa.service.UserS&&
import&com.oa.dao.UserD&&
import&java.util.L&&
import&org.springframework.beans.factory.annotation.A&&
import&org.springframework.stereotype.S&&
@Service("userService")&&
public&class&UserServiceImpl&implements&UserService&{&&
&&&&@Autowired&&&
&&&&private&UserDao&userD&&
&&&&public&void&save(User&user)&{&&
&&&&&&&&userDao.save(user);&&
&&&&public&void&update(User&user)&{&&
&&&&&&&&userDao.update(user);&&
按照上面的模式:新闻管理也这么写一遍。&重复的工作使得我们觉得好烦。&这个时候是泛型出场的时候了。&基于Facade的设计模式,dao和service还是要的。 这里我们就要设计一个公共的Dao..& 我们称之为:GenericDao&
package&com.oa.&&
import&java.io.S&&
import&java.util.*;&&
public&interface&GenericDao&T,&PK&&{&&
&&&&public&&void&save(T&entity);&&
&&&&public&void&delete(T&entity);&&
&&&&public&void&deleteById(Class&T&&entityClass,PK&id);&&
&&&&public&void&saveorupdate(T&entity);&&
&&&&public&void&update(final&String&hql,final&Object[]&params);&&
&&&&public&List&T&&findByExample(T&entity);&&
&&&&public&List&T&&findAll(Class&T&&entityClass);&&
&&&&public&List&T&&findAll(Class&T&&entityClass,String&hql,Object[]&params,int&start,&int&limit);&&
&&&&public&T&findById(Class&T&&entityClass,&PK&id);&&
&&&&public&List&T&&findByHql(String&hql,Object[]&&params);&&
&&&&public&List&T&&findByProperty(Class&T&&entityClass,&String&propertyName,Object&value);&&
&&&&public&List&T&&findByPage(Class&T&&entityClass,int&start,int&limit)&;&&
&&&&public&T&getTotalCount(Class&T&&entityClass);&&
&&&&public&T&getPageCount(String&hql,Object[]&params);&&
看到,我们不再是具体的User , News&。。而是用 T& 来取代实体。&因为我这个是基于 注解的,所以附上MyHibernateDaoSupport的代码。&
package&com.oa.&&
import&javax.annotation.R&&
import&org.hibernate.SessionF&&
import&org.springframework.orm.hibernate3.support.HibernateDaoS&&
public&class&MyHibernateDaoSupport&extends&HibernateDaoSupport&{&&
&&&&@Resource(name="sessionFactory")&&&&&&
&&&&public&void&setSuperSessionFactory(SessionFactory&sessionFactory){&&
&&&&&&&&super.setSessionFactory(sessionFactory);&&
到现在位置genericdao的接口有了,也就是我们要做什么。。现在就是实现它,就是怎么做。&GenericDaoImpl 代码:&
package&com.oa.dao.&&
import&java.io.S&&
import&java.util.L&&
import&org.hibernate.Q&&
import&org.springframework.stereotype.R&&
import&com.oa.dao.GenericD&&
import&com.oa.dao.MyHibernateDaoS&&
@SuppressWarnings("unchecked")&&
@Repository("genericDao")&&&&&
public&class&GenericDaoImpl&T,&PK&extends&Serializable&&extends&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&MyHibernateDaoSupport&implements&GenericDao&T,&PK&&{&&
&&&&public&void&delete(T&entity)&{&&
&&&&&&&&super.getHibernateTemplate().delete(entity);&&
&&&&public&void&deleteById(Class&entityClass,&PK&id)&{&&
&&&&&&&&super.getHibernateTemplate().delete(findById(entityClass,&id));&&
&&&&public&void&save(T&entity)&{&&
&&&&&&&&super.getHibernateTemplate().save(entity);&&
&&&&public&void&saveorupdate(T&entity)&{&&
&&&&&&&&super.getHibernateTemplate().saveOrUpdate(entity);&&
&&&&public&void&update(String&hql,&Object[]&params)&{&&
&&&&&&&&&&&&&Query&query&=&super.getSession().createQuery(hql);&&
&&&&&&&&&&&&&&&&for(int&i=0;&i&params.&i++){&&
&&&&&&&&&&&&&&&&&&&&query.setParameter(i,&params[i]);&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&query.executeUpdate();&&
&&&&public&List&T&&findAll(Class&entityClass)&{&&
&&&&&&&&&&
&&&&&&&&return&super.getHibernateTemplate().loadAll(entityClass);&&
&&&&public&List&T&&findAll(Class&entityClass,&String&hql,&Object[]&params,int&start,&int&limit)&{&&
&&&&&&&&Query&query&=&super.getSession().createQuery(hql);&&
&&&&&&&&if(params!=null&&params.length&0){&&
&&&&&&&&&&&&for(int&i&=&0;i&params.i++){&&
&&&&&&&&&&&&&&&&query.setParameter(i,&params[i]);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&if(start!=0&&limit!=0){&&
&&&&&&&&&&&&query.setFirstResult(start).setMaxResults(limit);&&
&&&&&&&&}&&
&&&&&&&&return&query.list();&&
&&&&public&List&T&&findByExample(T&entity)&{&&
&&&&&&&&return&super.getHibernateTemplate().findByExample(entity);&&
&&&&public&List&T&&findByHql(String&hql,&Object[]&params)&{&&
&&&&&&&&Query&query&=&super.getSession().createQuery(hql);&&
&&&&&&&&if(null!=&params&&&&params.length&0){&&
&&&&&&&&&&&&for(int&i&=&0;&i&params.i++){&&
&&&&&&&&&&&&&&&&query.setParameter(i,&params[i]);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&return&query.list();&&
&&&&public&T&findById(Class&entityClass,&PK&id)&{&&
&&&&&&&&return&(T)super.getHibernateTemplate().get(entityClass,&id);&&
&&&&public&List&T&&findByProperty(Class&entityClass,&String&propertyName,Object&value)&{&&
&&&&&&&&String&queryString&=&"from&"+entityClass.getName()+&"&as&model&where&model."&+&propertyName&+&"=?";&&&&&
&&&&&&&&return&super.getHibernateTemplate().find(queryString,&value);&&
&&&&public&List&T&&findByPage(Class&T&&entityClass,int&start,int&limit)&{&&
&&&&&&&&&&Query&query=super.getSession().createQuery("select&o&from&"+entityClass.getName()+"&o");&&
&&&&&&&&&&query.setFirstResult(start).setMaxResults(limit);&&
&&&&&&&&return&query.list();&&
&&&&public&T&getTotalCount(Class&entityClass)&{&&
&&&&&&&&&&
&&&&&&&&return&(T)super.getSession().createQuery("select&count(o)&from&"+entityClass.getName()+"&o").uniqueResult();&&
&&&&public&T&getPageCount(String&hql,&Object[]&params)&{&&
&&&&&&&&Query&query&=&super.getSession().createQuery(hql);&&
&&&&&&&&if(null!=&params&&&&params.length&0){&&
&&&&&&&&&&&&for(int&i&=&0;&i&params.i++){&&
&&&&&&&&&&&&&&&&query.setParameter(i,&params[i]);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&return&(T)query.list();&&
至此 泛型就告一个段落。&接下来日子就好过了。&我们不是有user& news&& 等等一系列的curd管理。&以User为例子;&定义一个user的接口,&UserDao.Java&
package&com.oa.&&
import&com.oa.U&&
public&interface&UserDao&extends&GenericDao&User,&Integer&&{&&
public&&&int&&&login(User&user);&&
然后就是实现它&UserDaoImpl&&
package&com.oa.dao.&&
import&com.oa.U&&
import&com.oa.dao.UserD&&
public&class&UserDaoImpl&extends&GenericDaoImpl&User,&Integer&&implements&UserDao&{&&
&&&&public&&int&&login(User&&user){&&
return&&&XX;&&
持久化层就是这么多了。&下面进入业务逻辑层,依然是先定义一个接口。&
package&com.oa.&&
import&com.oa.U&&
public&interface&UserService&{&&
&&&&public&void&save(User&user);&&
&&&&public&void&update(User&user);&&
&&&public&&int&&login(User&&user);&&
接下来是实现&
package&com.oa.service.&&
import&com.oa.U&&
import&com.oa.dao.&UserD&&
import&com.oa.service.TestUserS&&
public&class&UserService&implements&UserService&{&&
&&&&private&&UserDao&&UserD&&
&&&&public&void&save(User&user)&{&&
&&&&&&&&UserDao.save(user);&&
&&&&public&void&updasaveorupdatete(User&user)&{&&
&&&&&&&&UserDao.saveorupdate(user);&&
&&&&public&int&&&login(User&user)&{&&
&&&&&&&&return&&&UserDao.login(user);&&
Ok。。到现在我们就利用泛型dao来设计就完毕了&两者相对比,发现dao层的代码可以复用,少了不少。&对于大型管理系统,效果更明显。&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:402558次
积分:4923
积分:4923
排名:第3821名
原创:89篇
转载:207篇
评论:56条
(1)(2)(5)(2)(3)(1)(1)(1)(2)(1)(1)(2)(1)(1)(2)(5)(4)(16)(5)(8)(9)(2)(7)(16)(5)(22)(12)(40)(7)(8)(9)(3)(1)(6)(10)(2)(2)(1)(2)(3)(2)(2)(3)(1)(2)(6)(8)(4)(3)(7)(6)(3)(1)(3)(12)(2)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&Java如何得到父类的泛型对象_百度知道
Java如何得到父类的泛型对象
extends HibernateDaoSupport implements IBaseDao&&#47;&#47;T&我定义了一个接口public interface IBaseDao&GenericU&#47;}&#47.class);可是我倒不出来 GenericUtils
&#47;接口定义了一个带泛型的方法
public List&T&gt,我看到说有一个方法
&#47;&#47.getSuperClassGenricType(getClass());T& getByAll();{
public List&&#47;我继承spring框架的dao 并引用了上面的接口public class BaseDao&T&&#47,如何得到T对象; getByAll(){
return getHibernateTemplate().loadAll(T类型对象;
&#47;问题就在这;
&#47;&#47&#47
提问者采纳
反射应该行
Class c = Class.forName(&);BaseDao完整路径名&c
其他类似问题
为您推荐:
泛型的相关知识
其他2条回答
绝望吧,运行中泛型T类型是不能获取的
你应该还没理解泛型的作用泛型是在编译的时候验证的,而不是在运行的时候获取的 也就是说当不在编译期的时候泛型是没用的试问你在运行的时候怎么可能得到
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁通用Hibernate DAO实现例子
import&java.io.S
import&java.util.L
import&org.hibernate.C
import&org.hibernate.Q
import&org.hibernate.SQLQ
import&org.hibernate.criterion.C
&*&Hibernate&Generic&DAO&Interface
&*&@param&&T& Entity
&*&@param&&PK&&Primary&Key
public&interface&GenericDaoIf&T,&PK&extends&Serializable&&{
&*&Get&entity&by&primary&key
&*&@param&id&Primary&key
&*&@return&Entity&object
public&T&get(final&PK&id);
&*&Load&entity&by&primary&key
&*&@param&id&Primary&key
&*&@return&Entity&object
public&T&load(final&PK&id);
&*&Remove&entity&from&session,&changes&to&this&entity&will&
&*&not&be&synchronized&with&the&database
&*&@param&entity&The&object&to&be&evicted
public&void&evict(T&entity);
&*&Save&entity
&*&@param&entity&The&object&to&be&saved
&*&@return&The&generated&identifier
public&PK&save(T&entity);
&*&Update&entity
&*&@param&entity&The&object&to&be&updated
public&void&update(T&entity);
&*&Save&or&update&entity
&*&@param&entity&The&object&to&be&save&or&update
public&void&saveOrUpdate(T&entity);
&*&Update&entity's&not-null&property
&*&(this&entity&must&have&a&primary&key&property&"id")
&*&@param&entity&The&object&to&be&updated
public&void&updateSelective(T&entity);
&*&Merge&entity
&*&@param&entity&The&object&to&be&merged&into&database
&*&@return&The&persistent&object
public&T&merge(T&entity);
&*&Delete&entity&(actually,&delete&by&primary&key)
&*&@param&entity&The&object&to&be&deleted
public&void&delete(T&entity);
&*&Delete&entity&by&primary&key,&first&get&then&delete
&*&@param&id&Primary&key
public&void&delete(PK&id);
&*&Find&all&entities
&*&@return&Query&result&list
public&List&T&&findAll();
&*&Find&entities&by&page
&*&@param&page&Paging&object
&*&@return&Paging&query&result,&Comes&with&a&results&list&
public&Page&T&&findAll(Page&T&&page);
&*&Press&the&HQL&Query&object&list
&*&@param&hql&
HQL&statement&
&*&@param&values&
Number&of&variable&parameters&
&*&@return&Query&result&list
public&List&T&&find(String&hql,&Object...&values);
&*&Press&the&SQL&Query&object&list
&*&@param&sql
SQL&statement
&*&@param&values
Number&of&variable&parameters&
&*&@return&Query&result&list
public&List&T&&findBySql(String&sql,&Object...&values);
&*&Press&the&HQL&query&paging&.
&*&@param&page
Paging&parameters&.
&*&@param&hql
HQL&statement&.
&*&@param&values
Number&of&variable&parameters&.
&*&@return&Paging&query&results&,Comes&with&a&results&list&.
public&Page&T&&find(Page&T&&page,&String&hql,&Object...&values);
&*&Press&the&SQL&query&paging&.
&*&@param&page
Paging&parameters&.
&*&@param&sql
SQL&statement&.
&*&@param&values
Number&of&variable&parameters&.
&*&@return&Paging&query&results&,Comes&with&a&results&list&.
public&Page&T&&findBySql(Page&T&&page,&String&sql,&Object...&values);
&*&Press&the&HQL&query&only&object
&*&@param&hql&
HQL&statement
&*&@param&values&
Number&of&variable&parameters
&*&@return&A&single&instance&that&matches&the&query,&or&null&if&the&query&returns&no&results
public&Object&findUnique(String&hql,&Object...&values);
&*&Press&the&SQL&query&only&object
&*&@param&sql
SQL&statement
&*&@param&values
Number&of&variable&parameters
&*&@return&A&single&instance&that&matches&the&query,&or&null&if&the&query&returns&no&results
public&Object&findUniqueBySql(String&sql,&Object...&values);
&*&According&to&the&Criterion&query&object&list&.
&*&@param&criterion
&*&&&&&&&&&&&&Number&of&variable&Criterion&.
&*&@return&Query&result&list
public&List&T&&findByCriteria(Criterion...&criterion);
&*&According&to&the&Criterion&paging&query&.
&*&@param&page
&*&&&&&&&&&&&&Paging&parameters&.Including&the&pageSize,&firstResult,&orderBy,&asc,&autoCount&.
&*&&&&&&&&&&&&Where&firstResult&can&be&directly&specified&,You&can&also&specify&pageNo&.&autoCountSpecifies&whether&dynamic&gets&total&number&of&results&.
&*&@param&criterion
&*&&&&&&&&&&&&Number&of&variable&criterion&.
&*&@return&Paging&query&results&.Comes&with&a&results&list&and&all&query&parameters&.
public&Page&T&&findByCriteria(Page&T&&page,&Criterion...&criterion);
&*&Find&a&list&of&objects&by&property&.
&*&@param&propertyName&Property&name&of&the&entity
&*&@param&value&Property&value
&*&@return&Query&result&list
public&List&T&&findByProperty(String&propertyName,&Object&value);
&*&Find&unique&object&by&property&.
&*&@param&propertyName&Property&name&of&the&entity
&*&@param&value&Property&value
&*&@return&A&single&instance&that&matches&the&query,&or&null&if&the&query&returns&no&
public&T&findUniqueByProperty(String&propertyName,&Object&value);
&*&Determine&the&object's&property&value&is&unique&within&the&database&.
&*&@param&propertyName&Property&name&of&the&entity
&*&@param&newValue&New&property&value
public&boolean&isPropertyUnique(String&propertyName,&Object&newValue);
&*&Depending&on&the&query&function&and&argument&list&to&create&a&Query&object&,Subsequent&to&processing&,The&auxiliary&function&.
&*&@param&queryString&HQL&string
&*&@param&values&Number&of&variable&parameters
&*&@return&Query&object
public&Query&createQuery(String&queryString,&Object...&values);
&*&Depending&on&the&query&function&and&argument&list&to&create&a&SQL&Query&object&,Subsequent&to&processing&,The&auxiliary&function&.
&*&@param&queryString&SQL&string
&*&@param&values&Number&of&variable&parameters
&*&@return&SQL&query&object
public&SQLQuery&createSQLQuery(String&queryString,&Object...&values);
&*&According&to&the&Criterion&conditions&create&Criteria&,Subsequent&to&processing&,The&auxiliary&function&.
&*&@param&criterions&Number&of&variable&criterion
&*&@return&A&criteria
public&Criteria&createCriteria(Criterion...&criterions);
&*&Count&HQL&query&result
&*&@param&hql&HQL&statement
&*&@param&values&Number&of&variable&parameters
&*&@return&Result&count
public&long&countQueryResult(String&hql,&Object...&values);
&*&Count&SQL&query&result
&*&@param&sql&HQL&statement
&*&@param&values&Number&of&variable&parameters
&*&@return&Result&count
public&long&countSQLQueryResult(String&sql,&Object...&values);
&*&Through&this&count&query&to&obtain&the&total&number&of&objects&.
&*&@param&page&Paging&object
&*&@param&c&Query&criteria
&*&@return&The&total&number&of&objects&of&the&query&result.
public&long&countCriteriaResult(Page&T&&page,&Criteria&c);
&*&Save&entities&in&batch
&*&@param&entities&The&objects&to&be&saved
&*&@param&batchSize&The&number&of&every&session&flush
&*&@return&Successful&save&count
public&int&batchSave(List&T&&entities,&int&batchSize);
&*&Update&entities&in&batch
&*&@param&entities&The&objects&to&be&updated
&*&@param&batchSize&The&number&of&every&session&flush
&*&@return&Successful&update&count
public&int&batchUpdate(List&T&&entities,&int&batchSize);
&*&Save&or&update&entities&in&batch
&*&@param&entities&The&objects&to&be&saved&or&updated
&*&@param&batchSize&The&number&of&every&session&flush
&*&@return&Successful&save&count&or&update&count
public&int&batchSaveOrUpdate(List&T&&entities,&int&batchSize);
&*&Update&entities&(not-null&property)&in&batch
&*&@param&entities&The&objects&to&be&updated
&*&@param&batchSize&The&number&of&every&session&flush
&*&@return&Successful&update&count
public&int&batchUpdateSelective(List&T&&entities,&int&batchSize);
&*&Merge&entities&in&batch
&*&@param&entities&The&objects&to&be&merged
&*&@param&batchSize&The&number&of&every&session&flush
&*&@return&Successful&merge&count
public&int&batchMerge(List&T&&entities,&int&batchSize);
&*&Delete&entities&in&batch
&*&@param&entities&The&objects&to&be&deleted
&*&@param&batchSize&The&number&of&every&session&flush
&*&@return&successful&delete&count
public&int&batchDelete(List&T&&entities,&int&batchSize);
import&java.io.S
import&java.lang.reflect.F
import&java.lang.reflect.ParameterizedT
import&java.util.ArrayL
import&java.util.L
import&mons.lang.StringU
import&org.hibernate.C
import&org.hibernate.HibernateE
import&org.hibernate.Q
import&org.hibernate.SQLQ
import&org.hibernate.S
import&org.hibernate.SessionF
import&org.hibernate.criterion.CriteriaS
import&org.hibernate.criterion.C
import&org.hibernate.criterion.O
import&org.hibernate.criterion.P
import&org.hibernate.criterion.P
import&org.hibernate.criterion.R
import&org.hibernate.impl.CriteriaI
import&org.hibernate.impl.CriteriaImpl.OrderE
import&org.hibernate.transform.ResultT
import&org.slf4j.L
import&org.slf4j.LoggerF
import&org.springframework.util.A
import&org.springframework.util.ReflectionU
import&com.alan.mvnapp.mvn_app.dao.GenericDaoIf;
import&com.alan.mvnapp.mvn_app.dao.P
&*&Hibernate&Generic&DAO&Implementation
&*&@param&&T&&Entity
&*&@param&&PK&&Primary&Key
public&class&GenericDaoImpl&T,&PK&extends&Serializable&&implements&GenericDaoIf&T,&PK&&{
protected&Logger&logger&=&LoggerFactory.getLogger(getClass());&
protected&SessionFactory&sessionF
protected&Class&?&&entityC
public&GenericDaoImpl()&{
this.entityClass&=&(Class&?&)&((ParameterizedType)&getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
public&GenericDaoImpl(SessionFactory&sessionFactory,&Class&T&&entityClass)&{
this.sessionFactory&=&sessionF
this.entityClass&=&entityC
@SuppressWarnings("unchecked")
public&T&get(final&PK&id)&{
return&(T)&sessionFactory.getCurrentSession().get(entityClass,&id);
@SuppressWarnings("unchecked")
public&T&load(final&PK&id)&{
return&(T)&sessionFactory.getCurrentSession().load(entityClass,&id);
public&void&evict(T&entity)&{
sessionFactory.getCurrentSession().evict(entity);
@SuppressWarnings("unchecked")
public&PK&save(T&entity)&{
Assert.notNull(entity);
PK&pk&=&(PK)&sessionFactory.getCurrentSession().save(entity);
("save&entity:&{}",&entity);
public&void&update(T&entity)&{
Assert.notNull(entity);
sessionFactory.getCurrentSession().update(entity);
("update&entity:&{}",&entity);
public&void&saveOrUpdate(T&entity)&{
Assert.notNull(entity);
sessionFactory.getCurrentSession().saveOrUpdate(entity);
("save&or&update&entity:&{}",&entity);
public&void&updateSelective(T&entity)&{
Assert.notNull(entity);
Field[]&fields&=&entity.getClass().getDeclaredFields();
List&String&&params&=&new&ArrayList&String&();
List&Object&&values&=&new&ArrayList&Object&();
for(Field&field&:&fields)&{
String&fieldName&=&field.getName();
field.setAccessible(true);
Object&value&=&ReflectionUtils.getField(field,&entity);
if(value&!=&null)&{
params.add(fieldName);
values.add(value);
if(!params.isEmpty())&{
StringBuffer&sb&=&new&StringBuffer("update&"&
+&entityClass.getSimpleName()&+&"&set&");
for(int&i&=&0;&i&&&params.size();&i++)&{
sb.append(params.get(i)&+&"&=&?&");
if(i&&&params.size()&-&1)&{
sb.append(",&");
Field&pkField&=&ReflectionUtils.findField(entityClass,&"id");
Assert.notNull(pkField);
pkField.setAccessible(true);
sb.append("&where&id&=&?&");
values.add(ReflectionUtils.getField(pkField,&entity));
createQuery(sb.toString(),&values.toArray()).executeUpdate();
("update&entity&selecitive:&{}"&+&entity);
@SuppressWarnings("unchecked")
public&T&merge(T&entity)&{
Assert.notNull(entity);
T&t&=&(T)&sessionFactory.getCurrentSession().merge(entity);
("merge&entity:&{}",&entity);
public&void&delete(T&entity)&{
Assert.notNull(entity);
sessionFactory.getCurrentSession().delete(entity);
("delete&entity:&{}",&entity);
public&void&delete(PK&id)&{
Assert.notNull(id);
delete(get(id));
public&List&T&&findAll()&{
return&findByCriteria();
public&Page&T&&findAll(Page&T&&page)&{
return&findByCriteria(page);
@SuppressWarnings("unchecked")
public&List&T&&find(String&hql,&Object...&values)&{
return&(List&T&)createQuery(hql,&values).list();
@SuppressWarnings("unchecked")
public&List&T&&findBySql(String&sql,&Object...&values)&{
return&(List&T&)createSQLQuery(sql,&values).addEntity(entityClass).list();
@SuppressWarnings("unchecked")
public&Page&T&&find(Page&T&&page,&String&hql,&Object...&values)&{
Assert.notNull(page);
if(page.isAutoCount())&{
page.setTotalCount(countQueryResult(hql,&values));
Query&q&=&createQuery(hql,&values);
if(page.isFirstSetted())&{
q.setFirstResult(page.getFirst());
if(page.isPageSizeSetted())&{
q.setMaxResults(page.getPageSize());
page.setResult((List&T&)q.list());
@SuppressWarnings("unchecked")
public&Page&T&&findBySql(Page&T&&page,&String&sql,&Object...&values)&{
Assert.notNull(page);
if(page.isAutoCount())&{
page.setTotalCount(countSQLQueryResult(sql,&values));
SQLQuery&q&=&createSQLQuery(sql,&values);
if(page.isFirstSetted())&{
q.setFirstResult(page.getFirst());
if(page.isPageSizeSetted())&{
q.setMaxResults(page.getPageSize());
page.setResult((List&T&)q.addEntity(entityClass).list());
public&Object&findUnique(String&hql,&Object...&values)&{
return&createQuery(hql,&values).uniqueResult();
public&Object&findUniqueBySql(String&sql,&Object...&values)&{
return&createSQLQuery(sql,&values).addEntity(entityClass).uniqueResult();
@SuppressWarnings("unchecked")
public&List&T&&findByCriteria(Criterion...&criterion)&{
return&(List&T&)createCriteria(criterion).list();
@SuppressWarnings("unchecked")
public&Page&T&&findByCriteria(Page&T&&page,&Criterion...&criterion)&{
Assert.notNull(page);
Criteria&c&=&createCriteria(criterion);
if(page.isAutoCount())&{
page.setTotalCount(countCriteriaResult(page,&c));
if(page.isFirstSetted())&{
c.setFirstResult(page.getFirst());
if(page.isPageSizeSetted())&{
c.setMaxResults(page.getPageSize());
if(page.isOrderBySetted())&{
if(page.getOrder().toUpperCase().equals("AES"))&{
c.addOrder(Order.asc(page.getOrderBy()));
c.addOrder(Order.desc(page.getOrderBy()));
page.setResult((List&T&)c.list());
@SuppressWarnings("unchecked")
public&List&T&&findByProperty(String&propertyName,&Object&value)&{
Assert.hasText(propertyName);
return&(List&T&)&createCriteria(Restrictions.eq(propertyName,&value)).list();
@SuppressWarnings("unchecked")
public&T&findUniqueByProperty(String&propertyName,&Object&value)&{
Assert.hasText(propertyName);
return&(T)createCriteria(Restrictions.eq(propertyName,&value)).uniqueResult();
public&boolean&isPropertyUnique(String&propertyName,&Object&newValue)&{
if(newValue&==&null)&return&
Object&obj&=&findUniqueByProperty(propertyName,&newValue);
return&obj&==&
}&catch&(HibernateException&e)&{
public&Query&createQuery(String&queryString,&Object...&values)&{
Assert.hasText(queryString);
Query&queryObject&=&sessionFactory.getCurrentSession().createQuery(queryString);
if(values&!=&null)&{
for(int&i&=&0;&i&&&values.&i++)&{
queryObject.setParameter(i,&values[i]);
return&queryO
public&SQLQuery&createSQLQuery(String&queryString,&Object...&values)&{
Assert.hasText(queryString);
SQLQuery&queryObject&=&sessionFactory.getCurrentSession().createSQLQuery(queryString);
if(values&!=&null)&{
for(int&i&=&0;&i&&&values.&i++)&{
queryObject.setParameter(i,&values[i]);
return&queryO
public&Criteria&createCriteria(Criterion...&criterions)&{
Criteria&criteria&=&sessionFactory.getCurrentSession().createCriteria(entityClass);
for(Criterion&c&:&criterions)&{
criteria.add(c);
public&long&countQueryResult(String&hql,&Object...&values)&{
hql&=&hql.replaceAll("&[Ff][Rr][Oo][Mm]&",&"&from&");
String&str&=&hql.toLowerCase();
if(!StringUtils.contains(str,&"group&by")
&&&!StringUtils.contains(str,&"union")
&&&!StringUtils.contains(str,&"minus")
&&&!StringUtils.contains(str,&"intersect")
&&&!StringUtils.contains(StringUtils.substringAfter(str,&"from"),&"(")
str&=&"select&count(*)&from&"&+&StringUtils.substringAfter(hql,&"from");
return&((Number)createQuery(hql,&values).iterate().next()).longValue();
throw&new&HibernateException("not&support&this&HQL&:&"&+&hql);
public&long&countSQLQueryResult(String&sql,&Object...&values)&{
String&str&=&sql.toLowerCase();
String&beforeFrom&=&StringUtils.substringBefore(str,&"from");
if(StringUtils.countMatches(beforeFrom,&"(")&
!=&StringUtils.countMatches(beforeFrom,&")")
||&StringUtils.contains(str,&"group&by")
||&StringUtils.contains(str,&"union")
||&StringUtils.contains(str,&"minus")
||&StringUtils.contains(str,&"intersect"))&{
str&=&"select&count(*)&from&("&+&sql&+&")&as&tmp";
str&=&"select&count(*)&from&"&+&
StringUtils.substringAfter(str,&"from");
Object&ret&=&createSQLQuery(str,&values).uniqueResult();
return&(ret&==&null&?&0&:&((Number)ret).longValue());
@SuppressWarnings("unchecked")
public&long&countCriteriaResult(Page&T&&page,&Criteria&c)&{
CriteriaImpl&cimpl&=&(CriteriaImpl)c;
//&First&Projection,&ResultTransformer,&OrderBy&out&,Empty&after&a&three&Count&operations&
Projection&projection&=&cimpl.getProjection();
ResultTransformer&transformer&=&cimpl.getResultTransformer();
List&CriteriaImpl.OrderEntry&&orderEntries&=&
Field&orderEntriesField&=&cimpl.getClass().getDeclaredField("orderEntries");
orderEntriesField.setAccessible(true);
orderEntries&=&(List&OrderEntry&)&ReflectionUtils.getField(
orderEntriesField,&cimpl);
ReflectionUtils.setField(
orderEntriesField,&cimpl,&
new&ArrayList&OrderEntry&());
}&catch&(Exception&e)&{
logger.error("Not&may&throw&an&exception&:{}",&e.getMessage());
//&Do&Count&query&
long&totalCount&=&(Long)&c.setProjection(Projections.rowCount())
.uniqueResult();
if&(totalCount&&&1)
return&-1;
//&Will&the&Projection&and&OrderBy&before&conditions&back&to&go&back&
c.setProjection(projection);
if&(projection&==&null)&{
c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
if&(transformer&!=&null)&{
c.setResultTransformer(transformer);
Field&orderEntriesField&=&cimpl.getClass().getDeclaredField("orderEntries");
orderEntriesField.setAccessible(true);
ReflectionUtils.setField(orderEntriesField,&cimpl,&orderEntries);
}&catch&(Exception&e)&{
logger.error("Not&may&throw&an&exception&:{}",&e.getMessage());
return&totalC
private&int&tuneBatchSize(int&batchSize)&{
if(batchSize&&&20)&{
batchSize&=&20;
}&else&if(batchSize&&&200)&{
batchSize&=&200;
return&batchS
public&int&batchSave(List&T&&entities,&int&batchSize)&{
Assert.notEmpty(entities);
batchSize&=&tuneBatchSize(batchSize);
int&count&=&0;
Session&session&=&sessionFactory.getCurrentSession();
for(int&i&=&0;&i&&&entities.size();&i++)&{
session.save(entities.get(i));
if(i&%&batchSize&==&0&||&i&==&entities.size()&-&1)&{
session.flush();
session.clear();
public&int&batchUpdate(List&T&&entities,&int&batchSize)&{
Assert.notEmpty(entities);
batchSize&=&tuneBatchSize(batchSize);
int&count&=&0;
Session&session&=&sessionFactory.getCurrentSession();
for(int&i&=&0;&i&&&entities.size();&i++)&{
session.update(entities.get(i));
if(i&%&batchSize&==&0&||&i&==&entities.size()&-&1)&{
session.flush();
session.clear();
public&int&batchSaveOrUpdate(List&T&&entities,&int&batchSize)&{
Assert.notEmpty(entities);
batchSize&=&tuneBatchSize(batchSize);
int&count&=&0;
Session&session&=&sessionFactory.getCurrentSession();
for(int&i&=&0;&i&&&entities.size();&i++)&{
session.saveOrUpdate(entities.get(i));
if(i&%&batchSize&==&0&||&i&==&entities.size()&-&1)&{
session.flush();
session.clear();
public&int&batchUpdateSelective(List&T&&entities,&int&batchSize)&{
Assert.notEmpty(entities);
batchSize&=&tuneBatchSize(batchSize);
int&count&=&0;
Session&session&=&sessionFactory.getCurrentSession();
for(int&i&=&0;&i&&&entities.size();&i++)&{
updateSelective(entities.get(i));
if(i&%&batchSize&==&0&||&i&==&entities.size()&-&1)&{
session.flush();
session.clear();
public&int&batchMerge(List&T&&entities,&int&batchSize)&{
Assert.notEmpty(entities);
batchSize&=&tuneBatchSize(batchSize);
int&count&=&0;
Session&session&=&sessionFactory.getCurrentSession();
for(int&i&=&0;&i&&&entities.size();&i++)&{
session.merge(entities.get(i));
if(i&%&batchSize&==&0&||&i&==&entities.size()&-&1)&{
session.flush();
session.clear();
public&int&batchDelete(List&T&&entities,&int&batchSize)&{
Assert.notEmpty(entities);
batchSize&=&tuneBatchSize(batchSize);
int&count&=&0;
Session&session&=&sessionFactory.getCurrentSession();
for(int&i&=&0;&i&&&entities.size();&i++)&{
session.delete(entities.get(i));
if(i&%&batchSize&==&0&||&i&==&entities.size()&-&1)&{
session.flush();
session.clear();
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区}

我要回帖

更多关于 java 泛型 方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信