birt动态sql

来源:互联网 发布:常用数字图像处理算法 编辑:程序博客网 时间:2024/04/30 09:25

birt动态SQL实现有三种方式:拼接SQL、绑定变量和让应用程序拼接,birt得到返回结果集方式。

 

1.拼接SQL方式

在数据集中写SQL,如下:

 

Sql代码  收藏代码
  1. select id ,code,name,type  
  2. from type  

 

 

选中数据集,点script方式,在beforeOpen事件中写如下SQL:

 

Sql代码  收藏代码
  1. var type = reportContext.getParameterValue("type");  
  2. var name = reportContext.getParameterValue("name");  
  3. var query = this.queryText;  
  4. if(type!=null){  
  5.     query = query + " and type = "+type;  
  6. }  
  7. if(name!=null&&name!=""){  
  8.     query = query + " and  name = '"+name+"'";  
  9. }  
  10. this.queryText = query;  

 

然后就可以了,当然,也可以不写第一步,直接所有的SQL都在beforeOpen中拼接。

 

但是,拼接SQL方式不仅复杂容易错,还会导致SQL注入风险。

 

2.绑定变量方式

 在数据集的SQL中写如下SQL

 

Sql代码  收藏代码
  1. select id ,code,name,type  
  2. from location  
  3. where (type = ? or ? is null )  
  4. and ( name = ? or ? is null )  

 然后配置数据集的参数,如下图:

 



 

 

最后一项是链接报表的参数。倒数第二项是默认值,填null

 

这种方式不会有SQL注入风险。

 

要注意参数与问号个数要相同

 

当采用绑定变量时,数据集参数和报表参数关联时,可能会出现这样的异常:

org.eclipse.birt.report.data.oda.jdbc.JDBCException: Cannot set preparedStatement null value.

原因是数据集参数中不能将Intger 类型设置为null值,要解决这个问题,可以将

Intger 类型的参数全部改成DECIMAL,原因待研究。

 

另外如果想要查看执行的SQL,可以在数据集的SCRIPT的beforeOpen事件写如下脚本:

 

Java代码  收藏代码
  1. importPackage( Packages.java.io );     
  2. out = new PrintWriter( new FileWriter("c:/debuginfo.txt"true ) );     
  3. out.println("queryText:-->"this.queryText);     
  4. out.close();  

 第三种是在应该程序处理查询,BIRT负责取出结果集展示,采用的是BIRT+SPRING+MYBATIS。

 

当然这里MYBATIS也可以是其它框架,思路一样。

 

BirtBeanFactory.java

Java代码  收藏代码
  1. public class BirtBeanFactory {  
  2.   
  3.     private static BeanFactory ctx;  
  4.   
  5.     public synchronized static void setBeanFactory(BeanFactory beanFactory) {  
  6.         ctx = beanFactory;  
  7.     }  
  8.   
  9.     public static Object getBean(String str) {  
  10.         return ctx.getBean(str);  
  11.     }  
  12.   
  13.     public static <T> T getBean(Class<T> clazz) {  
  14.         return ctx.getBean(clazz);  
  15.     }  
  16. }  

 GlobalInitializer.java

Java代码  收藏代码
  1. public class GlobalInitializer implements InitializingBean ,BeanFactoryAware{  
  2.   
  3.     private BeanFactory beanFactory;  
  4.   
  5.     @Override  
  6.     public void afterPropertiesSet() throws Exception {  
  7.         BirtBeanFactory.setBeanFactory(beanFactory);  
  8.     }  
  9.   
  10.     @Override  
  11.     public void setBeanFactory(BeanFactory beanFactory) throws BeansException {  
  12.         this.beanFactory = beanFactory;  
  13.     }  
  14.       
  15. }  

 

 

BirtDataFactory.java

Java代码  收藏代码
  1. public class BirtDataFactory {  
  2.     private TestService manager = (TestService) BirtBeanFactory.getBean(TestService.class);  
  3.       
  4.     public List<Location> findListByDto(LocationDto dto){  
  5.         return manager.findListByDto(dto);  
  6.     }  
  7. }  

 spring配置文件配置下:

Xml代码  收藏代码
  1. <bean id="globalInitializer" class="com.test.birt.core.GlobalInitializer"/>  

 这样代码层就完成了,

在birt中创建脚本数据源

创建脚本数据集,在数据集的open事件中写这样的方法:

Java代码  收藏代码
  1. importPackage(Packages.com.test.birt.core);  
  2. importPackage(Packages.com.test.birt.report.dto);  
  3. factory = new BirtDataFactory();   
  4. dto = new TestDto();  
  5. dto.setCreateTimeStart(reportContext.getParameterValue("createTimeStart"));  
  6. dto.setCreateTimeEnd(reportContext.getParameterValue("createTimeEnd"));  
  7.   
  8. if(reportContext.getParameterValue("dcId")!=null){  
  9.     dto.setDcId(reportContext.getParameterValue("dcId").longValue());  
  10. }  
  11. collectList=factory.findListByDto(dto);  
  12. iterator = collectList.iterator();   

 在fecth阶段,写这样 的代码:

Java代码  收藏代码
  1. if(iterator.hasNext() == false ){   
  2.     return false;   
  3. else{   
  4.     var collectBean = iterator.next();   
  5.     row["id"]=collectBean.getId();   
  6.     row["name"] = collectBean.getName();   
  7.       
  8.     return true;   
  9. }   

 这样就可以了。

 

要显示的字段(row["id"]等)可以在数据集中编辑,选中数据集--EDIT--OUTPUT COLUMNS---ADD

0 0
原创粉丝点击