OA项目4:BaseDao设计

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明。谢谢。

一 为什么要设计BaseDao?

  为了减少代码量,用最少的代码实现最多的功能。

二 建立一个cn.clear.oa.base包,在包下写一个接口类,有最基本的增删改查功能,具体内容如下:

 1 package cn.clear.oa.base;
 2 
 3 import java.util.List;
 4 
 5 public interface BaseDao<T> {
 6     /**
 7      * 根据id查询实体对象
 8      * @param id
 9      * @return
10      */
11     public T findById(Long id);
12     /**
13      * 根据ids查询实体对象集合
14      * @param ids
15      * @return
16      */
17     public List<T> findByIds(Long[] ids);
18     /**
19      * 查询所有
20      * @return
21      */
22     public List<T> findAll();
23     /**
24      * 保存实体对象
25      * @param entity
26      */
27     public void save(T entity);
28     /**
29      * 更新实体对象
30      * @param entity
31      */
32     public void update(T entity);
33     /**
34      * 根据id删除实体对象
35      * @param id
36      */
37     public void delete(Long id);
38 }
BaseDao.java

三 在该包下继续写一个BaseDao的实现类BaseDaoImpl.java,实现所有的方法,具体内容如下:

 1 package cn.clear.oa.base;
 2 
 3 import java.lang.reflect.ParameterizedType;
 4 import java.util.Collections;
 5 import java.util.List;
 6 
 7 import javax.annotation.Resource;
 8 
 9 import org.hibernate.Session;
10 import org.hibernate.SessionFactory;
11 
12 
13 @SuppressWarnings("unchecked")
14 public abstract class BaseDaoImpl<T> implements BaseDao<T> {
15     
16     @Resource
17     private SessionFactory sessionFactory;//引入SessionFactory
18     private Class<T> clazz;//具体对象
19     
20     public BaseDaoImpl(){
21         //获取泛型父类
22         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
23         //获取最终的具体实体对象
24         this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
25         //测试拿到的是否所需对象
26         System.out.println("clazz---> "+clazz);
27     }
28     /**
29      * 获取Session对象,使用protected,子类可以直接使用
30      * @return
31      */
32     protected Session getSession(){
33         return sessionFactory.getCurrentSession();
34     }
35 
36     public T findById(Long id) {
37         if(id == null){
38             return null;
39         }
40         return (T) getSession().get(clazz, id);
41     }
42 
43     public List<T> findByIds(Long[] ids) {
44         
45         if(ids == null &&  ids.length == 0){
46             return Collections.emptyList();
47         }
48         
49         return getSession().createQuery(//
50                 "FROM "+clazz.getSimpleName()+" WHERE id IN(:ids)")//
51                 .setParameter("ids", ids)//
52                 .list();
53     }
54 
55     public List<T> findAll() {
56         
57         return getSession().createQuery(//
58                 "FROM "+clazz.getSimpleName())//
59                 .list();
60     }
61 
62     public void save(T entity) {
63         
64         getSession().save(entity);
65     }
66 
67     public void update(T entity) {
68         getSession().update(entity);
69     }
70 
71     public void delete(Long id) {
72         
73         Object obj = findById(id);
74         if(obj!=null){
75             getSession().delete(obj);
76         }
77         
78     }
79 
80 }
BaseDaoImpl.java

四 我们使用我们已有的实体类来测试一下Dao的功能。

  1.在Dao层写一个UserDao.java的接口类,继承BaseDao.java,内容如下:

1 package cn.clear.oa.dao;
2 
3 import cn.clear.oa.base.BaseDao;
4 import cn.clear.oa.domain.User;
5 
6 public interface UserDao extends BaseDao<User>{
7 
8 }
UserDao.java

  2.在DaoImpl层写userdao的实现类UserDaoImpl.java,内容如下:

 1 package cn.clear.oa.dao.impl;
 2 
 3 import org.springframework.stereotype.Repository;
 4 
 5 import cn.clear.oa.base.BaseDaoImpl;
 6 import cn.clear.oa.dao.UserDao;
 7 import cn.clear.oa.domain.User;
 8 @Repository
 9 public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
10 
11 }
UserDaoImpl.java

五 我们在tset层写一个TestBaseDao.java的类,用来测试dao功能:

 1 package cn.clear.oa.test;
 2 
 3 import org.junit.Test;
 4 import org.springframework.stereotype.Service;
 5 
 6 import cn.clear.oa.dao.RoleDao;
 7 import cn.clear.oa.dao.UserDao;
 8 import cn.clear.oa.dao.impl.RoleDaoImpl;
 9 import cn.clear.oa.dao.impl.UserDaoImpl;
10 
11 @Service
12 public class TsetBaseDao {
13     @Test
14     public void test() throws Exception {
15         UserDao userDao = new UserDaoImpl();
16 
17     }
18 }
TsetBaseDao.java

  执行单点测试,如果控制台打印出下面的信息,说明成功:

  clazz---> class cn.clear.oa.domain.User

至此,我们将最基本的Dao数据操作已经写完了。

      

原文地址:https://www.cnblogs.com/clear5/p/4036805.html