sql 语句中#P()与?的各自作用域区别

select id,name,mobile,sex,duties from ssm_center_admin where id = #p(id)

select count(*) from ssm_center_admin where bid = ?


评论区

JFinal

2019-10-26 10:44

#p 与 #para 指令最终会生成一个问号字符,例如:
select id,name,mobile,sex,duties from ssm_center_admin where id = #p(id)
最终生成值为:
select id,name,mobile,sex,duties from ssm_center_admin where id = ?

#p 与 #para 在生成问号占位字符的同时,将其参数值放入链表中,具体看一下 jfinal 文档:
https://www.jfinal.com/doc/5-13

柳志龙

2019-10-26 17:01

在sql语句中使用#P()和?有区别么?在controller中分别怎样使用@JFinal

JFinal

2019-10-26 17:10

@柳志龙 使用 #p 与 ? 生成的最终 sql 是完全一样的,区别在于:
#p 指令在生成问号的同时,会向 SqlPara 对象中的 List paraList 中追加生成的问号所对应的参数值

也就是说 #p 指令能处理参数

例如如下的 sql 模板:
#sql("test")
select * from t where id = #p(id)
#end

java 代码获取:
SqlPara sqlPara = Db.getSqlPara("test", Kv.by("id", 123));
String sql = sqlPara.getSql();
Object[] para = sqlPara.getPara();

上面的代码中,变量 sql 的值为:
select * from t where id = ?
也就是说 #p 指令处永远是生成一个问号

para 中的值为数组:[123]

上面的 sqlPara 对象,可以用于 jfinal 的一系列的数据库操作 API,例如:
Db.find(sqlPara.getSql(), sqlPara.getPara())

因为jfinal 的数据库 API 在设计上都是 String sql + Object para[] 的形式

JFinal

2019-10-26 17:15

补充,由于 SqlPara 中的 sql + para 可以用于大多数 jfinal 的数据库 API,所以 jfinal 添加了直接接受 SqlPara 类型的 API,例如:
Db.find(sqlPara);

实际使用的时候一般这样:
Kv kv = Kv.by("id", 123);
Db.find( Db.getSqlPara("test", kv));

为了进一步节省代码量,jfinal 后来的版本为了进一步消除 Db.getSqlPara() 的使用,又添加了 template 方法,用法:
Db.template("test", kv).find();

具体多看看文档:
https://www.jfinal.com/doc/5-13

JFinal

2019-10-26 17:16

最后,有些同学希望能够在 java 代码中使用 sql 模板,而不是在外部文件中使用,所以 jfinal 添加了 templateByString 方法,例如:
String sqlTemplate = "select * from t where id = #p(id)";
Kv kv = Kv.by("id", 123);
Db.templateByString( sqlTemplate, kv ).find();

柳志龙

2019-10-26 17:43

@JFinal 好的,明白了谢谢指导

JFinal

2019-10-26 17:44

@柳志龙 用上一两次就彻底掌握了,#para 指令的规则就两个:
1:生成问号
2:将问号所代表的参数值放入数组

热门反馈

扫码入社