升级希望能尽可能兼容原来的方法

   升级到3.1了,马上试用,发现了问题。只能还原3.0.

3.1更新日志:

                8:Model.getSql() 方法去除内部对 this.attrs 值的传递,避免对于dao对象的误用


不是很理解上面的方法,我觉得可以兼容上面的方法,不要取消,否则改动太大。而且发现个问题:

比如DB.update()方法,他只能传数组参数。而我在外部sql文件是如下写的:

#sql("deleteRMPByRoleIdByBatch")

delete from role_menu_permission where roleId in

(

#for(roleId:roleIds)

#(for.index>0?",":"")#(roleId)

#end

)

#end

roleId以前是通过Map参数传进来的,现在就无法写了。


当然升级后短短试用发现分页功能加强了很好。


评论区

JFinal

2017-05-25 18:12

3.0 版本中的 Model.getSql(key) 方法内部传入 this.attrs 的用法,完全可以被 3.1 版本的下面方法来代替:
SqlPara sqlPara = Model.getSqlPara(key, this);

在查询的时候这样:
model.find(sqlPara);

所以升级的改动其实很小,而且必然可以升级,就是添加一个 this 参,然后 String 接收参数改为 SqlPara 接收参数,查询时直接扔 SqlPara 对象进去

而老版本 3.0 得到的是一个 String 型的 sql,在查询的时候这样仍然要传入参数:
model.find(sql, p1, p2, ..., pn);
可见老版本的用法并不比新版本简洁,新版本的 getSqlPara 方法功能还更加灵活强大,见下面的说明

新版本的用法有如下好处:
1:避免了 find(sql, p1, p2, ..., pn) 时传参,而是直接在 getSqlPara 时传参,因为在 getSqlPara 时传参功能更加灵活与强大,例如支持 #para(int) 的用法
2:避免了 dao 对象的线程安全问题
3:避免 Model、Db 中的 getSql(...) 系列方法数量的膨胀
4:还有其它一些好处,刚刚被一些事情打断,一时忘记了

JFinal

2017-05-25 18:14

Db.update 是忘了添加 Db.update(SqlPara) 了,但你仍然可以传入 Map 的方式去使用,不一定要传入数组参数,用法如下:
SqlPara sp = Db.getSqlPara(key, map参在这里);
Db.update(sp.getSql(), sp.getParas());

新版本的 jfinal 3.2 已添加了 Db.update(sqlPara)

JFinal

2017-05-25 18:16

强烈建议升到 jfinal 3.1,用我上面介绍的办法升级是分分钟的事情,搞定后别忘了回来分享一下

总结起来就一句:用 getSqlPara(..) 代替你原来需要传参的 getSql(...),得到 SqlPara 参数以后,直接扔给 find(...) paginate(...) 系列的方法,对于 update 方法,可以这样:Db.update(sqlPara.getSql(), sqlPara.getPara())

JFinal

2017-05-25 18:29

想起来一点点,再补充一下:以前 3.0 版本的用法,getSql(...) 可传入 Map、Model 参数,例如:
String sql = Db.getSql(key, map);
Db.find(sql, p1, p2, ..., pn)
也就是说,老用法通常要传两次参数,一次用于生成 sql,一次用于查询,在查询时用纯 sql 的情况非常少,通常是需要 Object... paras 参数的

而 3.1 之所以会去掉 getSql(...) 对于 Map、Model 的参数支持,是因为使用 getSqlPara(...) 只需要传一次参数,即可完成生成 sql,以及 para 的构建,例如:
SqlPara sp = Db.getSqlPara(key, map);
Db.find(sp);
以上用法,只需要传入一个 map 就可以构建 sql 与其 Object... paras,所以是 3.1 鼓励的用法

通过对比, 3.1 的用法明显比 3.0 的用法简单快捷,而且 3.1 的用法可完全覆盖掉 3.0 的功能,升级起来也很容易

此外,3.1 的用法还能避免掉 3.0 的线程安全问题,一举多得。在这个问题的设计上是经过极为深入的考虑与实践的。建议你在升级到 3.1 的时候,再多走那么一小步,会发现新用法非常好用

zan7755

2017-05-26 09:12

@JFinal 非常感谢您回复的这么清楚,这个问题解决了。但是前台展示还有2个不清楚的地方可能需要麻烦解答下。

1:我要默认选中一个checkbox。最开始的写法是:
但这种没作用,加双引号也一样。最后只能改成稍微麻烦的写法。

#if(x.sex==1)








#else








#end

2:select我设置了name="roleId" 当前是用user对象接收的。roleId不是user表的字段。

User model = getModel(User.class, "", true);
model.get("roleId")取到的是null.

然后我换了种方法,在user里定义了一个变量 private Integer roleId.
用Integer roleId = model.get("roleId"); 发现也是null。

是我哪里写的有问题吗?那该如何接收。

zan7755

2017-05-26 09:14

标签怎么没看见了。是过滤了吗。。
上面那个checkbox最开始的写法是这样的。
input name="sex" type="radio" id="sex-1" #(x.sex==1)??'checked'

改成了麻烦的#if(x.sex==1) #else #end 等于是复制了一套然后分别加上checked

zan7755

2017-05-26 09:19

上面那写错了点.

然后我换了种方法,在user里定义了一个变量 private Integer roleId.
用Integer roleId = model.getRoleId() 发现也是null。

JFinal

2017-05-26 11:01

getModel、getBean 能正常工作的前提是你在页面中的 name=xxx 的值与 model 中的字段对应上,或者与 bean 中的 setter 方法对得上

这个问题与你是否有 private Integer roldIe 完全无关,这个属性定义是完全不需要的,如果是 getBean 的话,只与你的 setter 方法有关

模板中的使用有误,应该是: #(x.sex == 1 ? "checked" : ""),用个三元表达式即可,建议多看看 jfinal 手册,都是些基本的用法

zan7755

2017-05-26 21:43

@JFinal ok了。谢谢

热门反馈

扫码入社