我们当前的项目不使用Hibernate(出于各种原因),我们使用Spring的SimpleJdbc支持来执行所有数据库操作.我们有一个实用程序类,它抽象所有CRUD操作,但使用自定义SQL查询执行复杂操作.
目前,我们的查询作为字符串常量存储在服务类本身中,并被提供给由SimpleJdbcTemplate执行的实用程序.我们陷入僵局,可读性必须与可维护性相平衡.类本身内部的SQL代码更易于维护,因为它驻留在使用它的代码中.另一方面,如果我们将这些查询存储在外部文件(平面或XML)中,与转义的java字符串语法相比,SQL本身将更具可读性.
有谁遇到过类似的问题?什么是良好的平衡?您在哪里将自定义SQL保留在项目中?
示例查询如下:
private static final String FIND_ALL_BY_CHEAPEST_AND_PRODUCT_IDS =
" FROM PRODUCT_SKU T \n" +
" JOIN \n" +
" ( \n" +
" SELECT S.PRODUCT_ID, \n" +
" MIN(S.ID) as minimum_id_for_price \n" +
" FROM PRODUCT_SKU S \n" +
" WHERE S.PRODUCT_ID IN (:productIds) \n" +
" GROUP BY S.PRODUCT_ID, S.SALE_PRICE \n" +
" ) FI ON (FI.PRODUCT_ID = T.PRODUCT_ID AND FI.minimum_id_for_price = T.ID) \n" +
" JOIN \n" +
" ( \n" +
" SELECT S.PRODUCT_ID, \n" …
Run Code Online (Sandbox Code Playgroud) 我们在Ubuntu 9.04上使用MySql 5.0.完整版是:5.0.75-0ubuntu10
我创建了一个测试数据库.并在其中的测试表.我从insert语句中看到以下输出:
mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test value(858147.11);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM test;
+-----------+
| floaty |
+-----------+
| 858147.12 |
+-----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
mySql中设置的比例/精度似乎有问题...或者我错过了什么?
更新:
找到我们插入的其中一个数字的边界,这里是代码:
mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
Query OK, 0 rows affected (0.03 sec)
mysql> insert into test value(131071.01);
Query OK, 1 row affected (0.01 sec)
mysql> …
Run Code Online (Sandbox Code Playgroud)