数据库访问GenericDAO

直接上代码:

package net.pm.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import net.pm.common.toolkit.Pager;

/**公共的数据访问接口
 *
 * @param <T>
 * @param <ID>
 */
public interface GenericDao<T extends Serializable,ID extends Serializable> {
	
	/**创建一个实体
	 * @param t
	 * @return 
	 */
	ID create(final T t);
	
	/**批量创建
	 * @param ts
	 */
	void batchCreate(final Collection<T> ts);
	
	/**删除一个实体
	 * @param t
	 */
	void remove(final T t);
	
	/**根据id删除一个实体
	 * @param id
	 */
	void removeById(final ID id);
	
	/**根据jpql删除一个实体
	 * @param jpql
	 * @param args
	 */
	Integer removeByJpql(final StringBuilder jpql,final Object... args);
	
	/**批量删除
	 * @param ids
	 */
	void batchRemove(final Collection<ID> ids);
	
	/**更新一个实体
	 * @param t
	 */
	void modify(final T t);
	
	/**根据jpql更新一个实体
	 * @param jpql
	 * @param args
	 */
	Integer modifyByJpql(final StringBuilder jpql,final Object... args);
	
	/**批量更新
	 * @param ts
	 */
	void batchModify(Collection<T> ts);
	
	/**创建或者更新
	 * @param t
	 */
	void createOrModify(final T t);
	
	/**根据id加载实体
	 * @param id
	 * @return 
	 */
	T loadEntityById(final ID id);
	
	/**根据ID查找实体
	 * @param id
	 * @return 
	 */
	T findEntityById(final ID id);
	
	/**根据jpql查找实体集合
	 * @param jpql
	 * @param args
	 * @return 
	 */
	List<T> findEntitiesByJpql(final StringBuilder jpql,final Object... args);
	
	/**根据jpql查找唯一的一条记录
	 * @param jpql
	 * @param args
	 * @return 
	 */
	T findUniqueEntityByJpql(final StringBuilder jpql,final Object... args);
	
	/**分页
	 * @param pagesize 页宽
	 * @param pageno  页码
	 * @param jpql   
	 * @param args
	 * @return 
	 */
	Pager<T> findPagerByJpql(final Integer pagesize,final Integer pageno,final StringBuilder jpql,final Object... args);
	
	/**查找所有
	 * @return 
	 */
	List<T> findAll();
	
	/**获取总记录数
	 * @return 
	 */
	Long findCountAll();
	
	/**根据jpql查找记录数
	 * @param jpql
	 * @param args
	 * @return 
	 */
	Long findCountByJpql(final StringBuilder jpql,final Object... args);
	
	/**调用存储过程
	 * @param procName 存储过程名称
	 * @return 
	 */
	List<?> CallProcedure(String procName);
	
	/**强制提交
	 */
	void commit();
	
}
package net.pm.common.dao.impl;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;
import javax.persistence.Id;

import net.pm.common.dao.GenericDao;
import net.pm.common.toolkit.GenericsUtils;
import net.pm.common.toolkit.Pager;
import net.pm.common.toolkit.StringUtils;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

/**公共的数据访问接口实现
 *
 * @param <T>
 * @param <ID>
 */
@SuppressWarnings({"unchecked"})
public abstract class GenericDaoImpl<T extends Serializable ,ID extends Serializable> implements GenericDao<T, ID> {

	@Resource(name="sessionFactory")
	private SessionFactory sessionFactory;
	
	public Session getSession(){
		return sessionFactory.getCurrentSession();
	}
	private final Class<T> entityClass;				//T类的class
	private String idName = null;					//T类的idName
    private final String LIST_ALL_JPQL;				//查询所有
    private final String COUNT_ALL_JPQL;			//查询总记录数

    public GenericDaoImpl() {
		super();
		  this.entityClass = (Class<T>) GenericsUtils.getSuperClassGenricType(this.getClass());
	        /*标在field上可用
	        Field[] fields = this.entityClass.getDeclaredFields();
	        for(Field field : fields) {
	            if(field.isAnnotationPresent(Id.class)) {
	                this.idName = field.getName();
	            }
	        }*/
		    //标注在getter方法上
	        Method[] methods = this.entityClass.getDeclaredMethods();
	        for(Method method : methods){
	        	if(method.getName().startsWith("get")){
	        		if(method.isAnnotationPresent(Id.class)){
	        			String temp = method.getName().replaceAll("^get", "");
	        				//将第一个字母变成小写
		        		this.idName = StringUtils.firstLetterToLower(temp);
		        		break;
		        	}
	        	}
	        }
	        
	        String entityClassName = this.entityClass.getSimpleName();
	        //TODO @Entity name not null
	        LIST_ALL_JPQL = "from " + entityClassName + " e order by e." + idName + " asc";
	        COUNT_ALL_JPQL = " select count(e."+idName+") from " + entityClassName+" e";
		
	}


