基本原理:使用xsqlbuilder框架完成动态sql的构建。

基本流程:使用WebUtils.getParametersStartingWith(ServletActionContext.getRequest(), "s_")根据request找到提交请求的jsp页面并且找到请求参数,从参数中获得所有以s_开始的参数的键值对返还的是一个map对象。然后info.getFilters().putAll(WebUtils.getParametersStartingWith(ServletActionContext.getRequest(), "s_"));
    info.getFilters().putAll(
      WebUtils.getParametersStartingWith(ServletActionContext.getRequest(), tableId + "_f_"));在pageinfo中获得filter对象,此filter对象是从limit对象中获得的,但是在limit中次filter对象始终为空。在构建完成pageinfo对象后次filter属性仍然为空。必须在newPageInfo()函数中设置其filter属性的值为list.jsp页面中对于的查询条件匹配的表单元素。并且匹配是按照name属性进行匹配的,所有想添加到filter中希望通过在dao层动态构建sql的表单元素的name必须用“s_”开头,才能添加到filter中。最终返还的是pageInfoImpl对象。

由pageinfo对象再在dao层中构建动态sql。在findBy方法中XsqlBuilder builder = new XsqlBuilder(SafeSqlProcesserFactory.getOracle());构造xsqlbuilder对象。

XsqlBuilder.XsqlFilterResult queryXsqlResult = builder.generateHql(query, filters);产生XsqlFilterResult对象然后执行如下方法:

private Page findBy(final PageInfo pageInfo, final XsqlBuilder.XsqlFilterResult queryXsqlResult, final XsqlBuilder.XsqlFilterResult countQueryXsqlResult)
  {
    return (Page)getHibernateTemplate().execute(new HibernateCallback()
    {
      public Object doInHibernate(Session session) throws HibernateException, SQLException
      {
        Query query = AbstractHibernateDao.setQueryParameters(session.createQuery(queryXsqlResult.getXsql()), queryXsqlResult.getAcceptedFilters());

Query countQuery = AbstractHibernateDao.setQueryParameters(session.createQuery(HqlRemoveUtils.removeOrders(countQueryXsqlResult.getXsql())), countQueryXsqlResult.getAcceptedFilters());

return new Hibernate3Page(query, countQuery, pageInfo.getPageNumber(), pageInfo.getPageSize());
      }
    });
  }

最终返还的是hibernate3page对象,实际是是page对象的子类。在此page对象中必须要初始化其中的element元素,其中保存了所有通过sql查询出来的结构集数据

public Hibernate3Page(Query selectQuery, Query countQuery, int pageNumber, int pageSize)
  {
    try
    {
      if (countQuery.uniqueResult() != null)
        init(pageNumber, pageSize, Integer.parseInt(countQuery.uniqueResult().toString()));
      else
        init(pageNumber, pageSize, 0);
      if (getTotalNumberOfElements() == 0)
        this.elements = new ArrayList(0);
      else
        this.elements =
          selectQuery.setFirstResult((this.pageNumber - 1) * this.pageSize)
          .setMaxResults(this.pageSize).list();
    }
    catch (HibernateException e) {
      throw new RuntimeException(e);
    }
  }

在初始化element元素时使用了setFirstResult和setMaxResults设置分页显示对query对象执行list返还包含所有结果集的arraylist对象。

后续调用savepage方法

public void savePage(String tableId, Page page)
  {
    Assert.notNull(tableId);
    getRequest().setAttribute(tableId + "List", page.getThisPageElements());
    getRequest().setAttribute(tableId + "_totalRows", Integer.valueOf(page.getTotalNumberOfElements()));
  }

在request中写入element元素。在search.jsp页面中通过<ec:table></ec:table>获得request中的list对象遍历显示在页面上。

补充:limit对象的构建

limit对象时由ecside复制初始化的

LimitFactory limitFactory = new TableLimitFactory(context, tableId);
    TableLimit limit = new TableLimit(limitFactory);

开发时只需要调用Limit limit=RequestUtils.getLimit(getRequest(),"LgpProduct");就可以初始化完成limit对象。

