一.自定义注解 @UpdateWhere
@Target({ElementType.FIELD}) //作用于类
@Retention(RetentionPolicy.RUNTIME) //运行时有效
@Documented //可以出现在文档里
@Inherited
public @interface UpdateWhere {
}
二.创建实体类接受
public class NameValuePair<Name, Value> implements Serializable {
private static final long serialVersionUID = 1276809011610487148L;
private Name name;
private Value value;
public NameValuePair() {
super();
}
public NameValuePair(Name name, Value value) {
super();
this.name = name;
this.value = value;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public Value getValue() {
return value;
}
public void setValue(Value value) {
this.value = value;
}
public NameValuePair<Name, Value> returnThis() {
return this;
}
}
三.动态sql生成
throws ServiceException {
try {
Class<?> updateClazz = updateObject.getClass();
// Table 是类上面是否有这个注解
if (!Verify.isEmpty(id) || updateClazz == null || !updateClazz.isAnnotationPresent(Table.class)) {
throw new ServiceException("参数异常!");
}
ArrayList<NameValuePair<String, Object>> whereList = new ArrayList<>(); // 条件list
ArrayList<Object> sqlParams = new ArrayList<>(); // 参数list
StringBuilder sqlBuffer = new StringBuilder("update " + updateClazz.getSimpleName() + " set ");
// 开始解析
// getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段
for (Field declaredField : updateClazz.getDeclaredFields()) {
if (declaredField.isAnnotationPresent(Id.class)) {
continue; // ID不参与更新
}
if (!declaredField.isAnnotationPresent(Column.class)) {
continue;
}
declaredField.setAccessible(Boolean.TRUE);
String declaredFieldName = declaredField.getName();
Object declaredFieldValue = declaredField.get(updateObject);
if (declaredFieldValue == null || declaredFieldValue.toString().trim().length() < 1) {
continue;
}
if (declaredField.isAnnotationPresent(UpdateWhere.class)) {
// whereList.add(new NameValuePair<>(declaredFieldName, declaredFieldValue));
continue; // 更新的条件不参与更新
}
sqlBuffer.append(declaredFieldName).append("=?,");
sqlParams.add(declaredFieldValue);
declaredField.setAccessible(Boolean.FALSE);
}
if (!sqlBuffer.toString().endsWith(",")) {
// LOGGER.info("未检测到更新参数, 已生成的SQL: " + sqlBuffer + " ; 参数: " + updateObject);
}
/*
* sqlBuffer.deleteCharAt(sqlBuffer.length() -
* 1).append(" where 1=1, ");
*/
// if (whereList.size() < 1) {
// throw new ServiceException("未检测到更新条件1, 已生成的SQL: " + sqlBuffer + ", 参数: " + updateObject);
// }
/*
* for (NameValuePair<String, Object> nameValuePair : whereList) {
* sqlBuffer.append(nameValuePair.getName()).append("=?,");
* sqlParams.add(nameValuePair.getValue()); }
*/
/*
* if (!sqlBuffer.toString().endsWith(",")) { throw new
* ServiceException("未检测到更新条件2, 已生成的SQL: " + sqlBuffer + ", 参数: " +
* updateObject); }
*/
String sqlString = sqlBuffer.append("updateTime=? ").append(" where id= ?")
.toString();
sqlParams.add(updateTime);
sqlParams.add(id);
return new NameValuePair<>(sqlString, sqlParams.toArray());
} catch (Exception e) {
throw new ServiceException("生成hibernate更新的SQL异常, 参数: " + updateObject, e);
}
}
四.获取
name:动态sql语句
value;参数值