人事管理系统之基本增删改查的实现以及BaseDao的抽取和封装

来源:互联网 发布:二元期权作弊软件 编辑:程序博客网 时间:2024/06/05 16:25

1.问题描述

对于不同的对象我们都要进行基本的增删改查的操作,这样的话就会写许多重复的代码,所以我们可以把这些公共的方法抽取出来放入BaseDao和BaseDaoImp,我们其他的接口和实现类就只要去继承和实现BaseDao和BaseDaoImp而不需要去自己重复写同样的代码了。

2.UML类图


3.实现细节和代码

public class BaseDaoImp<T> implements IBaseDao<T>{@Resourceprivate SessionFactory sessionFactory;private Class<T> clazz;/** * 用(调用者的类)实现类的类型获取当前的类类型 */public BaseDaoImp(){//this.getClass() 子类的类型    反射技术得到T的真实类型ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();//获取当前new的对象的泛型的父类类型this.clazz=(Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型}/** * 让子类也能获取当前session * @return */protected Session getSession(){return sessionFactory.getCurrentSession();}@Overridepublic void save(T entity) {getSession().save(entity);}@Overridepublic void delete(Long id) {Object obj=getById(id);if(obj!=null){//删除一个对象getSession().delete(obj);}}@Overridepublic void update(T t) {getSession().update(t);}@Overridepublic T getById(Long id) {if(id==null){return null;}return (T) getSession().get(clazz, id);}@Overridepublic List<T> getAll() {return  getSession().createQuery("FROM "+clazz.getSimpleName()).list();}@Overridepublic List<T> getByIds(Long[] ids) {//id是个数组设置parameterList参数return getSession().createQuery("FORM User where id IN(:ids)").setParameterList("ids", ids).list();}
细节:1.在BaseDao中我们不好指定某个具体的类型因为实现类不同,所一在这里我们用到了泛型,当我们需要操作某个对象时只需要把这个对象的类型来取代这个泛型就行。
    2.我们使用的方法来操作对象时需要知道他的类型是什么,但是在这里我们并不知道具体的实现类(子类类型)是什么(在这里用的是泛型T代替)所以我们需要用到反射的技术得到具体的子类类型。(也就是构造函数的内容)。

阅读全文
0 0