SqlMaker.docx
《SqlMaker.docx》由会员分享,可在线阅读,更多相关《SqlMaker.docx(13页珍藏版)》请在冰豆网上搜索。
SqlMaker
SQL读取工具SqlMaker使用说明
一,使用方法大致分为三步:
//Step1:
构造SqlMaker类型的对象,参数为要解析的原始SQL值
SqlMakermaker=newSqlMaker("SELECT*FROMemp");
//Step2:
设定maker的参数值,值分别为文件中绑定的变量名,传入的参数值,传入的参数类型
Integerempno=newInteger(7788);
maker.addArg("empno",empno,empno.getClass());
Stringjob="developer";
maker.addArg("job",job,job.getClass());
//Step3:
取得解析后的SQL值
maker.getSql();
其中Step2与Step3执行顺序不能颠倒――即全部参数设定完毕后才能执行getSql操作。
如下例会发生SqlArgumentOrderException异常。
//构造SqlMaker类型的对象,参数为要解析的原始SQL值
SqlMakermaker=newSqlMaker("SELECT*FROMemp");
//设定maker的参数值,值分别为文件中绑定的变量名,传入的参数值,传入的参数类型
Integerempno=newInteger(7788);
maker.addArg("empno",empno,empno.getClass());
//取得解析后的SQL值
maker.getSql();
//再次设定maker的参数值
Stringjob="developer";
//maker.addArg("job",job,job.getClass());因为SQL值已经解析完毕,再次设定参数值会发生异常。
二,使用举例
使用例1:
当然没有设定任何参数时,将返回原内容。
SqlMakermaker=newSqlMaker("SELECT*FROMemp");
maker.getSql()返回值:
"SELECT*FROMemp";
使用例2:
当SQL后有分号时,自动删除
SqlMakermaker=newSqlMaker("SELECT*FROMemp;");
maker.getSql()返回值:
"SELECT*FROMemp";
使用例3:
当SQL后有制表符,空格,换行符时,自动删除
SqlMakermaker=newSqlMaker("SELECT*FROMemp;");
maker.getSql()返回值:
"SELECT*FROMemp";
使用例4:
当SQL注释内容不合法时,抛出异常
SqlMakermaker=newSqlMaker("SELECT*FROMemp/*hoge");
maker.getSql()抛出TokenNotClosedRuntimeException异常
使用例5:
当SQL有绑定变量时,设定的参数名要与读入的注释/*与*/之间的变量名相同,且变量名与注释之间不允许有空格
SqlMakermaker=newSqlMaker("SELECT*FROMempWHEREempno=/*empno*/1AND1=1");
Integerempno=newInteger(7788);
//将变量名直接替换成值7788
maker.addArg("empno",empno,empno.getClass());
maker.getSql()返回值:
"SELECT*FROMempWHEREempno=7788AND1=1";
使用例6:
当SQL有判断条件IF时会根据传入的参数值动态生成SQL
SqlMakermaker=newSqlMaker("
SELECT*FROMemp
/*IFjob!
=null*/
WHEREjob=/*job*/'XXX'
/*END*/
");
Integerempno=newInteger(7788);
maker.addArg("empno",empno,empno.getClass());
maker.getSql()返回值:
"SELECT*FROMempWHEREjob=7788";
使用例7:
当SQL有IF判断嵌套时
SqlMakermaker=newSqlMaker("
/*IFparam1!
=null*/
sql1
/*IFparam2!
=null*/
sql2
/*END*/
/*END*/
");
例1:
未传入参数
maker.getSql()返回值:
"";
例2:
传入以下参数
maker.addArg("param1",null,String.class);
maker.addArg("param2","hoge",String.class);
maker.getSql()返回值:
"";
例3:
传入以下参数
maker.addArg("param1","value1",String.class);
maker.addArg("param2","value2",String.class);
maker.getSql()返回值:
"
sql1
sql2
";
例4:
传入以下参数
maker.addArg("param1","hoge",String.class);
maker.addArg("param2",null,String.class);
maker.getSql()返回值:
"
sql1
";
使用例8:
SQL有IF/ELSE判断时
SqlMakermaker=newSqlMaker("
SELECT*FROMempWHERE
/*IFjob!
=null*/
job=/*job*/'XXX'
--ELSE
jobisnull
/*END*/
");
例1:
未传入参数时:
maker.getSql()返回值:
"SELECT*FROMempWHEREjobisnull"
例2:
传入以下参数时:
Stringjob="developer";
maker.addArg("job",job,job.getClass());
maker.getSql()返回值:
"SELECT*FROMempWHEREjob='developer'"
使用例9:
SQL有false/true常量值时
SqlMakermaker=newSqlMaker("
/*IFfalse*/
aaa
--ELSE
bbb=/*bbb*/123
/*END*/
");
传入以下参数
Integerbbb=newInteger(1234);
maker.addArg("bbb",bbb,bbb.getClass());
maker.getSql()返回值:
"bbb=1234"
使用例10:
SQL有false/true常量嵌套时
SqlMakermaker=newSqlMaker("
/*IFfalse*/
aaa
--ELSE
bbb
/*IFfalse*/
ccc
--ELSE
ddd
/*END*/
/*END*/
");
未传参数:
maker.getSql()返回值:
"bbbddd"
使用例11:
SQL中IF/ELSE有/*BEGIN*/时,由于前面条件不满足所产生的多余AND会被自动清除
SqlMakermaker=newSqlMaker("
SELECT*FROMemp
/*BEGIN*/
WHERE
/*IFfalse*/
aaa
--ELSE
ANDdeptno=10
/*END*/
/*END*/
");
未传参数:
maker.getSql()返回值:
"SELECT*FROMempWHEREdeptno=10"
使用例12:
SQL中多个IF判断之外有/*BEGIN*/时
SqlMakermaker=newSqlMaker("
SELECT*FROMemp
/*BEGIN*/
WHERE
/*IFjob!
=null*/
job=/*job*/'XXX'
/*END*/
/*IFdeptno!
=null*/
ANDdeptno=/*deptno*/99
/*END*/
/*END*/
");
例1:
未传参数:
maker.getSql()返回值:
"SELECT*FROMemp"
例2:
传入以下参数
maker.addArg("job","developer",String.class);
maker.addArg("deptno",null,Integer.class);
maker.getSql()返回值:
"SELECT*FROMempWHEREjob='developer'"
例3:
传入以下参数
maker.addArg("job","developer",String.class);
maker.addArg("deptno",newInteger(20),Integer.class);
maker.getSql()返回值:
"SELECT*FROMempWHEREjob='developer'ANDdeptno=20"
例4:
传入以下参数
maker.addArg("job",null,String.class);
maker.addArg("deptno",newInteger(20),Integer.class);
maker.getSql()返回值:
"SELECT*FROMempWHEREdeptno=20"//AND被自动清除
使用例13:
SQL有BETWEEN…AND…时
SqlMakermaker=newSqlMaker("
/*BEGIN*/
WHERE
/*IFtrue*/
aaaBETWEEN/*beginno*/111AND/*endno*/999
/*END*/
/*END*/
");
传入以下参数:
maker.addArg("beginno",888,Integer.class);
maker.addArg("endno",999,Integer.class);
maker.getSql()返回值:
"WHEREaaaBETWEEN888AND999"
使用例14:
SQL有IN时,传入集合类型
SqlMakermaker=newSqlMaker("
SELECT*FROMemp
WHEREdeptnoIN/*deptnoList*/(10,20,30)
ORDERBYename
");
传入以下参数:
ListdeptnoList=newArrayList();
deptnoList.add(newInteger(100));
deptnoList.add(newInteger(200));
maker.addArg("deptnoList",deptnoList,List.class);
maker.getSql()返回值:
"SELECT*FROMempWHEREdeptnoIN(100,200)ORDERBYename"
即传入的集合类型会自动生成一个被括号包围的一览值。
使用例15:
SQL有IN时,,传入数组类型
SqlMakermaker=newSqlMaker("
SELECT*FROMemp
WHEREdeptnoIN/*deptnoList*/(10,20,30)
ORDERBYename
");
传入以下参数:
int[]deptnoArray={100,200};
maker.addArg("deptnoList",deptnoArray,deptnoArray.getClass());
maker.getSql()返回值:
"SELECT*FROMempWHEREdeptnoIN(100,200)ORDERBYename"
即传入的集合类型会自动生成一个被括号包围的一览值。
使用例16:
SQL有IN时,传入字符串数组
SqlMakermaker=newSqlMaker("
SELECT*
FROM
emp
WHERE
enameIN/*enames*/('AAAA','BBBB')
ANDjobIN/*jobs*/('CCCC','DDDD')
");
传入以下参数:
String[]enames={"SCOTT","MARY"};
String[]jobs={"ANALYST","FREE"};
maker.addArg("enames",enames,enames.getClass());
maker.addArg("jobs",jobs,jobs.getClass());
maker.getSql()返回值:
"SELECT*FROMempWHEREenameIN('SCOTT','MARY')ANDjobIN('ANALYST','FREE')"
使用例17:
SQL有问号参数时
SqlMakermaker=newSqlMaker("SELECT*FROMaWHEREsalBETWEEN?
AND?
");
传入以下参数:
maker.addArg("$1",newInteger(0),Integer.class);
maker.addArg("$2",newInteger(1000),Integer.class);
maker.getSql()返回值:
"SELECT*FROMaWHEREsalBETWEEN0AND1000"
使用例18:
SQL有绑定变量,问号参数两方时
SqlMakermaker=newSqlMaker("
SELECT
*
FROM
emp
WHERE
col1*col1*/
ANDcol2BETWEEN?
AND?
");
传入以下参数:
maker.addArg("col1",newInteger(600),Integer.class);
maker.addArg("$1",newInteger(0),Integer.class);
maker.addArg("$2",newInteger(1000),Integer.class);
maker.getSql()返回值:
"SELECT*FROMempWHEREcol1<600ANDcol2BETWEEN0AND1000"
使用例19:
SQL为插入语句时
SqlMakermaker=newSqlMaker("
INSERTINTOITEM(ID,NUM)VALUES(/*id*/1,/*num*/20)"
);
传入以下参数:
maker.addArg("id",newInteger(10),Integer.class);
maker.addArg("num",newInteger(20),Integer.class);
maker.getSql()返回值:
"INSERTINTOITEM(ID,NUM)VALUES(10,20)"
使用例20:
SQL为更新语句时
SqlMakermaker=newSqlMaker("
UPDATEITEMSETID=/*id*/1,NUM=/*num*/999)
");
传入以下参数:
maker.addArg("id",newInteger(10),Integer.class);
maker.addArg("num",newInteger(20),Integer.class);
maker.getSql()返回值:
"UPDATEITEMSETID=100,NUM=300"
使用例21:
SQL有注释时
SqlMakermaker=newSqlMaker("
SELECTAAA,BBB--UGO
FROMHOGEWHEREAAA=/*moge*/aaa
ANDFUGA=/*PIRO*/ccc
");
传入以下参数:
maker.addArg("moge","test1",Integer.class);
maker.addArg("PIRO","test2",Integer.class);
maker.getSql()返回值:
"SELECTAAA,BBB–UGO
FROMHOGEWHEREAAA='test1'
ANDFUGA=/*PIRO*/ccc"
此时PIRO因为两边有空格存在,并未被解析成绑定参数,而是原样被转变成注释内容。
使用例22:
SQL有HINT时
SqlMakermaker=newSqlMaker("
SELECT/*+INDEX(TABLE_NAMEINDEX_NAME)*/AAAFROMHOGE
");
maker.getSql()返回值:
"SELECT/*+INDEX(TABLE_NAMEINDEX_NAME)*/AAAFROMHOGE"
使用例23:
SQL的--注释中的问号[?
]会被自动删除
SqlMakermaker=newSqlMaker("
SELECTAAA
--comment?
?
?
?
--comment2?
?
?
FROMHOGE
");
maker.getSql()返回值:
"SELECTAAA
--comment
--comment2
FROMHOGE"
使用例24:
SQL的/**/注释中的问号[?
]会被自动删除
SqlMakermaker=newSqlMaker("
SELECTAAAFROMHOGEwhere
/*IFhoge!
=null*/
aa=/*fuga*/'gaga'
--ELSEbb=?
/*END*/
/*comment?
*/
");
传入以下参数:
maker.addArg("hoge","test1",String.class);
maker.addArg("fuga","test2",String.class);
maker.getSql()返回值:
"SELECTAAAFROMHOGEwhereaa='test2'/*comment*/"
使用例25:
SQL有问号参数且注释中有问号时
SqlMakermaker=newSqlMaker("SELECTAAAFROMHOGEwhereaa=?
--comment?
");
传入以下参数:
maker.addArg("$1",newInteger(100),Integer.class);
maker.getSql()返回值:
"SELECTAAAFROMHOGEwhereaa=100--comment"
问号参数被替换成传入的值,但注释中的问号被自己删除。