搭建好框架后对dao层进行功能扩充
在搭建好框架后,因为搭建框架时候只使用了一个方法进行测试,现在已经测试框架是成功的,所以需要重新编写其他的增删改查等方法。
之前写的方法只是保存也就是增加。现在把查询和修改等等补全。
直接在testSysUserGroupDao.java中增加测试方法,逆着进行方法的补全。
1.添加update方法
@Test
public void testUpdate() {
ISysUserGroupDao sysUserGroupDao = (ISysUserGroupDao) ctx.getBean(ISysUserGroupDao.SERVICE_NAME);
//插入数据
SysUserGroup sysUserGroup = new SysUserGroup();
sysUserGroup.setId(5);
sysUserGroup.setIncumbent("更新销售部");
sysUserGroup.setName("李四");
sysUserGroup.setPrincipal("张三");
sysUserGroup.setRemark("no remark");
sysUserGroupDao.update(sysUserGroup);
}
这里会报错,因为在sysUserGroupDao.update(sysUserGroup);中没有update这个方法,所以进入到ICommonDao层,添加update接口,
void update(T entity);
增加后,在CommonDaoImpl实现类中增加update的实现方法:
@Override
public void update(T entity) {
super.getHibernateTemplate().update(entity);
}
运行测试成功!
2.添加find方法
添加查询方法有点复杂,因为查询一般是通过id查询,而数据库中的id一般有很多中存储方式,integer,String ,long等等类型,下面解决这个问题:
利用Serializable,这个类型兼容很多中数据类型
同样先写测试类,逆向进行方法的补全:
@Test
public void testFindSysUserGroupById() {
ISysUserGroupDao sysUserGroupDao = (ISysUserGroupDao) ctx.getBean(ISysUserGroupDao.SERVICE_NAME);
//插入数据
Serializable id=1;//使用这个类型可以涵盖多种数据类型进行查询
SysUserGroup sysUserGroup= sysUserGroupDao.findObjectById(id);
System.out.println(sysUserGroup.toString());
}
这里需要补全的方法有:
findObjectById(id)
所以在ICommonDao中添加:
T findObjectById(Serializable id);
实现类中添加:
@Override
public T findObjectById(Serializable id) {
if(id==null){
throw new RuntimeException("您要查找的id不能为空");
}
return (T)this.getHibernateTemplate().get(entityClass,id);
}
这里需要输入一个entityClass,而这个类需要进行反射获取父类的类型,获取方式为:
ParameterizedType type= (ParameterizedType) classzz.getGenericSuperclass();
Class entityClass = (Class) type.getActualTypeArguments()[0];
所以编写一个工具类,在com.huiyu.crm.util包中添加:GenericClass
目的用来获取父类的泛型类型
public static Class getGenericClass(Class classzz) {
ParameterizedType type= (ParameterizedType) classzz.getGenericSuperclass();
Class entityClass = (Class) type.getActualTypeArguments()[0];
return entityClass;
}
然后在CommonDaoImpl.java实现类中调用这个方法即可;
定义一个私有对象:
private Class entityClass = GenericClass.getGenericClass(this.getClass());
把这个entity传给findObjectById方法即可。 这样就可以在测试类中查询需要的id数据,如果查询需要在控制台显示出查询的数据
需要在javabean中对应的bean类添加toString方法。
@Override
public String toString() {
return "SysUserGroup [id=" + id + ", remark=" + remark + ", name="
+ name + ", principal=" + principal + ", incumbent="
+ incumbent + "]";
}
其他删除功能也是类似,把相同的id作为serializable类型进行删除,仿照查询方法写就行了。