OA学习笔记-007-Dao层设计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OA学习笔记-007-Dao层设计相关的知识,希望对你有一定的参考价值。

一、

 

User, UserDao
save(User user), update(), delete(), find(), ...
Role, RoleDao
save(Role role), update(), delete(), find(), ...
Student, StudentDao
save(Student student), update(), delete(), find(), ...
...

 


BaseDao<T>
save(T t), update(), delete(), find()

 

UserDao extends BaseDao<User> { ... }
RoleDao extends BaseDao<Role>{ ... }
...

 

技术分享

二、接口层抽取公共代码

BaseDao.java

 1 public interface BaseDao<T> {
 2 
 3     /**
 4      * 保存实体
 5      * 
 6      * @param entity
 7      */
 8     void save(T entity);
 9 
10     /**
11      * 删除实体
12      * 
13      * @param id
14      */
15     void delete(Long id);
16 
17     /**
18      * 更新实体
19      * 
20      * @param entity
21      */
22     void update(T entity);
23 
24     /**
25      * 按id查询
26      * 
27      * @param id
28      * @return
29      */
30     T getById(Long id);
31 
32     /**
33      * 按id查询
34      * 
35      * @param ids
36      * @return
37      */
38     List<T> getByIds(Long[] ids);
39 
40     /**
41      * 查询所有
42      * 
43      * @return
44      */
45     List<T> findAll();
46 
47 }

 

三、实现层抽取公共代码

BaseDaoImpl.java

 1 import java.lang.reflect.ParameterizedType;
 2 import java.util.List;
 3 
 4 import javax.annotation.Resource;
 5 
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8 
 9 @SuppressWarnings("unchecked")
10 public abstract class BaseDaoImpl<T> implements BaseDao<T> {
11 
12     //这里不用管事务,因为由spring做
13     @Resource
14     private SessionFactory sessionFactory;
15     private Class<T> clazz;
16 
17     public BaseDaoImpl() {
18         // 使用反射技术得到T的真实类型
19         // this表示当前new 的对象
20         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型
21         this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型,如 new Map<K,V>,此方法返回[k,v]
22         System.out.println("clazz ---> " + clazz);
23     }
24 
25     /**
26      * 获取当前可用的Session
27      * 给子类方便获取session
28      * @return
29      */
30     protected Session getSession() {
31         return sessionFactory.getCurrentSession();
32     }
33 
34     public void save(T entity) {
35         getSession().save(entity);
36     }
37 
38     public void update(T entity) {
39         getSession().update(entity);
40     }
41 
42     public void delete(Long id) {
43         Object obj = getById(id);
44         if (obj != null) {
45             getSession().delete(obj);
46         }
47     }
48 
49     public T getById(Long id) {
50         return (T) getSession().get(clazz, id);
51     }
52 
53     public List<T> getByIds(Long[] ids) {
54         return getSession().createQuery(//防止被格式化
55                 "FROM User WHERE id IN (:ids)")//
56                 .setParameterList("ids", ids)//
57                 .list();
58     }
59 
60     public List<T> findAll() {
61         return getSession().createQuery(//
62                 "FROM " + clazz.getSimpleName())//
63                 .list();
64     }
65 
66 }

 

四、测试

1 public class BaseDaoTest {
2 
3     @Test
4     public void testSave() {
5         UserDao userDao = new UserDaoImpl();
6         RoleDao roleDao = new RoleDaoImpl();
7     }
8 
9 }

 

以上是关于OA学习笔记-007-Dao层设计的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记:python3,代码片段(2017)

OA学习笔记-002-Sruts2.1配置

OA学习笔记-004-Spring2.5配置

OA学习笔记-005-Spring2.5与struts2.1整合

[原创]java WEB学习笔记21:案例完整实践(part 2)---.DAO层设计

OA学习笔记-006-SPRING2.5与hibernate3.5整合