BaseDao基于JPA的实现

来源:互联网 发布:矩阵的行和范数 编辑:程序博客网 时间:2024/06/05 16:00

一,说明

基本DAO的实现也是基于上一篇文章,Spring3+Hibernate4+JPA2.0整合之后,DAO层的实现

二,DAO层的功能

      这里要简单提一下MVC模式了,MVC本身不是一种设计模式,只是在程序开发过程中逐渐形成的一种模式,也可以说是一种结构,它的目的就是为了分层解耦。

      spring框架也有自己的MVC开发模式,spring是面向接口编程(切面),View层调用Controller,Controller调用Service,而Service又调用数据访问层,Model即实体类

      更加详细的介绍可以参考这篇文章,应该是比较循序渐进的入门级的http://jinnianshilongnian.iteye.com/blog/1594806。如果英文比较好,建议直接读英文API文档

      DAO接口代码:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public interface DAO {  
  2.   
  3.     public void save(Object entity);  
  4.       
  5.     public void update(Object entity);  
  6.       
  7.     public <T> void delete(Class<T> entityClass,Object entityid);  
  8.       
  9.     public <T> void delete(Class<T> entityClass,Object[] entityids);  
  10.       
  11.     public <T> T find(Class<T> entityClass,Object entityid);  
  12.       
  13.     /** 
  14.      * 获取分页数据的封装 
  15.      * @param <T> 
  16.      * @param entityClass 实体类 
  17.      * @param firstindex 开始索引 
  18.      * @param maxresult 需要获取的记录数 
  19.      * @return 
  20.      */  
  21.     public <T> QueryResult<T> getScrollData(Class<T> entityClass,int firstindex,int maxresult);  
  22.       
  23.     /** 
  24.      * 带排序功能的分页实现 
  25.      * @param <T> 
  26.      * @param entityClass 
  27.      * @param firstindex 
  28.      * @param maxresult 
  29.      * @param orderby 按照添加的key的顺序排序 
  30.      * @return 
  31.      */  
  32.     public <T> QueryResult<T> getScrollData(
  33. Class<T> entityClass,int firstindex,int maxresult,LinkedHashMap<String, String> orderby);  
  34.       
  35.     /** 
  36.      * 带排序功能的分页实现 
  37.      * @param <T> 
  38.      * @param entityClass 
  39.      * @param firstindex 
  40.      * @param maxresult 
  41.      * @param wheresql 添加限制条件 
  42.      * @param orderby 
  43.      * @return 
  44.      */  
  45.     public <T> QueryResult<T> getScrollData(
  46. Class<T> entityClass,int firstindex,int maxresult,String wheresql,Object[] queryParams,LinkedHashMap<String, String> orderby);  
  47.       
  48. }  


 

DAO实现层代码:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @Transactional  
  2. public abstract class DaoSupport implements DAO {  
  3.   
  4.     @PersistenceContext  
  5.     protected EntityManager em;  
  6.       
  7.     @Override  
  8.     public void save(Object entity) {  
  9.         em.persist(entity);  
  10.     }  
  11.   
  12.     @Override  
  13.     public void update(Object entity) {  
  14.         em.merge(entity);  
  15.     }  
  16.   
  17.     @Override  
  18.     public <T> void delete(Class<T> entityClass, Object entityid) {  
  19.         delete(entityClass, new Object[]{entityid});  
  20.     }  
  21.   
  22.     @Override  
  23.     public <T> void delete(Class<T> entityClass, Object[] entityids) {  
  24.         for(Object id : entityids) {  
  25.             em.remove(em.getReference(entityClass, id));  
  26.         }  
  27.     }  
  28.   
  29.     @Override  
  30.     public <T> T find(Class<T> entityClass, Object entityid) {  
  31.         return em.find(entityClass, entityid);  
  32.     }  
  33.   
  34.     @SuppressWarnings({ "unchecked""rawtypes" })  
  35.     @Override  
  36.     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)  
  37.     public <T> QueryResult<T> getScrollData(Class<T> entityClass,  
  38.             int firstindex, int maxresult) {  
  39.         QueryResult qr = new QueryResult<T>();  
  40.         String entityname = getEntityName(entityClass);  
  41.         Query query = em.createQuery("select o from "+entityname+" o ");  
  42.         query.setFirstResult(firstindex).setMaxResults(maxresult);  
  43.         qr.setResultlist(query.getResultList());  
  44.         query = em.createQuery("select count(o) from " + entityname + " o ");  
  45.         qr.setTotalrecord((Long)query.getSingleResult());  
  46.         return qr;  
  47.     }  
  48.       
  49.     @SuppressWarnings({ "unchecked""rawtypes" })  
  50.     @Override  
  51.     public <T> QueryResult<T> getScrollData(Class<T> entityClass,  
  52.             int firstindex, int maxresult,String wheresql,Object[] queryParams, LinkedHashMap<String, String> orderby) {  
  53.         QueryResult qr = new QueryResult<T>();  
  54.         String entityname = getEntityName(entityClass);  
  55.         Query query = em.createQuery("select o from "+entityname+" o " + (wheresql == null ? "" : " where " + wheresql) + buildOrderby(orderby));  
  56.         setQueryParams(query,queryParams);  
  57.         query.setFirstResult(firstindex).setMaxResults(maxresult);  
  58.         List<T> list = query.getResultList();  
  59.         qr.setResultlist(list);  
  60.         qr.setTotalrecord(list.size());  
  61.         return qr;  
  62.     }  
  63.       
  64.     protected void setQueryParams(Query query,Object[] queryParams) {  
  65.         if(null != queryParams && 0 < queryParams.length) {  
  66.             for (int i = 0; i < queryParams.length; i++) {  
  67.                 query.setParameter(i+1, queryParams[i]);  
  68.             }  
  69.         }  
  70.     }  
  71.       
  72.     @Override  
  73.     public <T> QueryResult<T> getScrollData(Class<T> entityClass,  
  74.             int firstindex, int maxresult, LinkedHashMap<String, String> orderby) {  
  75.         return getScrollData(entityClass, firstindex, maxresult, null,null, orderby);  
  76.     }  
  77.       
  78.     protected String buildOrderby(LinkedHashMap<String, String> orderby) {  
  79.         StringBuffer sb = new StringBuffer();  
  80.         if(null != orderby && 0 != orderby.size()) {  
  81.             sb.append(" order by ");  
  82.             for (String key : orderby.keySet()) {  
  83.                 sb.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");  
  84.             }  
  85.             sb.deleteCharAt(sb.length() - 1);  
  86.         }  
  87.         return sb.toString();  
  88.     }  
  89.       
  90.     /** 
  91.      * 获取实体的名称 
  92.      * @param <T> 
  93.      * @param entityClass 实体类 
  94.      * @return 
  95.      */  
  96.     protected <T> String getEntityName(Class<T> entityClass) {  
  97.         String entityname = entityClass.getSimpleName();  
  98.         Entity entity = entityClass.getAnnotation(Entity.class);  
  99.         if(entity.name() != null && !"".equals(entity.name())) {  
  100.             entityname = entity.name();  
  101.         }  
  102.         return entityname;  
  103.     }  
  104.   
  105. }  


