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

问题引入:

接着上回商城系统的开发,我们知道在分层架构体系中,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此时基本操作已经在父类实现,自己搬用即可。

逻辑视图如下:

JEE数据库基本操作Basedao层通用接口的实现_第1张图片


  • BaseDao
    使用泛型接口
package com.tdd.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;

/*
 * 通用接口,以后所有DAO接口都要继承BaseDao接口
 * 自定义泛型接口
 */
public interface BaseDao {

    public void save(T t);

    public void delete(T t);

    public void update(T t);

    public T findById(Long id);

    public List findAll();

    public List 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 findAll() {
        return (List) this.getHibernateTemplate().find("from "+clazz.getSimpleName());
    }

    public List findByPage(int intPage, int number, DetachedCriteria criteria) {
        //(Hibernate 框架提供分页)根据传入页号和页大小 计算显示list
        List lists = (List) 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 findAll();
//
//  void delete(User user);
//
//  void update(User user);
//
//  User findById(Long user_id);
//
//  List 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 findAll() {
//      return (List) 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 findByPage(int intPage, int number, DetachedCriteria criteria) {
//      //(Hibernate 框架提供分页)根据传入页号和页大小 计算显示list
//      List lists = (List) this.getHibernateTemplate().findByCriteria(criteria, 
//              (intPage-1)*number, number);
//      return lists;
//  }

//重写实现注册登录方法
public String login(){
    ...
}
public String regist(){
    ...
}

总结:

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

你可能感兴趣的:(Java学习笔记,数据库)