JDBC的SQL轉義

飛叔開場吐槽:不是所有號稱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子句直接在外部處理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值