birt动态SQL

标签: birt sql | 发表时间:2013-07-26 18:05 | 作者:
出处:http://www.iteye.com

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

 

1.拼接SQL方式

在数据集中写SQL,如下:

 

select id ,code,name,type
from type

 

 

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

 

var type = reportContext.getParameterValue("type");
var name = reportContext.getParameterValue("name");
var query = this.queryText;
if(type!=null){
	query = query + " and type = "+type;
}
if(name!=null&&name!=""){
	query = query + " and  name = '"+name+"'";
}
this.queryText = query;

 

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

 

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

 

2.绑定变量方式

 在数据集的SQL中写如下SQL

 

select id ,code,name,type
from location
where (type = ? or ? is null )
and ( name = ? or ? is null )

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

 



 

 

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

 

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

 

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

 

importPackage( Packages.java.io );   
out = new PrintWriter( new FileWriter("c:/debuginfo.txt", true ) );   
out.println("queryText:-->"+ this.queryText);   
out.close();

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

 

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

 

BirtBeanFactory.java

public class BirtBeanFactory {

    private static BeanFactory ctx;

    public synchronized static void setBeanFactory(BeanFactory beanFactory) {
        ctx = beanFactory;
    }

    public static Object getBean(String str) {
        return ctx.getBean(str);
    }

    public static <T> T getBean(Class<T> clazz) {
        return ctx.getBean(clazz);
    }
}

 GlobalInitializer.java

public class GlobalInitializer implements InitializingBean ,BeanFactoryAware{

	private BeanFactory beanFactory;

	@Override
	public void afterPropertiesSet() throws Exception {
		BirtBeanFactory.setBeanFactory(beanFactory);
	}

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		this.beanFactory = beanFactory;
	}
	
}

 

 

BirtDataFactory.java

public class BirtDataFactory {
	private TestService manager = (TestService) BirtBeanFactory.getBean(TestService.class);
	
	public List<Location> findListByDto(LocationDto dto){
		return manager.findListByDto(dto);
	}
}

 spring配置文件配置下:

<bean id="globalInitializer" class="com.test.birt.core.GlobalInitializer"/>

 这样代码层就完成了,

在birt中创建脚本数据源

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

importPackage(Packages.com.test.birt.core);
importPackage(Packages.com.test.birt.report.dto);
factory = new BirtDataFactory(); 
dto = new TestDto();
dto.setCreateTimeStart(reportContext.getParameterValue("createTimeStart"));
dto.setCreateTimeEnd(reportContext.getParameterValue("createTimeEnd"));

if(reportContext.getParameterValue("dcId")!=null){
	dto.setDcId(reportContext.getParameterValue("dcId").longValue());
}
collectList=factory.findListByDto(dto);
iterator = collectList.iterator(); 

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

if(iterator.hasNext() == false ){ 
	return false; 
} else{ 
	var collectBean = iterator.next(); 
	row["id"]=collectBean.getId(); 
	row["name"] = collectBean.getName(); 
	
	return true; 
} 

 这样就可以了。

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [birt sql] 推荐:

birt动态SQL

- - ITeye博客
birt动态SQL实现有三种方式:拼接SQL、绑定变量和让应用程序拼接,birt得到返回结果集方式. 在数据集中写SQL,如下:. 选中数据集,点script方式,在beforeOpen事件中写如下SQL:. 然后就可以了,当然,也可以不写第一步,直接所有的SQL都在beforeOpen中拼接. 但是,拼接SQL方式不仅复杂容易错,还会导致SQL注入风险.

birt在页面展现

- - 行业应用 - ITeye博客
      .       .

BIRT表格隔行添加颜色

- - Web前端 - ITeye博客
选择table中的details,进入script页面, onprepare事件中声明   count = 0(注意不能有var);. 2.oncreate时间中写:. 在table中添加一个header行,插入text,选择HTML,在编辑界面中写:. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

第十六章 BIRT疑难杂惑清理

- - CSDN博客推荐文章
第十四十五章还在书写中,先就目前BIRT比较集中的一些疑难杂惑进行解决. 问题一:把runtime包中自带的birt.war发布到Tomcat6上,运行后,首页面可以显示,但当点击". View Example "时,加载报表就报错.错误内容如下:. 或者在运行过程中出现:Caused by: java.lang.OutOfMemoryError: PermGen space.

PL/SQL动态SQL(原创)

- - ITeye博客
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一. 很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成. 再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只能针对某几个特定的表来形成分页.

Derby SQL 分页

- - ITeye博客
    之前在网上看到有人问 Derby SQL 分页实现的问题,网上有人给出这样的解决方案,SQL 如下:. 其实,这样的分页查询,性能不理想,我试过在 300W 数据量中采用这种分页方式,需要 20~30秒之久;其实 Derby 10.6 以上版本有更好的分页支持,直接给出 SQL 实现如下:.

SQL Server--索引

- - CSDN博客推荐文章
         1,概念:  数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力..             2.1优点:  1,大大加快搜索数据的速度,这是引入索引的主要原因..                             2,创建唯一性索引,保证数据库表中每一行数据的唯一性..

MySql动态SQL

- - SQL - 编程语言 - ITeye博客
13.7. 用于预处理语句的SQL语法. MySQL 5.1对服务器一方的预制语句提供支持. 如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势. 候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET.

sql优化

- - 数据库 - ITeye博客
是对数据库(数据)进行操作的惟一途径;. 消耗了70%~90%的数据库资源;独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;. 可以有不同的写法;易学,难精通. 固定的SQL书写习惯,相同的查询尽量保持相同,存储过程的效率较高. 应该编写与其格式一致的语句,包括字母的大小写、标点符号、换行的位置等都要一致.

SQL Server 面试

- - SQL - 编程语言 - ITeye博客
在SQL语言中,一个SELECT…FROM…WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句中的查询称为子查询. 子查询分为嵌套子查询和相关子查询两种. 嵌套子查询的求解方法是由里向外处理,即每个子查询在其上一级查询处理之前求解,子查询的结果作为其父查询的查询条件. 子查询只执行一次,且可以单独执行;.