zoukankan      html  css  js  c++  java
  • 动态sql构建的过程

    基本原理:使用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对象。

  • 相关阅读:
    线性代数学习之初等矩阵和矩阵的可逆性
    线性代数学习之线性系统
    容器远程访问vnc--CentOS 6.8安装和配置VNC
    docker安装-单机/多机安装
    docker aufs存储驱动文件系统
    基于PowerCli自动部署和配置vmvare虚拟机
    使用Kubespray在ubuntu上自动部署K8s1.9.0集群
    python应用-pycharm新建模板默认添加shebang编码作者时间等信息
    python开发基础作业01:模拟登陆系统
    git 添加码云远程仓库和上传到码云的命令
  • 原文地址:https://www.cnblogs.com/moonfans/p/3338913.html
Copyright © 2011-2022 走看看