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数据操作已经写完了。

      

你可能感兴趣的:(seda)