package com.jade.basung.bss.module.common; import com.jade.framework.base.criterion.Criteria; import com.jade.framework.base.util.PagingList; import com.jade.basung.bss.BaseException; /** * dao层公共接口 * * @date 15/8/28 下午5:23 * @version 1.0 */ public interface IBaseDao<M extends java.io.Serializable, PK extends java.io.Serializable> { /** * 增加方法 - 通用 * @param model 通用对象模型 * @throws BaseException */ void add(M model) throws BaseException; /** * 更新方法 - 通用 * @param model 通用对象模型 * @throws BaseException */ void update(M model) throws BaseException; /** * 删除指定对象 - 通用 * @param model 通用对象模型 * @throws BaseException */ void delete(M model) throws BaseException; /** * 根据id查找指定对象 * @param model 通用对象模型 * @param id 指定的id * @return 通用对象 */ M get(Class<M> model, PK id); /** * 根据Criteria查询符合条件的信息 * @param clazz 类名称 * @param criteria Criteria对象 * @return */ PagingList<M> listall(Class<M> clazz, Criteria criteria); }
package com.jade.basung.bss.module.common; import com.jade.framework.base.criterion.Criteria; import com.jade.framework.base.util.PagingList; import com.jade.basung.bss.BaseException; /** * 数据管理层通用接口 * * @version 1.0 * @date 15/8/28 下午5:24 */ public interface IBaseManager<M extends java.io.Serializable, PK extends java.io.Serializable> { /** * 增加方法 - 通用 * @param model 通用对象模型 * @throws BaseException */ void add(M model) throws BaseException; /** * 更新方法 - 通用 * @param model 通用对象模型 * @throws BaseException */ void update(M model) throws BaseException; /** * 删除指定对象 - 通用 * @param ids 要删除对象的id,可多个 * @throws BaseException */ void delete(Class<M> clazz, PK... ids) throws BaseException; /** * 根据id查找指定对象 * @param model 通用对象模型 * @param id 指定的id * @return 通用对象 */ M get(Class<M> model, PK id); /** * 根据Criteria查询符合条件的信息 * @param clazz 类名 * @param criteria Criteria对象 * @return */ PagingList<M> listall(Class<M> clazz, Criteria criteria); }
package com.jade.basung.bss.module.common.impl; import java.util.Date; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TemporalType; import com.jade.framework.base.criterion.Criteria; import com.jade.framework.base.criterion.sql.SqlUtils; import com.jade.framework.base.util.PagingList; import com.jade.basung.bss.BaseException; import com.jade.basung.bss.module.common.IBaseDao; /** * dao层公共接口实现 * * @date 15/8/28 下午5:46 * @version 1.0 */ @Named("bss_baseDao") public class BaseDao<M extends java.io.Serializable, PK extends java.io.Serializable> implements IBaseDao<M,PK> { @PersistenceContext (unitName = "default") private EntityManager entityManager; public void add(M model) throws BaseException { entityManager.persist(model); } public void update(M model) throws BaseException { entityManager.merge(model); } public void delete(M model) throws BaseException { entityManager.remove(model); } public M get(Class<M> model,PK id) { return entityManager.find(model, id); } public PagingList<M> listall(Class<M> clazz, Criteria criteria) { String sql = "SELECT "+clazz.getSimpleName().toLowerCase()+" FROM "+clazz.getSimpleName()+" "+clazz.getSimpleName().toLowerCase()+" "; return SqlUtils.sqlQuery(sql, entityManager, criteria); } /** * 执行insert,update,delete批处理语句 未能全部实现-待定 */ protected int execteBulk(final String hql, final Object... paramlist) { Query query = entityManager.createQuery(hql); setParameters(query, paramlist); Object result = query.executeUpdate(); return result == null ? 0 : ((Integer) result).intValue(); } protected int execteNativeBulk(final String natvieSQL, final Object... paramlist) { Query query = entityManager.createNativeQuery(natvieSQL); setParameters(query, paramlist); Object result = query.executeUpdate(); return result == null ? 0 : ((Integer) result).intValue(); } protected void setParameters(Query query, Object[] paramlist) { if (paramlist != null) { for (int i = 0; i < paramlist.length; i++) { if(paramlist[i] instanceof Date) { query.setParameter(i, (Date)paramlist[i], TemporalType.TIMESTAMP); } else { query.setParameter(i, paramlist[i]); } } } } }
package com.jade.basung.bss.module.common.impl; import javax.ejb.TransactionAttribute; import javax.inject.Named; import com.jade.framework.base.criterion.Criteria; import com.jade.framework.base.util.PagingList; import com.jade.basung.bss.BaseException; import com.jade.basung.bss.module.common.IBaseDao; import com.jade.basung.bss.module.common.IBaseManager; import org.springframework.transaction.annotation.Transactional; /** * 通用数据管理接口实现 * * @date 15/8/28 下午7:29 * @version 1.0 */ @Named("bss_baseManager") public abstract class BaseManagerImpl<M extends java.io.Serializable, PK extends java.io.Serializable> implements IBaseManager<M,PK> { public IBaseDao<M, PK> baseDao; public abstract void setBaseDao(IBaseDao<M, PK> baseDao); @TransactionAttribute @Transactional (rollbackFor = Exception.class) public void add(M model) throws BaseException { baseDao.add(model); } @TransactionAttribute @Transactional (rollbackFor = Exception.class) public void update(M model) throws BaseException { baseDao.update(model); } @TransactionAttribute @Transactional (rollbackFor = Exception.class) public void delete(Class<M> clazz, PK... ids) throws BaseException { for (PK id : ids) { M model = baseDao.get(clazz, id); if (model != null) { baseDao.delete(model); } } } public M get(Class<M> clazz,PK id) { return baseDao.get(clazz, id); } public PagingList<M> listall(Class<M> clazz, Criteria criteria) { return baseDao.listall(clazz, criteria); } }
先封装一套通用的 DAO Service 然后对应的Dao Service 业务逻辑再继承公用的接口
下面是具体的使用场景
package com.jade.basung.opration.collect; import com.jade.basung.bss.module.common.IBaseDao; /** * 收藏数据访问接口 * * @date 15/11/23 上午11:51 * @version 1.0 */ public interface CollectDao extends IBaseDao<Collect, Long> { }
package com.jade.basung.opration.collect.impl; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import com.jade.basung.bss.module.common.impl.BaseDao; import com.jade.basung.opration.collect.Collect; import com.jade.basung.opration.collect.CollectDao; /** * 收藏数据访问接口实现 * * @date 15/11/23 下午3:11 * @version 1.0 */ @Named("ld_collectDao") public class JpaCollectDao extends BaseDao<Collect, Long> implements CollectDao { @PersistenceContext (unitName="default") private EntityManager entityManager; }
package com.jade.basung.opration.collect; import com.jade.basung.bss.BaseException; import com.jade.basung.bss.module.common.IBaseManager; import com.jade.basung.opration.OprationException; /** * 收藏管理访问接口 * * @date 15/11/23 上午11:51 * @version 1.0 */ public interface CollectManager extends IBaseManager<Collect, Long> { public void addCollect(Collect collect) throws OprationException, BaseException; public void delCollect(Long... ids) throws OprationException, BaseException; }
package com.jade.basung.opration.collect.impl; import javax.ejb.TransactionAttribute; import javax.inject.Inject; import javax.inject.Named; import com.jade.basung.bss.BaseException; import com.jade.basung.bss.module.common.IBaseDao; import com.jade.basung.bss.module.common.impl.BaseManagerImpl; import com.jade.basung.commodities.goods.GoodsDao; import com.jade.basung.opration.OprationException; import com.jade.basung.opration.collect.Collect; import com.jade.basung.opration.collect.CollectDao; import com.jade.basung.opration.collect.CollectManager; import com.jade.basung.opration.collect.Enum.CollectType; import com.jade.basung.opration.comment.Comment; import com.jade.basung.opration.news.NewsDao; import org.springframework.transaction.annotation.Transactional; /** * 收藏管理访问接口实现 * * @date 15/11/23 下午3:09 * @version 1.0 */ @Named("ld_collectManager") public class CollectManagerImpl extends BaseManagerImpl<Collect, Long> implements CollectManager { private CollectDao collectDao; private GoodsDao goodsDao; private NewsDao newsDao; @Override @Inject public void setBaseDao(@Named("ld_collectDao")IBaseDao<Collect, Long> baseDao) { this.baseDao = baseDao; this.collectDao = (CollectDao)baseDao; } @Inject public void setGoodsDao(@Named("ld_goodsDao")GoodsDao goodsDao) { this.goodsDao = goodsDao; } @Inject public void setNewsDao(@Named("ld_newsDao")NewsDao newsDao) { this.newsDao = newsDao; } @TransactionAttribute @Transactional (rollbackFor = Exception.class) public void addCollect(Collect collect) throws BaseException, OprationException { collectDao.add(collect); //增加收藏 if (CollectType.Goods == collect.getType()) { goodsDao.collectsCount(collect.getRelId(), 1); } else if(CollectType.News == collect.getType()){ newsDao.collectsCount(collect.getRelId(), 1); } } @TransactionAttribute @Transactional (rollbackFor = Exception.class) public void delCollect(Long... ids) throws OprationException, BaseException { for (Long id: ids) { Collect collect = collectDao.get(Collect.class, id); if (null == collect) { throw new OprationException("err.jade.operation.collect.collect_no_exist"); } if (CollectType.Goods == collect.getType()) { goodsDao.collectsCount(collect.getRelId(), -1); } else if(CollectType.News == collect.getType()){ newsDao.collectsCount(collect.getRelId(), -1); } collectDao.delete(collect); } } }
spring 依赖注入 继承父类接口 子类重写父类抽象方法 父类引用指向子类对象(接口父类 A=new 子类实现 B) 然后是 spring jpa @TransactionAttribute 事务回滚 简单的底层封装完毕
本人亲测可用 (PS:——请勿无脑拷贝我的代码,程序编码人员应该有自己的思想,而不是重复代码生产工具)
java spring 简单封装出自己的DAO Service实现
原文:http://blog.csdn.net/u014535678/article/details/51924523