首注:本学习教程为传智播客汤阳光讲师所公布的免费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的实现类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 }
四 我们使用我们已有的实体类来测试一下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 }
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 }
五 我们在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 }
执行单点测试,如果控制台打印出下面的信息,说明成功:
clazz---> class cn.clear.oa.domain.User
至此,我们将最基本的Dao数据操作已经写完了。