JFinal DB.tx()事务回滚及lambda表达式应用

时间:2022-07-03 01:59:40

JFinal DB.tx()事务回滚

在要往数据库操作多条数据时,就需要用到事务,JFinal中有封装好的事务应用

写法:

Db.tx(new IAtom(){
  @Override
  public boolean run() throw SQLException{
  // 在这里写要执行的操作,操作结果result为boolean值
  return result;
  }
});

实际应用示例:

 // 创建邀请码
public String setInviteCode(final WwInviteCodeTemp codeTemp, final Long userId, Integer app) {
String inviteCode = "";
if (codeTemp != null) {
inviteCode = codeTemp.getCode(); // 获取随机的邀请码
final WwInviteCode code = (WwInviteCode) newRecord(new WwInviteCode()); // 保存邀请码
code.setApp(app); // 保存产品编号
code.setUserId(userId);
code.setInviteCode(inviteCode);
final Integer finalApp = app;
boolean b = use().tx(new IAtom() {
@Override
public boolean run() throws SQLException {
boolean flag = codeTemp.setAction(1).update();
if (flag) {
WwInviteCode wwInviteCode = WwInviteCode.dao.findById(userId);
if (wwInviteCode != null) {
flag = false;
} else {
flag = code.setApp(finalApp).setUserId(userId).setInviteCode(codeTemp.getCode()).save();
}
}
return flag;
}
});
if (b == false) {
inviteCode = "";
}
}
return inviteCode;
}

return false或者有异常抛出都会回滚事务,return true才会提交事务,Db.tx()方法是有返回值true/false,可对该返回值作业返回,如果想让run方法中往外层传递变量,可以在外层定义一个final修饰的容器类对象。

修改为lambda表达式方式:

 // 创建邀请码
public String setInviteCode(final WwInviteCodeTemp codeTemp, final Long userId, Integer app) {
String inviteCode = "";
if (codeTemp != null) {
inviteCode = codeTemp.getCode(); // 获取随机的邀请码
final WwInviteCode code = (WwInviteCode) newRecord(new WwInviteCode()); // 保存邀请码
code.setApp(app); // 保存产品编号
code.setUserId(userId);
code.setInviteCode(inviteCode);
final Integer finalApp = app;
boolean b = use().tx(() -> {
boolean flag = codeTemp.setAction(1).update();
if (flag) {
WwInviteCode wwInviteCode = WwInviteCode.dao.findById(userId);
if (wwInviteCode != null) {
flag = false;
} else {
flag = code.setApp(finalApp).setUserId(userId).setInviteCode(codeTemp.getCode()).save();
}
}
return flag;
});
if (b == false) {
inviteCode = "";
}
}
return inviteCode;
}

了解Java Lambda可参考:

30分钟Java Lambda入门教程