欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决Hibernate 实体类之间CRUD的代码冗余

程序员文章站 2022-04-13 22:42:16
...

强迫症犯了…..

之前写hibernate dao层代码的时候,直接定义了一个dao接口,定义了CRUD五个方法(查询有两个方法:一个是查询所有的对象,一个是查询特定对象),这样在只有一个实体类的时候没什么问题。测试啥的也通过了。
可是,好景不长。
根据项目需求又添加了一个实体类,于是按照之前的方法再定义一个对应的dao接口,然后实现这个接口。于是问题出现了,发现两个实现类中的crud代码基本类似。在intellij中具体体现为:
解决Hibernate 实体类之间CRUD的代码冗余
强迫症来了,怎么消除这些黄线呢?

所尝试过的错误的方法…

想过定义一个公共的父接口供其他接口继承,在这个父接口中定义CRUD方法,但是在具体操作过程中发现还是要在实现类中实现CRUD方法。也就是说还是存在着代码冗余!
接着想办法….

toString()方法给的提示….

想来想去也没想到什么好的方法,这时却突然看到了另一个类中我用了一个toString方法打印日志。灵感来了….
于是定义了公共父类——HibernateDao(注意,这不是接口)
抽象出公共方法,代码如下:

package dao;


import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;

import java.util.List;

/**
 * Created by zipple on 2017/10/12.
 * 父类提供基本的公共操作
 */
public class HibernateDao {
    /**
     * 增加一条记录
     * @param object 持久化类
     */
    public void save(Object object){
        Session session =  HibernateUtil.getHibernateSession();
        Transaction tr =session.beginTransaction();
        session.save(object);
        tr.commit();
        session.close();
    }

    /**
     * 删除记录
     * @param object 持久化类
     */
    public void del(Object object){
        Session session =  HibernateUtil.getHibernateSession();
        Transaction tr =session.beginTransaction();
        session.delete(object);
        tr.commit();
        session.close();
    }

    /**
     * 修改对象信息
     * @param object 持久化对象
     */
    public void upd(Object object){
        Session session =  HibernateUtil.getHibernateSession();
        Transaction tr =session.beginTransaction();
        session.update(object);
        //session.saveOrUpdate(stu);
        tr.commit();
        session.close();
    }

    /**
     * 获取数据库中所有对象
     * @return 返回对象列表
     */
    public List getAllObject(String entityClassName){
        Session session = HibernateUtil.getHibernateSession();
        List studentList = session.createQuery("from "+entityClassName).list();
        session.close();
        return studentList;
    }
}

那么,在这个父类基础上,我们可以对某些特定实体类的特定方法另外定义接口,如:

package dao;

import entity.Student;
import java.util.List;

/**
 * Created by zipple on 2017/10/12.
 * student数据库表特定操作
 */
public interface StudentDao{

    /**
     * 根据账号查询某个具体的学生
     * @param account 账号
     * @return 返回student
     */
    public Student getStudentByAccount(String account);
}

实现类:记得继承HibernateDao父类即可

package dao.impl;

import dao.HibernateDao;
import dao.StudentDao;
import util.HibernateUtil;
import entity.Student;
import org.hibernate.Session;
import org.hibernate.query.Query;
/**
 * Created by zipple on 2017/10/12.
 * StudentDao实现类
 */
public class StudentDaoImpl extends HibernateDao implements StudentDao {
    @Override
    public Student getStudentByAccount(String account) {
        Session session = HibernateUtil.getHibernateSession();
        //from后面是对象而不是表名
        Query selectStudentByAcc = session.createQuery("from Student where account =?");
        selectStudentByAcc.setParameter(0,account);
        Student student =(Student) selectStudentByAcc.list().get(0);//返回第一个对象
        session.close();
        return student;
    }
}

注意:使用这种方法后,在测试的时候,我们只能这样获取对象。因为只有实现类才继承了HibernateDao类

    private static StudentDaoImpl dao=new StudentDaoImpl();