在JAVA類里使用SQL語句,應遵循如下規范:

1、 只使用Q、DAO、DAOSet來操作數據,禁止使用JDBC直接操作數據庫。

  這三種方式都經過優化和兼容性調試,能夠同時支持多種數據,還支持讀寫分離等特性。

  這三種方式不需要手工管理JDBC連接。

2、 在產品代碼中禁止使用只在某個數據庫中支持的數據類型、函數、SQL語法。但在數據庫類型已經確定的項目中允許使用該數據庫特有的寫法。

  這是因為所有產品都被設計成同時兼容多種數據庫。

3、 所有參數都應該使用和字段類型一致的變量。

  這是因為有些數據庫不支持參數類型的轉換,例如Sybase。還有一些數據庫在參數類型和字段不匹配時不會使用索引。例如:

  q.append(" and ID=?",$V("ID"))不正確,應該是q.append(" and ID=?",Request.getLong("ID"))或者是q.append(" and ID=?",$L("ID"))。其中$L是取long型的意思。

  另外$I()取integer型,$F()取float,$D()取double,$B()取boolean。

  這些方法會自動將請求參數中的值轉換成相應的類型,如果值不存在,則返回類型的默認值(boolean是false,其他的為0)。

4、 凡是使用in子句的都必須使用Q.in()方法,禁止使用字符串相加的方式構造in子句,例如:

  q.append(" and id in ("+ids+")")是不被允許的,正確的用法應該是q.and().in("ID",ids)

  Q.in()支持字符串(以逗號分隔的一組值)和集合實例。

5、 禁止使用String相加或StringBuilder的方式構造SQL語句。

  這兩種方式都可能造成SQL注入漏洞。

6、 凡是like語句,建議都使用Q.like(),Q.likeRight(),Q.likeLeft(),以避免字符串相加。例如:

  q.append(" and InnerCodelike ?",innerCode+"%")可寫成q.and().likeRight("InnerCode",innerCode)

  q.append(" and Title ?","%"+title+"%")可寫成q.and().like("Title",title)

7、 SQL語句中的關鍵字都小寫,字段名保持和zdm文件中一致(即按首字母大寫的駝峰寫法)。例如:

  Q q  = new Q("SELECT id FROM zccontent")不允許,應該為Q q = new Q("select ID from ZCContent")

8、 SQL語句中不允許有一個以上的連續空格。