`
zhongxuchen
  • 浏览: 33325 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

数据库动态查询最佳实现

阅读更多

上次发表过这样的介绍,可能是我介绍的不够准确,太多人都没有搞明白(挺郁闷,当然也请大家将文章能够看的仔细点,主要是提供针对hibernate查询不足的弥补(当然这种做法并不局限于hibernate,事实上是针对所有涉及数据库查询的一个非常好的解决办法,这里且拿hibernate说事),简单的查询可以不考虑如:User user=(User)this.getHibernateTemplate().get(User.class,id); this.getHibernateTemplate().find("from User where enable=?","") ,这些大家其实都差不多,还有就是hibernate的条件查询Criteria很多人都会就不特别说了)。

还是开门见山,本文所要介绍的是针对数据库查询(当然要是ldap什么的基于查询指令的都适用),其目的在于将sql跟代码进行分离,同时能够保持sql或hql语句的

结构完整性(写sql的步骤一般是:在数据库客户端整理好sql并排版好放到代码中用stringbuffer拼起来,要是修改就痛苦了,还得调试代码得到整个语句),请好好看上面红色字的内容,平时是不是这样做的?如果是你就接着看下面的内容,对你帮助很大!

我们有很多时候数据库查询是由多个条件组合而成,但究竟是哪个条件是不确定的

展示一下效果:

 提示一下,本功能支持hql查询如(对于hql优点主要体现在查询条件不固定时,hql写法非常优雅):

 <sql-query name="hr_searchOrganInfo">
  <![CDATA[
  from HrOrganInfo
  where 1=1
  #[and createDate>=? and createDate<=?]
  #[and ORGAN_NO like ?]
  #[and ORGAN_NAME like ?]
  #[and IS_ACTIVE=?]
 ]]>
 </sql-query>


 

本功能最大的优点在于动态查询条件时hql或sql的写法非常的优雅,结构完整!
 调用方法:

   sql语句可以是

   select * from t where t.name=:name and t.createDate>:createDate 不一定是?号,以解除使用者需要记住参数顺序

的烦恼。

1、分页调用

    通过反调映射到对象

    PaginationModel findPageByJdbc(final String sqlOrNamedSql,
   final String[] paramsNamed, final Object[] paramsObj,
   final PaginationModel paginationModel,
   final RowCallbackHandler rowCallbackHandler);

   

   直接返回数据库结果结合,不映射对象

   PaginationModel findPageByJdbc(final String sqlOrNamedSql,
   final String[] paramsNamed, final Object[] paramsObj,
   final PaginationModel paginationModel);

 

 

   直接转VO式调用

    PaginationModel findPageByJdbc(final String sqlOrNamedSql,
   final String[] paramsNamed, final Object[] paramsObj,
   final PaginationModel paginationModel, final Class voClass);

2、非分页反调方式

   直接数据库数据集合返回

   List findByJdbcQuery(final String sqlOrNamedSql,
   final String[] paramsNamed, final Object[] paramsValue);

 通过反调映射到对象

   List findByJdbcQuery(final String sqlOrNamedSql,
   final String[] paramsNamed, final Object[] paramsValue,
   final RowCallbackHandler rowCallHandler)

  直接转VO对象调用

   List findByJdbcQuery(final String sqlOrNamedSql,
   final String[] paramsNamed, final Object[] paramsValue,
   final Class voClass)

 hql的调用差不多:findByhql 或findPageByhql,参数当然就没有voClass和RowCallbackHandler了,因为hql返回的就是对象集合!

 

 

 工作机理很简单,就是通过判断参数是否为null(结合sql特性如is null)对sql语句进行重新整理,后台提供了convertSqlParams功能将特定值转为null

this.findPageByJdbc("hr_getOrganInfoByNo", null,new Object[] { organNO,this.convertSqlParams(status,"-1")}, pageModel,OrganInfoVO.class);

提供java反射器直接映射成VO,也提供了RowCallbackHandler通过反调方式生成VO,当然voClass和RowCallbackHandler都为null,就直接返回数组集合!

 

 

 

  • 大小: 69.1 KB
分享到:
评论
6 楼 longrui 2009-03-27  
请问动态表名如何实现?
5 楼 zhongxuchen 2009-03-27  
MakeLove 写道
黄婆的厉害

哈哈,实事求是而已!再就是想把这种思想推荐给大家的心情比较急切,希望大家能够用上正真好的东西和好的方法,更希望大家能够真正的看文章,更要看三种写法的特点,有益就发言,有更好的想法可以提出来!
4 楼 zhongxuchen 2009-03-27  
哈哈,我在站内查了一下,关于动态查询的,如介绍DynamicQueryTool什么的(被评为精华贴),说实话我的这种做法非常优雅,一点都不夸张!
3 楼 zhongxuchen 2009-03-27  
现在人真怪异了,难道大家做开发数据库不是用的最多嘛?做系统不就是为了查询统计嘛?查询难道就不涉及到sql或hql嘛?写sql和hql难道你们就习惯用
if(查询条件不为空或什么)
  queryStr.append()吗?
我真服了,如此常用的好东西没有人关心,数据库部分在开发中占多大比重不清楚?!
就整天胡扯一些飘忽的技术,有人说面向对象根本不需要写sql,hql多表时性能是低劣的,有些功能hql是没有办法做到的,所以简单的可以用hql,复杂的需要用sql,当然不管是sql还是hql动态参数时if() append()是极其丑陋的,sql或hql写在代码中也是极其痛苦的!
2 楼 zhongxuchen 2009-03-24  
night_stalker 写道
我以前也觉得sql很丑陋,但是后来发现它后面还有一套优雅的代数学,反而就觉得sql外面的那些东西很丑陋了……

不想多评价,程序的优雅性和可读性以及提供给开发人员的简单性都很重要,我们的团队现在都在这么用,代码量大大减少,sql语句维护也简单方便,要修改直接从xml文件中抠出来改改再放进去,从他们的感受来说已经极其依赖这样的东西了,因为实在是简单易用和直观!
   而且在xml中sql的结构仍然是非常清晰,这对后期维护是非常重要的!
1 楼 night_stalker 2009-03-24  
我以前也觉得sql很丑陋,但是后来发现它后面还有一套优雅的代数学,反而就觉得sql外面的那些东西很丑陋了……

相关推荐

    java-生成单表完全动态查询

    "java-生成单表完全动态查询"这一技术就是为了简化这一过程,它能自动生成实体类、DAO层代码,并且能够实现单表的完全动态查询,极大地提高了开发效率。 首先,让我们理解“单表完全动态查询”的概念。在数据库中,...

    Python中高效数据库查询的最佳实践

    在现代软件开发中,数据库查询是实现数据交互的关键环节。高效的数据库查询设计不仅可以提升应用性能,还能优化用户体验。本文将探讨在Python中设计高效数据库查询的策略和技术,包括需求分析、索引优化、查询语句...

    数据库系统实现 数据库系统实现

    在实现层面,数据库系统通常由数据字典、查询处理器、事务管理器、存储管理器和并发控制等组件构成。 数据字典是数据库系统中的元数据存储区,它包含了关于数据库结构、权限、约束等信息。查询处理器是用户与数据库...

    数据库的设计与实现.rar

    数据库设计与实现是IT领域中的核心内容,它涵盖了数据存储、数据管理以及高效查询等多个方面。在本压缩包“数据库的设计与实现.rar”中,我们可以期待深入探讨数据库系统的概念、设计原则以及实际操作技巧。 首先,...

    数据库 万能查询程序源代码

    3. **动态查询构造器**:用户可以通过拖拽字段、选择操作符和函数来构建复杂的SQL查询,无需手动编写SQL语句。 4. **结果集查看和操作**:查询结果可以以表格、图表或其他形式展示,支持排序、过滤、导出等功能,...

    数据库连接测试及数据的查询

    为了确保数据查询的安全性,开发者应遵循最佳实践,如使用参数化查询或存储过程,以防止SQL注入攻击。此外,应妥善处理敏感信息,如密码,避免明文存储。 总之,数据库连接测试和数据查询是开发和维护数据库应用...

    内存数据库原理及最佳实践

    内存数据库原理及最佳实践 内存数据库,作为一种高性能的数据库管理系统,其核心优势在于将数据存储在主内存中,而非传统的磁盘存储,从而显著提升了数据处理速度和应用程序响应时间。本文将深入探讨内存数据库的...

    JSP+Oracle数据库组建动态网站经典实例.

    3. “第8章 新闻发布系统”可能包含新闻的发布、编辑、分类和搜索等功能,展示了如何利用JSP实现动态内容管理和用户友好的界面展示,同时利用Oracle数据库存储和检索大量文本信息。 4. “第4章论坛系统”是社交网络...

    组态王查询数据库查询实例总结工程.zip

    在压缩包中的"组态王查询数据库查询实例总结工程"文件,很可能是详细的步骤说明、代码示例或者实际工程案例,可以帮助用户深入理解和掌握组态王与数据库交互的各种技巧和最佳实践。通过学习和实践这些实例,用户将能...

    数据库系统实现PPT

    "数据库系统实现PPT"是一个涵盖了数据库系统基础知识和关键特性的资料集,特别关注了数据共享、错误恢复、日志恢复以及查询处理这些关键概念。 首先,我们来详细了解一下数据共享。在多用户环境中,数据库系统必须...

    数据库系统实现(第二版)_databasesystem_

    书中会介绍查询解析器的工作原理,以及查询优化器如何选择最佳执行路径,包括成本估算和索引利用。 四、存储与索引 数据库系统如何高效地存储和访问数据是性能的关键。书中会探讨各种数据存储结构,如B树、B+树、...

    数据库系统实现 数据库系统实现 数据库系统实现

    5. **查询优化**:数据库系统通过查询优化器来选择执行查询的最佳路径,考虑各种因素如索引、表连接顺序等,以提高查询性能。 6. **并发控制**:在多用户环境中,数据库系统需要处理多个事务同时访问相同数据的问题...

    数据库查询优化论文

    查询执行引擎负责实现物理运算符集,并按照选定的执行计划执行查询。它接收物理运算符树作为输入,其中每个节点代表一个物理运算符,边表示数据流。引擎的任务是根据运算符树的结构,有效地处理数据流,生成查询结果...

    阿里云分布式关系型数据库DRDS-最佳实践-D.docx

    分布式关系型数据库 DRDS 最佳实践的核心思想是:在设计分布式关系型数据库时,需要考虑数据均衡度、事务边界、常用查询效率、异构索引和简单性策略等多个方面。此外,分布式关系型数据库 DRDS 还需要考虑容量和访问...

    数据库文档源码 数据库实现方法

    数据库的实现涵盖了多个方面,包括数据存储结构的选择(如B树、哈希表等)、索引技术、查询优化策略、并发控制和恢复机制等。例如,B树是一种常用于数据库索引的数据结构,它能保持数据有序,支持快速的查找、插入和...

    Alibaba数据库运维最佳实践

    ### Alibaba数据库运维最佳实践 #### Alibaba数据库发展历程及挑战 阿里巴巴作为全球领先的电商平台,在其发展过程中,数据库技术经历了从PC服务器到小型机、从集中式Oracle数据库到分布式MySQL数据库的重大转变。...

    Delphi数据库模糊查询功能的改进

    在进行模糊查询时,我们通常会使用SQL语句的LIKE操作符,配合通配符(% 和 _)来实现。 默认情况下,Delphi的模糊查询可能会遇到性能问题,尤其是在处理大量数据时。例如,使用“%”通配符在索引字段前可能导致全表...

    一个从数据库中查询数据的jsp动态网页实例

    首先,JSP是一种服务器端的脚本语言,它允许开发者在HTML页面中嵌入Java代码,从而实现动态内容的生成。JSP文件会被编译成Servlet,由服务器执行,生成响应并返回给客户端。 JavaBean是Java编程中的一种组件模型,...

    SQL Server 2008数据库设计与实现

    《SQL Server 2008数据库设计与实现》是关系型数据库设计与开发方面的一本经典著作,由资深数据库专家撰写,旨在向读者介绍世界上最受欢迎的数据库管理系统之一——SQL Server 2008。全书分为三个部分,从基础概念到...

    20个数据库设计最佳实践

    - **实现技巧**:建立良好的设计习惯,持续学习最新的数据库技术和最佳实践。 通过遵循以上20个最佳实践,不仅可以提高数据库的整体性能,还能确保数据的安全性和一致性,为应用程序的成功打下坚实的基础。

Global site tag (gtag.js) - Google Analytics