解决Hibernate 实体类之间CRUD的代码冗余
程序员文章站
2022-04-13 22:42:16
...
强迫症犯了…..
之前写hibernate dao层代码的时候,直接定义了一个dao接口,定义了CRUD五个方法(查询有两个方法:一个是查询所有的对象,一个是查询特定对象),这样在只有一个实体类的时候没什么问题。测试啥的也通过了。
可是,好景不长。
根据项目需求又添加了一个实体类,于是按照之前的方法再定义一个对应的dao接口,然后实现这个接口。于是问题出现了,发现两个实现类中的crud代码基本类似。在intellij中具体体现为:
强迫症来了,怎么消除这些黄线呢?
所尝试过的错误的方法…
想过定义一个公共的父接口供其他接口继承,在这个父接口中定义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();