在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语句中不允许有一个以上的连续空格。