论坛首页 Java企业应用论坛

准备发布Jert的第一个版本

浏览 70600 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-01-27  
Quake Wang 写道
基本的操作说明
2. 如何创建报表
在创建好数据库以后,我们就可以开始添加需要的报表。
选择Administration -> Reports -> Create New
目前共有3种报表类型可以选择:
A. STATIC_QUERY
静态的sql query报表,用户不需要对该报表做输入参数的动作,我们可以直接输入任意的sql,比如:select * from user。

B. SIMPLE_PARAMETER_QUERY
简单固定参数报表,用户需要对该报表做输入参数的动作以后,才能得到查询结果,比如:select * from user where age > #age#。在这里参数名需要用“#”包围起来。

C. DYNAMIC_PARAMETER_QUERY
动态的非固定参数报表,根据用户输入参数的不同,产生不同的查询语句,比如:
<plain>select * from user where 1 = 1 </plain>
<dynamic type="isNotNull" append-before="and age > " parameter-name="age"/>
<dynamic type="isNotNull" append-before="and sex = " parameter-name="sex"/>

当用户只输入age这个参数的时候,会产生这样的查询:
select * from user where 1 = 1 and age > 18
当用户输入了age和sex这2个参数的时候,则会产生这样的查询:
select * from user where 1 =1 and age > 18 and sex = 'male'

关于这种类型的报表详细说明,请参考dynamic_report.txt [TODO]


