让框架做点事情使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/hql 分页”的核心内容进行深入解析,帮助读者理解如何在SSH框架下实现分页功能。 #### 二、分页原理与实现机制 ##### 1. 分页基本概念 - **分页**:指将大量数据分成多个较小的数据集显示,...
之前写好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语句上...
### Hibernate中的NSQL与HQL增删改操作详解 #### NSQL(Native SQL)与HQL(Hibernate Query Language) 在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL...
本文将深入探讨HQL与SQL之间的区别,帮助读者更好地理解两者的特点及适用场景。 ### HQL与SQL的基本概念 **SQL** 是一种标准化的数据库查询语言,广泛用于关系型数据库管理系统(RDBMS),如MySQL、Oracle、SQL ...
java查询原始码Java源代码查询扫描器/索引建议 JNomad是一种用于扫描Java源代码库以进行HQL / SQL查询的实用程序,然后将其作为对PostgreSQL / MySQL数据库的解释语句来运行,以确定效率最高的查询和索引。 下载 ...
HQL是Hibernate框架提供的面向对象的查询语言,它允许开发者以Java类和对象的方式来编写查询,而不是直接写SQL。HQL将这些面向对象的查询转换为对应数据库系统的SQL语句,以实现与各种数据库的兼容。这个过程通常是...
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插件 ...
JPA--HQL查询(手动写原生查询sql,复杂查询必备) JPA(Java Persistence API)是一种JavaEE标准,用于持久化数据,HQL(Hibernate Query Language)是 Hibernate 框架提供的一种查询语言,它允许开发者使用面向...
虽然HQL提供了方便的语法糖,但在某些情况下,直接使用原生SQL可能更加高效。特别是在复杂的批量操作中,原生SQL能够提供更多的灵活性和控制力。 1. **原生SQL的优势**:直接使用原生SQL可以更好地控制查询细节,如...
hql开窗函数.sql
HQL语句查询
在探讨HQL(Hibernate Query Language)时,我们首先要了解它是一种用于Hibernate框架中的查询语言,其语法结构与标准SQL查询语言非常相似,但又针对对象关系映射(ORM)进行了优化。本文将详细介绍HQL的基本用法...
HQL与SQL的区别 HQL(Hibernate Query Language)是一种基于对象的查询语言,主要用于 Hibernate 框架中对数据库的查询操作。与 SQL 相比,HQL 的查询方式和语法都有所不同。 首先,HQL 的查询目标是对象,而不是...
2. **移植性**:由于是面向对象的,HQL与具体的数据库方言解耦,使得应用更容易跨数据库迁移。 3. **自动类型转换**:HQL自动处理Java对象与数据库值之间的类型转换。 4. **对象导航**:通过对象关系,HQL可以方便地...
HQL适用于大多数常规查询,其面向对象的特性使代码更易于理解。Criteria API则提供了更动态的查询构造能力。而原生SQL则在处理特定数据库特性和性能优化时不可或缺。选择哪种查询方式,应根据项目需求和实际情况进行...
HQL语法接近于SQL但又有所不同,它允许开发者以面向对象的方式来表达查询逻辑,使得查询更加直观且易于理解。 #### 二、HQL的基本用法 1. **获取Hibernate Session** - 在执行任何HQL查询之前,首先需要通过`...