让框架做点事情使SQL/HQL/JDOQL更容易写一些(上)
这篇讨论那个存在于普通SQL/HQL语句 与 JDBC/HIbernate之间的,一千几百行代码量的SQL处理层怎么写。
开源项目里,iBATIS这个以SQL为基础的ORM方案可以参考,另外还有它的新竞争对手ORBroker,后生可畏、后发制人,易用性方面走得更远。
1.针对SQL的换行和对齐,无非就是把它写到XML里面
这样就可以不受Java String不能换行的鸟气了。
这时的问题就是,饱含逻辑的SQL代码被从业务类里面分离出来了,我又不是很喜欢。
还有一个未来的方案是用Groovy来写业务类,然后把它编译成Java类。可爱的Groovy支持
String sql = "select * from foo
where ....."
2.针对N多的?号参数,无非就是使用命名参数
//把sql编译成PreparedStatement, 并对属性赋值
String sql = "select * fromdandy where name=:name";
query.setParam("name","gigix");
做得好时,还应该支持内嵌的属性,解决属性同名的问题
String sql = "select * from dandy,pet where dandy.name =:dandy.name and pet.name=:pet.name"
query.setParam("dandy",gigix);
query.setParam("pet",pet);
最后, 还应该支持对象里全部属性的自动绑定,简化书写
//把gigix对象里的age,name属性自动绑定
String sql = "update dandy set age=:age where name=:name "
query.setObjectAsParams(gigix);
3. 解决拼接SQL(1)--优先使用Replace而非拼接SQL,把SQL的概貌反映出来
String sql = "select * from foo order by {{sortColumn}}";
....//条件判断语句
query.setReplace("sortColumn","code");
在整体的把握上, 要大大优于下面的迷宫阵法
String sql="select * from foo";
...//条件判断
sql+="order by code";
4.解决拼接SQL(2)--把可重用的SQL统一管理
依然是整体把握优于局部拼接的思想
对于可部分重用的SQL,现在的开发人员要不重用,完全Copy Paste,一旦要修改就改得山崩地裂
要不就是把重用和不重用的部分复杂拼贴,又摆一个迷宫阵法出来。
O/R Broker的做法值得参考:
<sql-statement id="getEmployees" result-object="Employee">
SELECT
*
FROM
Employee
<append-statement id-suffix="ById">
WHERE
EmployeeId = :id
</append-statement>
<append-statement id-suffix="BySalaryRange">
WHERE
Salary BETWEEN :lowSalary AND :highSalary
</append-statement>
</sql-statement>
然后你getEmployeesByID 和getEmployeesBySalaryRange可以返回不同的SQL
5.拼接SQL(3)--Velocity/Freemarker永远都是文本生成的好工具
Web页面生成也好,代码生成也好,Template Engine都被证明比pure java code好得多,否则大家怎么不个个去写Servelet呢,生成SQL当然也不例外。O/R Broker就有这个功能,聪明之处还在于,直接调用Velocity引擎就行了,不花自己一行代码。
<sql-statement id="getEmployee">
SELECT
EmployeeId,EmployeeName,Salary,
FROM
Employee
#if ($employee.id)
WHERE EmployeeId = :employee.id
#end
</sql-statement>
分享到:
相关推荐
SSH 分页的例子源代码 全~~ 代码很全面了适合新手借鉴。但不支持完全的抄袭自己写还是最快的学习办法。
之前写好SQL,再到代码里面来写,语句复杂的看的时不时细节会忘记,用sql转换hql工具,直接贴近了就可以了;
SQL Beautify:grinning_face:格式化你杂乱无章的sql/hql代码:grinning_face: VS Code extension that beautifies SQL(HQL).:camera_with_flash: 安装 Installation:light_bulb: 注意 Attention这个插件在hql语句上...
HQL与SQL的区别
java查询原始码Java源代码查询扫描器/索引建议 JNomad是一种用于扫描Java源代码库以进行HQL / SQL查询的实用程序,然后将其作为对PostgreSQL / MySQL数据库的解释语句来运行,以确定效率最高的查询和索引。 下载 ...
NSQL和HQL的简单操作
HQL语句 HQL语句 HQL语句 HQL语句 HQL语句
// 测试用例如下 // 设置元数据服务 Delegate.getDelegate().setMetaColumnService(new IMetaColumnService() { @Override public List<String> queryMetaColumn(String dbName, String tableName) { return ...
不喜欢使用myEclipse的朋友可以尝试下 最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。 由于MyEclipse是收费的,速度不是很理想。所以在网上找到了一个elipse插件 ...
hql开窗函数.sql
HQL语句查询
HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL语法入门学习HQL...
整理的HQL & SQL对比学习文档,程序员有用
之前也发了一个,这个包含之前的,还添加了hibernate对数据库操作的代码(注意:controller层两个QBC/SQLTest代码不能运行,只是写出了操作数据库的除了HQL的另外2种方式)。我发现现在还是有很多公司用hibernate+...
NULL 博文链接:https://heroxuan.iteye.com/blog/1074163
不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询...
hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全hql语句大全
HQL语句大全HQL语句大全HQL语句大全HQL语句大全HQL语句大全
Select/update/delete……from……where……groupby……having……orderby……asc/desc 其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。
Hql PPt Hql PPt