提几个建议:
1.SQL的参数设置没有必要搞得这么复杂,像 where 1 =1 这样的形式也不大雅观.
其实只是个SQL技巧的问题,对于你所说的动态的非固定参数查询,只需要用下面的SQL就可达到同样的功能:
select * from user where (age > #age# or #age# isnull) and (sex = #sex# or #sex# isnull)

2.在实现时使用preparedStatment,用'?' 代替 #XXX#的内容,有利于SQL的执行性能,也可减少实现程序的复杂程度.
0 请登录后投票
   发表时间:2005-01-27  
Tao 写道

1.SQL的参数设置没有必要搞得这么复杂,像 where 1 =1 这样的形式也不大雅观.
其实只是个SQL技巧的问题,对于你所说的动态的非固定参数查询,只需要用下面的SQL就可达到同样的功能:
select * from user where (age > #age# or #age# isnull) and (sex = #sex# or #sex# isnull)

嗯,我也觉得这种动态sql查询目前写起来极其不友好,但是想不出有什么好方法可以改进。
你说的这种方法我看不明白,如果用户在页面上只输入了age = 18,而 sex留空,那么翻译出来的sql是什么呢:
select * from user where (age > 18 or 18 is null) and (sex = ??? or ??? is null)

这部分的使用,准备等用户反馈,再来做改进,可能格式会推倒,重新实现。

Tao 写道

2.在实现时使用preparedStatment,用'?' 代替 #XXX#的内容,有利于SQL的执行性能,也可减少实现程序的复杂程度.

现在就是这样做的呀
0 请登录后投票
   发表时间:2005-01-27  
翻译出来的sql是个样子的:

select * from user where (age > ? or  ? isnull) and (sex = ? or ? isnull)

有代码的话会是这样
  public ResultSet getResultSet(Connection con,Map params);throws SQLException{
    System.out.println("DataSetImpl:getResultSet:params=" + params); ;
    String sqlExpress=makeExpress();;
    PreparedStatement ps=con.prepareStatement(sqlExpress);;
    String[] names=this.getParamNames();;
    for(int i=0;i<names.length ;i++);{
      DataSetParam dsp=getParam(names[i]);;
      ps.setObject(i+1,params==null ? null : params.get(names[i]);,dsp.getSqlType(););;
    }
    return ps.executeQuery();;
  }
0 请登录后投票
   发表时间:2005-01-27  
where (age &gt; 18 or 18 is null)是不合法的sql语句吧?

另外如果用户只输入age,而没有输入sex,但是PreparedStatment要求占位符号和输入参数是一样多的,你还得去除掉sex条件的这部分语句,如何处理呢?
0 请登录后投票
   发表时间:2005-01-27  
Quake Wang 写道
where (age &gt; 18 or 18 is null)是不合法的sql语句吧?

另外如果用户只输入age,而没有输入sex,但是PreparedStatment要求占位符号和输入参数是一样多的,你还得去除掉sex条件的这部分语句,如何处理呢?


1.where (age &gt; 18 or 18 is null)是不合法的sql语句,但where (age &gt; ? or ? is null)是符合JDBC规范的语法

2.不需要除掉sex条件的这部分语句,直接传空值就可以了
0 请登录后投票
   发表时间:2005-01-27  
真得很奇妙:
        PreparedStatement ps = conn.prepareStatement("select * from user where (user_name = ? or ? is null); and (email = ? or ? is null);");;
        ps.setObject(1, null);;
        ps.setObject(2, null);;
        ps.setObject(3, null);;
        ps.setObject(4, null);;

竟然查询出来的结果是和select  * from user 是一样的,从来不知道jdbc有这样的特性,我先去看一下jdbc的这部分规范,再来看看如何改进。

谢谢你,Tao
0 请登录后投票
   发表时间:2005-01-28  
两个null is null,where子句当然返回true啦
0 请登录后投票
   发表时间:2005-01-28  
在war中增加logs/application.log,以支持登记webwork相关出错/警告日志。
0 请登录后投票
   发表时间:2005-01-28  
奇怪,我把jer.war copy到resin2.1.4下面,运行http://localhost:8080/jert/setup/index.action
出现如下错误:

--------------------------------------------------------
500 Servlet Exception
org.springframework.beans.factory.BeanCreationException: Error creating
bean with name 'sessionFactory' defined in class path resource [com/javaeye/jert/application_context.xml]:
Initialization of bean failed; nested exception is net.sf.hibernate.MappingException:
org.dom4j.DocumentException: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d
Nested exception: http://xml.org/sax/features/validation Nested exception:
Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested
exception: http://xml.org/sax/features/validation
net.sf.hibernate.MappingException: org.dom4j.DocumentException: Validation
not supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception:
http://xml.org/sax/features/validation Nested exception: Validation not
supported for XMLReader: com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation
at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:296)
at org.springframework.orm.hibernate.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:383)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:990)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:275)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:193)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:240)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:163)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:230)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:304)
at org.springframework.web.context.support.XmlWebApplicationContext.refresh(XmlWebApplicationContext.java:131)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:167)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:101)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:48)
at com.caucho.server.http.Application.init(Application.java:1838)
at com.caucho.server.http.VirtualHost.startApplication(VirtualHost.java:1192)
at com.caucho.server.http.VirtualHost.getInvocation(VirtualHost.java:991)
at com.caucho.server.http.ServletServer.getInvocation(ServletServer.java:1189)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:218)
at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:163)
at com.caucho.server.TcpConnection.run(TcpConnection.java:137)
at java.lang.Thread.run(Thread.java:534)
Caused by: org.dom4j.DocumentException: Validation not supported for XMLReader:
com.caucho.xml.Xml@1ba94d Nested exception: http://xml.org/sax/features/validation
Nested exception: Validation not supported for XMLReader: com.caucho.xml.Xml@1ba94d
Nested exception: http://xml.org/sax/features/validation
at org.dom4j.io.SAXReader.read(SAXReader.java:358)
at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:286)
... 20 more


--------------------------------------------------------------------------------
Resin 2.1.4 (built Fri Aug 2 14:16:52 PDT 2002)
0 请登录后投票
   发表时间:2005-01-28  
Resin使用它自己的一个xml parser,速度快,但是不是所有的功能都实现,你可以写一个启动脚本:

httpd -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl

让它使用xerces的parser,这样应该就可以正常运行了。

另外,如果有使用上的问题,bug report,建议。可以用CVSTrac来填写:
http://cvs.iteye.com:8008/quake/index

谢谢。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics