飛叔開場吐槽:不是所有號稱JDBC的驅動都支持JDBC的功能,比如你在用SqliteJDBC,那麼本文和你無緣了。PS,那個也不是SQLite的官方驅動。
在JDBC的使用中,可以在SQL語句中混搭JDBC專用的轉義語法,從而避開各SQL平台之間的語法差異,提高代碼的通用性。
時間和日期:
{d '2011-8-22'}
{t '16:21:54'}
{ts '2011-8-23 17:23:24'}
標量函數:
{fn left(?, 20)}
{fn user()}
常見的標量函數包括:
數值函數(省略了大量的三角函數)
-
abs(number)
- ceiling/floor(number)
-
mod(intX, intY)
-
rand(seed)
-
sign(number): 正數返回1,負數-1,零返回0
-
sqrt(floating)
字符串函數
- concat(str1, str2...)
- lcase/ucase(str)
- length(str)
- locate(str, token [, startIndex]):從startIndex開始在str中查找token
- ltrim/rtrim(str)
- substring(str, startIndex, length)
時間函數
- curdate()
- curtime()
- year/month/hour/minute/second(timeExpression)
- TIMESTAMPADD(interval, num, timestamp),向timestamp加上num個interval
- TIMESTAMPDIFF(interval, ts1, ts2): 比較兩個timestamp相差多少個interval
interval包括:SQL_TSI_ + DAY/FRAC_SECOND/HOUR/MINUTE/MONTH/QUARTER/SECOND/WEEK/YEAR
系統函數
- user()
飛叔吐槽
:本來麼JDBC的SQLite轉義就是為了提高代碼的通用性,但是每個數據庫的Vendor都喜歡在裡面加上自己的創造,如果你用了那些“特有”的函數,恭喜你,留在那個平台吧。最別具一格的JDBC驅動莫過於微軟的sqlserver驅動,從metadata到函數都與眾不同,嚴重鄙視之。

存儲過程:
{call PROC1(?, ?)}
{call PROC2}
{call ? = PROC3}
匹配特殊字符:
LIKE '%!_%' {escape '!'}
注:CoreJava中的示例是 WHERE ? LIKE %!_% {escape '!'},缺少引號應該是個錯誤。另外,LIKE的前置參數用法並不合理,因為,這意味著在數據庫端比較兩個在客戶端就已經明確的字符串,毫無意義,應該把這個WHERE子句直接在外部處理。