2020-03-22 23:32

在 spring 场景下使用 jfinal 的 ActiveRecordPlugin 是很爽的事情,比 hibernate、 mybatis 简洁方便得多

2020-03-22 23:31

通过你的回复可以得知你对代码的调试还不熟练, 调试代码是开发的最基本技能,这个技能甚至与你掌握 java 语法同等重要

2020-03-22 23:29

@yunqi query 方法确实没有进入 builder

但是扩展 query 方法更简单,大致步骤如下:
1: 创建一个 MyDbPro.java 继承 DbPro,并覆盖其中的 query 方法,改掉里面的获取方式,学习一下前面我回复中的 Builder 中的 if 判断

public class MyDbPro extends DbPro {
public MyDbPro(String configName) {
super(configName);
}

protected List query(Config config, Connection conn, String sql, Object... paras) throws SQLException {
改写这个方法内部的实现
}
}

2:在 configPlubin 中通过如下配置,用下自己的这个 MyDbPro
ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
arp.setDbProFactory(configName -> new MyDbPro(configName));
me.add(arp);

2020-03-22 23:19

前端搞出乱码的问题必然与 jfinal 无关,因为 jfinal 是后端框架,无法干预你在前端搞出来的事情

2020-03-22 23:19

data 中的数据应该是 json ,而不是拼成一长串的字符串,并且你的数据类型也没有指定为 json :
$.ajax(url, {
type: "POST"
, dataType: "json"
, data: {
processInstanceIds: ...,
deleteReason: ...
}
});

2020-03-22 23:16

小程序功能已经加了,你仔细看一下

2020-03-22 23:15

目前你在业务层的用法,完全可以改成:
public Site findById(Object id) {
return dao.findFristByCache("site", id, "select * from site where id = ? ", id);
}

虽然代码比你建议的 findByIdByCache 稍多,但比你目前的用法能省很多代码

2020-03-22 23:13

很早就想添加一个这种方法,但名字不好取

findByIdByCache 这个名字不太好

其次,有 findFristByCache 可以在一定程度上代替这个方法的功能。稍微多一点点代码

如果你有更好的名字,可以提给我,可以添加进去

2020-03-21 16:18

Db.update("update tablename set remainamount = ? where id = ?", newnumber , id);

2020-03-20 15:12

补充一点,在覆盖父类的 build 方法时, if 判断之下,你可以选择该返回什么类型的值:
1:如果想返回 Integer , 使用:value = rs.getInteger(i);
2:如果想返回 Long , 使用:value = rs.getLong(i);

我相信 Integer 与 Long 正是你想要的类型

Oracle 下的 BigDecimal 问题本质上是 JDBC 返回的就是这种类型,而 jfinal 并未干预过

2020-03-20 15:10

最后在使用的时候这么来用:
ActiveRecordPlugin arp = new ActiveRecordPlugin(...);

Dialect dialect = new OracleDialect();
dialect.setModelBuilder(new MyModelBuilder());
dialect.setRecordBuilder(new MyRecordBuilder());

arp.setDialect(dialect);
me.add(arp);

简单来说就是换掉 OracleDialect 中的两个 Builder,换成你自己的

这种扩展方式就是在精确控制从 JDBC 过来的数据,对不同的数据类型进行处理

2020-03-20 15:08

@yunqi 扩展一下 :
com.jfinal.plugin.activerecord.ModelBuilder.java

当前 oracle 用的是对于上述 ModelBuilder 的扩展:
TimestampProcessedModelBuilder.java
TimestampProcessedRecordBuilder.java

通过查看 OracleDialect.java 可以知道是如何用起来的

具体办法如下:
1:继承 TimestampProcessedModelBuilder、TimestampProcessedRecordBuilder 这两个类,分别创建 MyModelBuilder、MyRecordBuilder

2:覆盖父类的 build(...) 方法,在里头添加 if 判断,处理一下 oracle 返回的 BigDeciaml 类型

3:在做的时候需要在 build 方法中添加断点,看看 BigDecimal 类型出来的时候,if 判断中的类型应该与 Types 中的那个能对应上

2020-03-19 22:24

可能是 cglib-nodep 这个依赖的版本不支持 JDK 13,升级一下到最新版本试试:
https://mvnrepository.com/artifact/cglib/cglib-nodep/3.3.0

2020-03-19 17:42

常见的具体原因有:
1:在调用完一个 action 以后又调用了 forwardAction (...) 再次请求某个 action
2:拦截器内改变调用流程
3:tomcat 与 undertow 自做主张做了 302 重定向:
https://www.oschina.net/question/816381_108867
https://www.oschina.net/question/941098_93842

2020-03-19 16:56

历史上有很多人碰到过这种问题

最后的本质原因找到了,只有一个: 确实是因为发送了两次请求

具体到不同的人,发两次请求的方式不同,我举一个最罕见的例子:
在五六年前有一位同学是因为 html 中的 img 标签中的 src="", 而这个 src 为空字符串的值居然在 IE 浏览器中会自动发送一次请求,外加用户手动请求的一次,一共两次

不同的人可能会用不同的方式触发了两次请求,但有一点可以肯定:绝对不要在 jfinal 上找原因,jfinal 绝对不可能自发请求两次

解决问题的具体办法是:
1:在后台代码找原因:在被请求的地方设置断点,查看请求调用栈
2:在前端代码找原因:打开浏览器的开发者工具,进入 network 栏,查看发送请求的次数