本文介紹bboss 持久層sql語句中一維/多元數組類型變量、list變量、map變量、bean對象變量使用方法,該功能在bboss 3.5.2版本及後續版本提供。
很高興地告訴大家,bboss模闆sql中已經可以處理對象、數組、list、map類型的變量了,bboss 能夠快速分析出這些變量,并将sql語句轉換為預編譯sql語句執行。
先看一個處理數組的執行個體:
String[] FIELDNAMES = new String[]{"ss","testttt","sdds","insertOpreation","ss556"};
String deleteAllsql = "delete from LISTBEAN where FIELDNAME in (#[FIELDNAMES[0]],#[FIELDNAMES[1]],#[FIELDNAMES[2]],#[FIELDNAMES[3]],#[FIELDNAMES[4]])";
Map conditions = new HashMap();
conditions.put("FIELDNAMES", FIELDNAMES);
SQLExecutor.deleteBean(deleteAllsql, conditions);
變量格式由以前的#[aaa]擴充為以下幾種格式:
#[aaa] 簡單的變量屬性引用
#[aaa[0]] (一維數組中的第一個元素,或者list中的第一個元素,具體取決于aaa變量是一個數組還是list對象)
#[aaa[0][1]](二維數組中的第一次元的第二個個元素,或者list中的第一個元素的數第二個組元素或者list第第二個元素,具體取決于aaa變量是每一次元是數組還是list對象)
#[aaa[0][1]...](多元數組中的第一次元的第二個個元素的n維元素,或者list中的第一個元素的第二個數組元素或者list第二個元素的n維元素引用,具體取決于aaa變量是每一次元是數組還是list對象)
#[aaa[key]] 引用map對象aaa中key所對應的value資料,引用map元素的等價方法#[aaa->key]
#[aaa[key][0]] 引用map對象aaa中key所對應的value的第一個元素,取決于value的類型是數組還是list,等價引用方法#[aaa->key[0]]
#[aaa->bb] 如果aaa是一個bean對象,這個變量格式表示了對aaa對象的bb屬性的引用,如果aaa是一個map對象,這個變量格式表示了對aaa對象的key為bb的元素值引用
以上就是全部的類型,每種類型可以任意組合
以上就是全部的類型,每種類型可以任意組合,例如:
#[aaa->bb[0]]
#[aaa[0]->bb[0]]
#[aaa[0]->bb[0]->cc[keyname]]
#[aaa[0]->bb->cc[keyname]]
等等
下面在看幾個簡單的執行個體:
1.foreach處理數組的執行個體
java方法
public List<CandidateGroup> getGroupInfoByNames(String groups) {
try {
String[] groupnames = groups.split(",");
List<CandidateGroup> list = null;
if (groupnames.length > 0) {
Map<String, String[]> groups_ = new HashMap<String, String[]>();//定義包含變量的map對象,key為變量名稱,value為變量值
groups_.put("groups", groupnames);//将數組groupnames設定到map對象中,key為groups,我們在後面的foreach循環中會通過groups來引用groupnames中的每個資料
list = executor.queryListBean(CandidateGroup.class,
"selectGroupInfoByNames", groups_);//執行查詢
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
sql配置示例:
<property name="selectGroupInfoByNames">
<![CDATA[
select #foreach($filed in $groupfileds)
#if($velocityCount == 0)
$filed
#else
,$filed
#end
#end
from td_sm_group g where g.group_name in (
#foreach($group in $groups)
#if($velocityCount == 0)
#[groups[$velocityCount]]
#else
,#[groups[$velocityCount]]
#end
#end
) ]]>
</property>
需要注意的是,需要把resources/velocity.properties檔案相關配置項按照以下配置配置:
directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 0
說明:
directive.foreach.counter.name
用來定義foreach循環遞增變量名稱,通過velocity.properties檔案中全局指定這個變量名稱,預設為velocityCount,項目開發之初就要确定這個變量名稱,後續不能更改。
directive.foreach.counter.initial.value
用來定義循環變量velocityCount(名稱由directive.foreach.counter.name屬性指定)的初始值,預設從1開始,項目開發之初應将其調整為0
2.bean類型變量屬性引用處理執行個體
@Test
public void beanVariableTest() throws SQLException
{
/**
* 删除資料,資料條件由數組FIELDNAMES,這裡主要示範如果通過bean屬性引用變量文法擷取資料項
* 背景轉換為預編譯執行
*/
insertOpera();
BeanVariable beanvariable = new BeanVariable();
beanvariable.setBean(new Bean());
String deleteAllsql = "delete from LISTBEAN where FIELDNAME in (#[bean->fss],#[bean->ftestttt],#[bean->fsdds]," +
"#[bean->finsertOpreation],#[bean->fss556])";
SQLExecutor.deleteBean(deleteAllsql, beanvariable);
}
3.List類型變量元素引用處理執行個體
@Test
public void listVariableTest() throws SQLException
{
/**
* 删除資料,資料條件由list 對象FIELDNAMES提供,這裡主要示範如何通過list變量文法擷取資料項
* 背景轉換為預編譯執行
*/
insertOpera();
List<String> FIELDNAMES = new ArrayList<String>();
FIELDNAMES.add("ss");
FIELDNAMES.add("testttt");
FIELDNAMES.add("sdds");
FIELDNAMES.add("insertOpreation");
FIELDNAMES.add("ss556");
String deleteAllsql = "delete from LISTBEAN where FIELDNAME in (#[FIELDNAMES[0]],#[FIELDNAMES[1]],#[FIELDNAMES[2]],#[FIELDNAMES[3]],#[FIELDNAMES[4]])";
Map<String,List<String> > conditions = new HashMap<String,List<String> >();
conditions.put("FIELDNAMES", FIELDNAMES);
SQLExecutor.deleteBean(deleteAllsql, conditions);
}
4.Map類型變量元素引用處理執行個體
@Test
public void mapVariableTest() throws SQLException
{
/**
* 删除資料,資料條件由FIELDNAMES為名稱索引的map對象中,這裡主要示範如果通過map變量擷取資料項
* 背景轉換為預編譯執行
*/
insertOpera();
Map<String,String> datas = new HashMap<String,String>();
datas.put("sskey", "ss");
datas.put("testtttkey", "testttt");
datas.put("sddskey", "sdds");
datas.put("insertOpreationkey", "insertOpreation");
datas.put("ss556key", "ss556");
String deleteAllsql = "delete from LISTBEAN where FIELDNAME in " +
"(#[FIELDNAMES[sskey]],#[FIELDNAMES[testtttkey]],#[FIELDNAMES[sddskey]],#[FIELDNAMES[insertOpreationkey]]," +
"#[FIELDNAMES[ss556key]])";
Map conditions = new HashMap();
conditions.put("FIELDNAMES", datas);
SQLExecutor.deleteBean(deleteAllsql, conditions);
}
最新版本源碼可以到github中下載下傳,下載下傳位址如下:
https://github.com/bbossgroups/bbossgroups-3.5源碼建構方法請參考文章:
bboss 版本ant建構方法