JEE数据库基本操作Basedao层通用接口的实现

来源:互联网 发布:手机如何禁止安装软件 编辑:程序博客网 时间:2024/06/18 06:53

问题引入:

接着上回商城系统的开发,我们知道在分层架构体系中,DAO层一般就是执行数据库操作的,随着Java代码中对应数据库的表逐渐增多,开始发现代码冗余十分严重,许多操作其实十分相似,可以选择把重复操作封装起来。



  • dao层
    是用来给业务逻辑层(Service)层调用的,它的操作比较固定,有最基本的增删该查操作(CURD)、分页,我们可以把dao层通用方法抽取出来,这也符合了面向对象的思想。

首先要知道实现和继承的作用是不一样,实现强调的是方法的实现,赋予新功能。继承是对父类的延续,直接延续父类的方法。可以理解为,实现是说我改造了你的方法,继承是说我搬运了你的方法。

下面以User表为例
  • BaseDao接口
    Java接口是可以继承的。
    1. 把通用的方法写在BaseDao接口中
    2. 新建BaseDaoImpl实现类,实现通用方法。
    3. 新建UserDao继承BaseDao接口,其中通用方法已经在BaseDao中存在,直接继承即可,如果UserDao有自己的个性方法,比如登录login(),注册regist(),这时候可以自己添加在UserDao,让类UserDaoImpl去实现就可以。
    4. 新建实现类UserDaoImpl实现UserDao,首先UserDao已经继承了BaseDao,因此它有基本操作方法,其次它包括自己的登录注册方法,所以UserDaoImpl可以重写覆盖这些方法。
    5. UserDaoImpl继承BaseDaoImpl此时基本操作已经在父类实现,自己搬用即可。

逻辑视图如下:

这里写图片描述


  • BaseDao
    使用泛型接口
package com.tdd.dao;import java.util.List;import org.hibernate.criterion.DetachedCriteria;/* * 通用接口,以后所有DAO接口都要继承BaseDao接口 * 自定义泛型接口 */public interface BaseDao<T> {    public void save(T t);    public void delete(T t);    public void update(T t);    public T findById(Long id);    public List<T> findAll();    public List<T> findByPage(int intPage, int number, DetachedCriteria criteria);}
  • BaseDaoImpl
package com.tdd.dao;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;/* *  通用Dao实现类,所有Dao实现类直接继承BaseDaoImpl  */@SuppressWarnings("all")public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {    //定义成员属性(待传入)    private Class clazz;     public BaseDaoImpl(){        System.out.println("BaseDaoImpl构造方法,在子类(待传入类对象)加载时候执行______________");        //该方法在子类加载时候执行 ,此时this表示子类        Class c = this.getClass();        Type type = c.getGenericSuperclass();        if (type instanceof ParameterizedType) {            ParameterizedType pType = (ParameterizedType) type;            //获取传入类对象            Type[] types = pType.getActualTypeArguments();            this.clazz = (Class) types[0];        }    }    public void save(T t) {        this.getHibernateTemplate().save(t);    }    public void delete(T t) {        this.getHibernateTemplate().delete(t);    }    public void update(T t) {        this.getHibernateTemplate().update(t);    }    //通过主键查询    public T findById(Long id) {        return (T) this.getHibernateTemplate().get(clazz, id);    }    //查询所有数据    public List<T> findAll() {        return (List<T>) this.getHibernateTemplate().find("from "+clazz.getSimpleName());    }    public List<T> findByPage(int intPage, int number, DetachedCriteria criteria) {        //(Hibernate 框架提供分页)根据传入页号和页大小 计算显示list        List<T> lists = (List<T>) this.getHibernateTemplate().findByCriteria(criteria,                 (intPage-1)*number, number);        return lists;    }}
  • UserDao
package com.tdd.dao;import com.tdd.domain.User;public interface UserDao extends BaseDao<User>{//基本方法通通可以注释掉//  void save(User user);////  List<User> findAll();////  void delete(User user);////  void update(User user);////  User findById(Long user_id);////  List<User> findByPage(int intPage, int number, DetachedCriteria criteria);    //个性方法    public String login();    public String regist();}

UserDaoImpl

package com.tdd.dao;import com.tdd.domain.User;public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {// 基本方法已经实现,可以注释掉//  public void save(User user) {//      // 把数据,保存到数据库中//      this.getHibernateTemplate().save(user);//  }////  public List<User> findAll() {//      return (List<User>) this.getHibernateTemplate().find("from User");//  }////  public void delete(User user) {//      this.getHibernateTemplate().delete(user);//  }////  public void update(User user) {//      this.getHibernateTemplate().update(user);//  }////  public User findById(Long user_id) {//      return this.getHibernateTemplate().get(User.class, user_id);//  }//  //  //查询每页数据//  public List<User> findByPage(int intPage, int number, DetachedCriteria criteria) {//      //(Hibernate 框架提供分页)根据传入页号和页大小 计算显示list//      List<User> lists = (List<User>) this.getHibernateTemplate().findByCriteria(criteria, //              (intPage-1)*number, number);//      return lists;//  }//重写实现注册登录方法public String login(){    ...}public String regist(){    ...}

总结:

采用通用接口最大的好处是减少了UserDao接口以及其实现的代码,需要编写的仅仅是该类某个特殊业务需要实现的方法,那些数据库基本的增删改查等方法,如果写在通用接口,那么直接继承即可。

1 0
原创粉丝点击