最近一个叫queryDSl的框架与数据库打交道,经过一番测试,觉得这个框架的确好用,它没有像hibernate那样那么庞大,又不像mybatis那样移植性不好。但是看了一些人的保存操作是一个一个的字段写的,本人觉得太过于繁锁,若一个表有四、五十个字段或者更多的话,工作量将会无比庞大。因此,本人摸索出了一个可以动态遍历一个QBean所用属性的方法,可避免前面提到的那种弊端。
/**
* 添加或者更新的方法,可通用,需要传入一个dto以及Qbean对象,若id为空,则是插入,不为空,则是更新操作
*
* @param qBean
* @param dto
* @return
*/
@SuppressWarnings("all")
public OrgBaseRoomsDto saveOrUpdate(QRooms qBean, RoomsDto dto) {
// 获取dto的反射对象,动态完善插入或者更新语句
Class clazz = dto.getClass();
// 获取全部的字段属性,不包括那些以fk,pk结尾的字段
Path[] ps = qBean.all();
// 获取id,判断id是否为空
String id = dto.getId();
if (id == null) {// id为空,插入操作
id = IdGenerator.genId();
dto.setId(id);
SQLInsertClause insert = queryFactory.insert(qBean);
for (Path path : ps) {
String fieldName = path.getMetadata().getName();
try {
StringBuilder sb = new StringBuilder("get");
// 将字段首字母大写
char[] cs = fieldName.toCharArray();
cs[0] -= 32;
String temp = new String(cs);
sb.append(temp);
Method getMethod = clazz.getMethod(sb.toString(), null);
Object value = getMethod.invoke(dto, null);
insert.set(path, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
insert.execute();
} else {// id不为空,更新操作
update(qBean,dto);
}
return dto;
}
/**
* 添加或者更新的方法,可通用,需要传入一个dto以及Qbean对象,若id为空,则是插入,不为空,则是更新操作
*
* @param qBean
* @param dto
* @return
*/
@SuppressWarnings("all")
public OrgBaseRoomsDto saveOrUpdate(QRooms qBean, RoomsDto dto) {
// 获取dto的反射对象,动态完善插入或者更新语句
Class clazz = dto.getClass();
// 获取全部的字段属性,不包括那些以fk,pk结尾的字段
Path[] ps = qBean.all();
// 获取id,判断id是否为空
String id = dto.getId();
if (id == null) {// id为空,插入操作
id = IdGenerator.genId();
dto.setId(id);
SQLInsertClause insert = queryFactory.insert(qBean);
for (Path path : ps) {
String fieldName = path.getMetadata().getName();
try {
// 将字段首字母大写
StringBuilder sb = new StringBuilder("get");
char[] cs = fieldName.toCharArray();
cs[0] -= 32;
String temp = new String(cs);
// 完善get方法名
sb.append(temp);
// 获取get方法,获取get值
Method getMethod = clazz.getMethod(sb.toString(), null);
Object value = getMethod.invoke(dto, null);
System.out.println(getMethod.getName() + "=======" + value);
// 完善插入语句
insert.set(path, value);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
insert.execute();
} else {// id不为空,更新操作
update(qBean,dto);
}
return dto;
}
值得说明的是。dto实际上就相当于一个javaBean