==========================
抽取通用DAO
经过前面的编写,我们发现dao层很多东西都差不多,比如customer有查询全部,按id查询,分页查询,修改,保存
而linkMan也是同样的,甚至连函数名都一样,只是调用的对象不同,那么我们就可以写一个通用的方法
所有dao里相同的方法都给抽取出来,特有的方法我们保留
比如删除,保存,更新,只需要用泛型代替即可
再用具体的dao来继承通用的dao
那些update,save,delete就可以删掉了
实现类就不再是继承HibernateSupport,而是继承BaseDaoImp,同理customer也可以这样做
抽取查询
这个有点麻烦,我们先抽取查询一个数据的方法
但是查询的方法并不能直接用
可以提供构造方法来解决
这个时候子类就会报错,因为父类没有无参的构造函数,我们上面写了一个参数构造
所以子类也需要一个构造函数
改造一下,默认调用父类一个参数的构造
这个时候直接传入Customer.class即可解决
解决上面的问题,那么只要有具体类型的查询,那么就可以抽取
可以通过类属性描述符调用方法直接获取类的名称,这样就可以拼接了
而下面2个条件查询,可以直接写下来
用户模块里可以把save删了,但是login不行,因为只有user有login方法
字典的也可以改造
现在每个dao里面只需要提供构造方法即可,现在我连构造方法都不想提供
那么在baseDao里提供一个无参的构造方法即可,但是我们还需要具体的类提供类的描述符
所以就可以通过泛型的反射来解决
new的是哪个类,就是哪个类的class,如果new 父类,那么就是父类的class,如果new子类,那么就是子类的class
因为子类创建会默认调用父类的无参构造函数,所以可以在父类的构造函数里,取到具体的类型描述符
现在我们要获取的是这个上面的类
在api里有这2个方法
这个class就是我们调用的那个具体的类,比如customerDaoImp,而这个类描述符再调用getGenericSuperclass
就是获取到baseDaoImp<Customer>
反射的接口,参数化类型