三,添加Service层

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public interface JMusicService extends DAO {  
  2.   
  3. }  


 

Service实现

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @Service(value="jMusicServiceBean")  
  2. @Transactional  
  3. public class JMusicServiceBean extends DaoSupport implements JMusicService {  
  4.   
  5.       
  6.       
  7. }  


 

可以看到,dao层利用泛型的方式来实现,使Service层代码非常简单,但是,这里没有利用依赖注入的方式将dao层和Service层分离,后续中有待处理

四,测试dao层的实现

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class SpringJpaTest {  
  2.   
  3.     private static ApplicationContext cxt;  
  4.     private static JMusicService jmService;  
  5.       
  6.     @BeforeClass  
  7.     public static void setUpBeforeClass() throws Exception {  
  8.         //WebRoot/WEB-INF/  
  9.         cxt=  new ClassPathXmlApplicationContext("spring-mvc.xml");  
  10.         jmService = (JMusicService) cxt.getBean("jMusicServiceBean");  
  11.     }  
  12.       
  13.     @Test  
  14.     public void testsave() {  
  15.           
  16.         for(int i = 0;i < 15;i++) {  
  17.             JMusic jm = new JMusic();  
  18.             jm.setAlbum("BigBun");  
  19.             jm.setDistributeDate(Timestamp.valueOf(DateUtil.getNowDate()));  
  20.             String uuid = UUID.randomUUID().toString().replaceAll("-""");  
  21.             jm.setMusicname(uuid.substring(310));  
  22.             jm.setMusicurl("http://www.baidu.com/music/20150308/"+uuid.substring(310)+".mp3");  
  23.             jm.setSinger("Johns Brooks");  
  24.             jmService.save(jm);  
  25.         }  
  26.     }  
  27.       
  28.     @Test  
  29.     public void testfind() throws UnsupportedEncodingException {  
  30.         JMusic jm = jmService.find(JMusic.class1000);  
  31.         if(null != jm)  
  32.             System.out.println(jm.getSinger());  
  33.     }  
  34.       
  35.       
  36.     @Test  
  37.     public void testdelete () {  
  38.         jmService.delete(JMusic.class1);  
  39.         jmService.delete(JMusic.class2);  
  40.     }  
  41.     /*** 
  42.      * 测试分页 
  43.      */  
  44.     @Test  
  45.     public void testPages() {  
  46.         QueryResult<JMusic> qr = jmService.getScrollData(JMusic.class1110);  
  47.         for(JMusic jm : qr.getResultlist()) {  
  48.             System.out.println(jm.getId());  
  49.         }  
  50.     }  
  51.       
  52.     /*** 
  53.      * 测试带有排序的分页 
  54.      */  
  55.     @Test  
  56.     public void testOrderPages() {  
  57.         LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();  
  58.         orderby.put("musicname""desc");  
  59.         orderby.put("id""asc");  
  60.         //JPA占位符  
  61.         QueryResult<JMusic> qr = jmService.getScrollData(JMusic.class0100," singer=?1",new Object[]{"Jay"},orderby);  
  62.         for(JMusic jm : qr.getResultlist()) {  
  63.             System.out.println(jm.getMusicname() + "-" + jm.getId());  
  64.         }  
  65.     }  
  66.   

0 0
原创粉丝点击