在ecside中有LimitFactory对象构造limit对象在TableLimitFactory中包含了limit中的所有属性

通过init方法载入ecside.properties文件,通过this.registry = new LimitRegistry(context, tableId, prefixWithTableId, state, stateAttr);初始化sortMap对象。将其所有属性赋值给limit对象。然后再有limit来初始化pageinfo对象。借用pageinfo中的filter完成动态sql的构建返回page对象。

动态sql构建的过程的更多相关文章

  1. 本地动态SQL

    (转自:http://blog.itpub.net/26622598/viewspace-718134) 一.什么是动态SQL 大多数PL/SQL都做着一件特殊的结果可预知的工作.例如,一个存储过程可 ...

  2. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...

  3. mybatis源码学习(四):动态SQL的解析

    之前的一片文章中我们已经了解了MappedStatement中有一个SqlSource字段,而SqlSource又有一个getBoundSql方法来获得BoundSql对象.而BoundSql中的sq ...

  4. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  5. plsql programming 16 动态SQL和动态PLSQL

    动态SQL 是指在执行时才构建 SQL 语句, 相对于静态 sql 的编译时就已经构建. 动态PLSQL 是指整个PL/SQL代码块都是动态构建, 然后再编译执行的. 作用: 1. 可以支持 DDL ...

  6. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  7. MyBatis 源码分析 - SQL 的执行过程

    * 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析 ...

  8. java版云笔记(九)之动态sql

    SQL 首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程. 静态S ...

  9. EF性能分析(一):动态SQL性能差.从OrderBy开始分析

    1. 问题背景 在我的力推下,部门业务开发转向ABP,其中ORM采用的是EntityFrameworkCore. 然而,在数据查询方面,出现了重大的性能问题... 请看代码: //在一个百万数据量的表 ...

随机推荐

  1. netty demo

    Netty 4.0 demo   netty是一个异步,事件驱动的网络编程框架&工具,使用netty,可以快速开发从可维护,高性能的协议服务和客户端应用.是一个继mina之后,一个非常受欢迎的 ...

  2. MSMQ是什么?

    MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位 ...

  3. C# 3循环 for语句应用

    class 做图形 { static void Main(string[] args) { //打印下列图形 //★★★★★ //★★★★★ //★★★★★ //★★★★★ //★★★★★ // 图( ...

  4. codevs1127

    学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1. 现在有n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学按接水顺序从1到n 编号,i 号同学的 ...

  5. Sql Server数据库设计高级查询

    -------------------------------------第一章  数据库的设计------------------------------------- 软件开发周期:     (1 ...

  6. UVa 1585 - Score

    得分是目前连续O 的个数,遇到X置0 #include <cstdio> #include <iostream> #include <cstring> using ...

  7. [原创]NT系统信息察看工具 : NtInfoGuy

    原文链接:[原创]NT系统信息察看工具 : NtInfoGuy 对于windows的内部,我们有太多的东西需要了解,认知.我们非凡的.从不知足的探求本性驱使我们要 拨开迷雾得见青天.太多的木马,病毒, ...

  8. lex 和 yacc 的区别与联系

    lex负责词法解析,而yacc负责语法解析,其实说白了就是lex负责根据指定的正则表达式,将输入的字符串匹配成一个一个的token,同时允许用户将当前匹配到的字符串进行处理,并且允许返回一个标识当前t ...

  9. Kaggle入门

    Kaggle入门 1:竞赛 我们将学习如何为Kaggle竞赛生成一个提交答案(submisson).Kaggle是一个你通过完成算法和全世界机器学习从业者进行竞赛的网站.如果你的算法精度是给出数据集中 ...

  10. linux自带有usb驱动,为什么还需要libusb呢

    linux里的软件分为用户层和内核层两种.比如内核里编译了温度传感器的驱动,还得有lm-sensors在用户层负责解释处理内核递交出的数据.usb驱动是硬件驱动方面的东西,libusb是给应用软件开发 ...