	@Override
	public ID create(final T t) {
		return (ID) this.getSession().save(t);
	}

	@Override
	public void batchCreate(final Collection<T> ts) {
		final Session session = this.getSession();
		int i = 1;
		for(T t : ts){
			i++;
			session.save(t);
			if(i%20 == 0)
				session.flush();
		}
	}

	@Override
	public void remove(final T t) {
		this.getSession().delete(t);
	}

	@Override
	public void removeById(final ID id) {
		this.getSession().delete(this.findEntityById(id));
	}

	@Override
	public Integer removeByJpql(final StringBuilder jpql,final Object... args) {
		Query query = this.getSession().createQuery(jpql.toString());
		this.setParameters(query, args);
		return query.executeUpdate();
	}

	@Override
	public void batchRemove(final Collection<ID> ids) {
		final Session session = this.getSession();
		int i = 1;
		for(ID id : ids){
			i++;
			session.delete(this.findEntityById(id));
			if(i%20 == 0)
				session.flush();
		}
	}

	@Override
	public void modify(final T t) {
		this.getSession().merge(t);
	}

	@Override
	public Integer modifyByJpql(final StringBuilder jpql,final Object... args) {
		Query query = this.getSession().createQuery(jpql.toString());
		this.setParameters(query, args);
		return query.executeUpdate();
	}

	@Override
	public void batchModify(final Collection<T> ts) {
		final Session session = this.getSession();
		int i = 1;
		for(T t : ts){
			i++;
			session.merge(t);
			if(i%20 == 0)
				session.flush();
		}
	}

	@Override
	public void createOrModify(final T t) {
		this.getSession().saveOrUpdate(t);
	}
	
	@Override
	public T loadEntityById(ID id) {
		return (T) this.getSession().load(entityClass, id);
	}

	@Override
	public T findEntityById(final ID id) {
		return (T) this.getSession().get(entityClass,id);
	}

	@Override
	public List<T> findEntitiesByJpql(final StringBuilder jpql,final Object... args) {
		Query query = this.getSession().createQuery(jpql.toString());
		this.setParameters(query, args);
		return query.list();
	}
	
	@Override
	public T findUniqueEntityByJpql(final StringBuilder jpql,final Object... args){
		Query query = this.getSession().createQuery(jpql.toString());
		this.setParameters(query, args);
		return (T) query.setMaxResults(1).uniqueResult();
	}

	@Override
	public Pager<T> findPagerByJpql(final Integer pagesize,final Integer pageno,
			final StringBuilder jpql,final Object... args) {
		Query query  = this.getSession().createQuery(jpql.toString());
		this.setParameters(query, args);
		
		List<T> result = query.list();
		//计算总记录数
		Long totalsize = (long) result.size();
		
		query.setFirstResult(pagesize*(pageno-1));
		query.setMaxResults(pagesize);
		
		result = query.list();
		//计算总页数
		Integer pagecount = (totalsize.intValue()+pagesize-1)/pagesize;
		
		return new Pager<T>(pageno, pagesize, pagecount, totalsize, result);
	}

	@Override
	public List<T> findAll() {
		return this.getSession().createQuery(LIST_ALL_JPQL).list();
	}
	
	@Override
	public Long findCountAll() {
		return (Long) this.getSession().createQuery(COUNT_ALL_JPQL)
				.uniqueResult();
	}
	
	@Override
	public Long findCountByJpql(final StringBuilder jpql,final Object... args){
		Query query = this.getSession().createQuery(jpql.toString());
		this.setParameters(query, args);
		return (Long) query.uniqueResult();
	}
	
	@Override
	public List<?> CallProcedure(String procName) {
		final Session session = this.getSession();
		String proc = "{call " + procName + "}";
		SQLQuery query = session.createSQLQuery(proc);

		List<?> list = query.list();
		return list;
	}
	
	@Override
	public void commit() {
		this.getSession().flush();
		this.getSession().clear();
	}

	/**设置参数
	 * @param query
	 * @param params
	 */
	private void setParameters(Query query,Object[] params){
		int len = params.length;
		for(int i = 0;i<len;i++){
			query.setParameter(i, params[i]);
		}
	}
	
}

 

转载于:https://my.oschina.net/foggy/blog/57437

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值