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

          

  • 相关阅读:
    spring-boot 中application.properties的各种配置
    spring-boot 集合mybatis 的分页查询
    spring boot热部署pom.xml配置
    ssm框架整合
    mybatis逆向工程
    整合hibernate的lucene大数据模糊查询
    QBC查询、离线条件查询(DetachedCriteric)和分页查询模版
    虚拟机vmnet0、vmnet1和vmnet8的区别
    centOS7-配置网络地址
    在windows中使用Navicat连接Linux虚拟机中的mysql数据库
  • 原文地址:https://www.cnblogs.com/clear5/p/4036805.html
Copyright © 2020-2023  润新知