`
ihuashao
  • 浏览: 4745077 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

使SQL/HQL/JDOQL更容易编写与重用(上)

阅读更多

无论用什么ORM方案,查询语句总还要写的,"如何让它容易写些"怎么也不outdate.
什么样的SQL最好看好写呢? 我觉得一段有着良好分行与缩进,中间没有太多+号或者java代码这类杂质的就已经是很好的了。

可实际情况是,当查询复杂时,上面的要求很少达到。

1.最倒霉的程序员会看到什么呢?他会看到一堆拼接SQL的API, 如Hibernate的Critertal
或者Team里的天才主力为了对付那些烦人的分号和"And "而写的SQL Builder类。
但是,对于人这种高智慧生物来讲,理解一段DSL语言要比读懂一组API容易得多(当然,对于机器来说刚好调转),这也就是为什么当初全世界一起设计的是一组SQL语言标准,而不是一套查询API了。
所以,我觉得API式的方案只在非常机械,同时复杂度又不高的动态环境里才适合使用。


即使没那么倒霉,有些麻烦还是逃不掉......

2. SQL经过复杂拼接,读程序很难再把握其全貌与来龙去脉
有时是为了根据用户的输入与选择而动态输入SQL。
更多时候是为了SQL的重用(鉴于SQL代码比java代码还要难读难改,而且没有refactor工具,SQL达到最大重用,尽量减少duplicate是对日后维护人员的最大恩赐),少不了非常多的SQL拼接。

有些拼接是几个String变量眼花聊乱的相加,有些还封装到不同函数里。
这时程序员只有在最后一刻把组装好的sql打印出来并把它重新格式化一遍,才可能是了解它的意义,否则单靠那些字符串变量和函数上的似通非通的注释,除了原作者,其他人好难明白它的意思。

另外还有两样麻烦事情逃不掉就是:

3.如果用Prepared statement,?号一多,想对号入座就很困难
如果有什么修改就更会引发雪崩般的恐怖。如果不用prepared satement,直接在把值写在SQL里,一方面性能上可能对不起用户,另一方面N多+号和双引号也让写的读的人很不爽。

4.还有就是SQL的对齐缩进换行
因为Java的String 不支持Mutli-line,连J2SE5.0也做不到这点,(Groovy倒是支持了),每换一行就要写上一些+号和双引号,如果SQL是一气呵成的倒没什么,如果是要反复修改时,不停维护这些+号和双引号就有点烦了。
(还有一些更无聊的人,在根本不是瓶颈的地方追求效率,用到stringBuffer.append(),和DB查询相比这根本实在微不足道啊)

所以,我们无论是用JDBC还是Hibernate,JDO,都可以在上面作一个处理查询语言的小框架(一千几百行就够了),多少消除一点上面提及的不便。

让框架做点事情使SQL/HQL/JDOQL更容易写一些(下)

分享到:
评论
2 楼 Klingon 2011-12-06  
Klingon 写道
LZ这么有思想的文章,竟然没人顶。

我可要“盗”到我的博客里去了
1 楼 Klingon 2011-12-06  
LZ这么有思想的文章,竟然没人顶。

相关推荐

    SSh sql/hql 分页

    ### SSh sql/hql 分页知识点解析 #### 一、概览 在软件开发中,分页是一项常用的技术,尤其在网络应用中为了提高用户体验及减轻服务器压力,分页功能尤为重要。Struts2 + Spring + Hibernate(简称SSH)是Java Web...

    sql转换hql工具

    之前写好SQL,再到代码里面来写,语句复杂的看的时不时细节会忘记,用sql转换hql工具,直接贴近了就可以了;

    sql-beautify:美化SQL(HQL)的VS代码扩展

    grinning_face:格式化你杂乱无章的sql/hql代码:grinning_face: VS Code extension that beautifies SQL(HQL).:camera_with_flash: 安装 Installation:light_bulb: 注意 Attention这个插件在hql语句上更加兼容,因为...

    Hibernate_NSQL&HQL增删改操作

    ### Hibernate中的NSQL与HQL增删改操作详解 #### NSQL(Native SQL)与HQL(Hibernate Query Language) 在Hibernate框架中,进行数据库操作时,开发者可以选择使用两种不同的查询语言:NSQL(Native SQL)和HQL...

    HQL与SQL的区别

    本文将深入探讨HQL与SQL之间的区别,帮助读者更好地理解两者的特点及适用场景。 ### HQL与SQL的基本概念 **SQL** 是一种标准化的数据库查询语言,广泛用于关系型数据库管理系统(RDBMS),如MySQL、Oracle、SQL ...

    java查询源码-JNomad:扫描Java源代码以进行数据库查询(SQL/HQL),并根据查询的使用情况推荐可能的表索引

    java查询原始码Java源代码查询扫描器/索引建议 JNomad是一种用于扫描Java源代码库以进行HQL / SQL查询的实用程序,然后将其作为对PostgreSQL / MySQL数据库的解释语句来运行,以确定效率最高的查询和索引。 下载 ...

    监控sql输出-可以查看hql转成sql的结果值

    HQL是Hibernate框架提供的面向对象的查询语言,它允许开发者以Java类和对象的方式来编写查询,而不是直接写SQL。HQL将这些面向对象的查询转换为对应数据库系统的SQL语句,以实现与各种数据库的兼容。这个过程通常是...

    HQL语句 HQL语句

    HQL语句 HQL语句 HQL语句 HQL语句 HQL语句

    HQL Eclipse Plugins 配置教程

    不喜欢使用myEclipse的朋友可以尝试下 最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。...工具很好用,可以识别出HQL文的语法正确,并且解析为标准SQL语句。

    SQL、Hive SQL等SQL血缘解析工具

    // 具有子查询的sql String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = ...

    JPA--HQL查询(手动写原生查询sql,复杂查询必备).pdf

    JPA--HQL查询(手动写原生查询sql,复杂查询必备) JPA(Java Persistence API)是一种JavaEE标准,用于持久化数据,HQL(Hibernate Query Language)是 Hibernate 框架提供的一种查询语言,它允许开发者使用面向...

    hql开窗函数.sql

    hql开窗函数.sql

    HQL语句查询

    HQL语句查询

    HQL批量插入、更新和删除

    HQL是Hibernate框架中的一个核心特性,它允许开发者以面向对象的方式编写查询语句,从而简化了数据库操作过程。 #### 二、HQL批量插入 在批量插入数据时,需要注意内存管理问题。如果一次性插入大量数据,可能会...

    HQL语句详解Select/update/deletefromwhere...

    在探讨HQL(Hibernate Query Language)时,我们首先要了解它是一种用于Hibernate框架中的查询语言,其语法结构与标准SQL查询语言非常相似,但又针对对象关系映射(ORM)进行了优化。本文将详细介绍HQL的基本用法...

    HQL与SQL的区别[文].pdf

    HQL与SQL的区别 HQL(Hibernate Query Language)是一种基于对象的查询语言,主要用于 Hibernate 框架中对数据库的查询操作。与 SQL 相比,HQL 的查询方式和语法都有所不同。 首先,HQL 的查询目标是对象,而不是...

    精通HQL(word格式)

    2. **移植性**:由于是面向对象的,HQL与具体的数据库方言解耦,使得应用更容易跨数据库迁移。 3. **自动类型转换**:HQL自动处理Java对象与数据库值之间的类型转换。 4. **对象导航**:通过对象关系,HQL可以方便地...

    Hibernate中的查询:HQL、Criteria、原生SQl

    HQL适用于大多数常规查询,其面向对象的特性使代码更易于理解。Criteria API则提供了更动态的查询构造能力。而原生SQL则在处理特定数据库特性和性能优化时不可或缺。选择哪种查询方式,应根据项目需求和实际情况进行...

    HQL语句大全HQL语句大全

    HQL语法接近于SQL但又有所不同,它允许开发者以面向对象的方式来表达查询逻辑,使得查询更加直观且易于理解。 #### 二、HQL的基本用法 1. **获取Hibernate Session** - 在执行任何HQL查询之前,首先需要通过`...

Global site tag (gtag.js) - Google Analytics