本節(jié)學(xué)習(xí)目標(biāo)主要是使用JFinal中自帶的Template Engin來(lái)實(shí)現(xiàn)對(duì)sql的管理队询。JFinal中為sql管理提供了3個(gè)指令#sql、#para构诚、#namespace,來(lái)增強(qiáng)sql功能蚌斩。
一、兵馬未動(dòng)范嘱,糧草先行
1送膳、預(yù)定義sql模板
使用#sql指令和#end指令可以完成對(duì)sql模板的定義。#sql指令接收一個(gè)string類(lèi)型的參數(shù)丑蛤,用來(lái)作為該sql的唯一標(biāo)識(shí)叠聋。下面我們來(lái)一起寫(xiě)一條簡(jiǎn)單的sql語(yǔ)句,代碼如下受裹。
#sql("findUserList")
select * from t_user where id = ?
#end
在web工程中新建一個(gè)sql文件夾碌补,爾后創(chuàng)建一個(gè)demo.sql的文件,寫(xiě)入上述代碼棉饶。當(dāng)然sql文件的存放位置你可以根據(jù)自身工程的實(shí)際情況自行調(diào)整厦章,這里僅做最簡(jiǎn)單的演示。
需要注意的地方有兩點(diǎn)照藻,第一我們使用#sql指令定義了一條名字(ID)叫findUserList的模板sql袜啃;第二在sql中使用了?占位符替代了實(shí)際傳入?yún)?shù)岩梳。
2囊骤、驗(yàn)證sql的有效性
根據(jù)第一步中的操作,我們已經(jīng)定義了一個(gè)sql模板冀值,接下來(lái)看看如何將剛才定義的sql在程序中運(yùn)行也物。其實(shí)很簡(jiǎn)單,代碼如下:
public void index(){
//獲取預(yù)定義的sql列疗,這里使用Db.getSql方法
String sql = Db.getSql("findUserList");
//執(zhí)行查詢方法滑蚯,查找id=3的數(shù)據(jù),最后輸出到頁(yè)面
renderJson(Db.find(sql,3));
}
執(zhí)行查詢后的輸出結(jié)果抵栈,如下圖:
注意:其實(shí)這里還不能正確輸出查詢結(jié)果告材,因?yàn)檫€有一點(diǎn)配置沒(méi)處理,別著急接著往下看古劲。
3斥赋、欲用sql模板,必要配置
在插件配置這里其實(shí)只要關(guān)心和sql相關(guān)的兩行代碼就行产艾。第一行代碼是:arp.setBaseSqlTemplatePath()用于設(shè)置sql文件的存放路徑疤剑;第二行代碼是: arp.addSqlTemplate(),這行代碼的作用是添加外部sql模板文件滑绒。
/**
* 配置插件
*/
public void configPlugin(Plugins me) {
// 配置數(shù)據(jù)庫(kù)連接池插件
DruidPlugin druidPlugin = createDruidPlugin();
me.add(druidPlugin);
// 配置ActiveRecord插件
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
//設(shè)置sql文件的路徑
arp.setBaseSqlTemplatePath(PathKit.getWebRootPath()+"/sql");
//添加sql模板
arp.addSqlTemplate("/demo.sql");
// 所有映射在 MappingKit 中自動(dòng)化搞定
_MappingKit.mapping(arp);
me.add(arp);
}
4、遺漏的小尾巴隘膘,配置路由
熟悉JFinal的小伙伴其實(shí)可以自行開(kāi)車(chē)了疑故,為了照顧新朋友,這里還是重新介紹提一下Demo中的路由配置弯菊。
如果不配置路由纵势,會(huì)不明白http://localhost:8080/sql
是怎么回事。
//sql管理路由
me.add("/sql",SqlController.class,"/sql");
二管钳、看sql模板參數(shù)七十二變
讓#para指令嘚瑟起來(lái)钦铁,在原有的程序上講做一些修改。讓sql根據(jù)id和pwd來(lái)進(jìn)行組合查詢蹋嵌。
方式一
這樣的改造和之前使用育瓜?占位符效果是類(lèi)似的,老司機(jī)都懂的這是根據(jù)索引去獲取參數(shù)栽烂,缺點(diǎn)就是傳遞的參數(shù)位置不能錯(cuò)亂躏仇,否則會(huì)造成查詢結(jié)果的不正確。
#sql("findUserList")
select * from t_user where id = #para(0) and pwd=#para(1)
#end
先來(lái)看一下腺办,如何針對(duì)第一種方式進(jìn)行sql模板的調(diào)用焰手。
public void index(){
//根據(jù)標(biāo)識(shí)將參數(shù)封裝進(jìn)sql模板并返回完整的sql
SqlPara sqlpara=Db.getSqlPara("findUserList",3,345678);
//執(zhí)行查詢
Db.find(sqlpara);
//此處用作演示返回查詢結(jié)果
renderJson(Db.find(sqlpara));
}
方式二
個(gè)人也是比較喜歡KV的傳參,這樣不用在意參數(shù)的位置順序問(wèn)題怀喉。接下來(lái)要講的就是這種方式书妻,是不是很棒?來(lái)躬拢,走起躲履!
改造sql模板文件,代碼如下:
#sql("findUserList")
select * from t_user where id = #para(id) and pwd=#para(pwd)
#end
第二種方式的sql調(diào)用方法:
//設(shè)置查詢參數(shù)
Kv cond= Kv.by("id", 1).set("pwd",345678);
//根據(jù)標(biāo)識(shí)將參數(shù)封裝進(jìn)sql模板并返回完整的sql
SqlPara sqlpara=Db.getSqlPara("findUserList",cond);
//執(zhí)行查詢
Db.find(sqlpara);
//此處用作演示返回查詢結(jié)果
renderJson(Db.find(sqlpara));
可以從以上使用方式中看出來(lái)聊闯,第二種方式多了一步單獨(dú)設(shè)置key和value綁定的操作工猜,其他的都一致。小伙伴們可以趕緊動(dòng)起來(lái)菱蔬,嘗嘗鮮篷帅。
PS:剩下的技能,會(huì)在下一節(jié)繼續(xù)介紹拴泌,敬請(qǐng)期待魏身。因?yàn)樗接邢蓿缬胁徽幷?qǐng)指正蚪腐。