birt动态sql
来源:互联网 发布:常用数字图像处理算法 编辑:程序博客网 时间:2024/04/30 09:25
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注入风险。
要注意参数与问号个数要相同
当采用绑定变量时,数据集参数和报表参数关联时,可能会出现这样的异常:
org.eclipse.birt.report.data.oda.jdbc.JDBCException: Cannot set preparedStatement null value.
原因是数据集参数中不能将Intger 类型设置为null值,要解决这个问题,可以将
Intger 类型的参数全部改成DECIMAL,原因待研究。
另外如果想要查看执行的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;
- }
这样就可以了。
要显示的字段(row["id"]等)可以在数据集中编辑,选中数据集--EDIT--OUTPUT COLUMNS---ADD
- birt动态sql
- birt 的动态sql,即多条件查询
- birt 动态表名
- birt 配置动态数据源
- birt修改sql
- 动态处理BIRT中的图片
- birt 显示源sql调试
- birt
- BIRT
- birt
- BIRT
- 在BIRT中使用动态图片
- Birt API 实现动态参数列报表
- BIRT 报表的动态交互性
- birt学习笔记-动态配置数据源
- Birt API 实现动态参数列报表
- birt打印执行的sql命令
- BIRT报表的数据库间动态关联解决办法
- 1.首先描述下自定义控件的一般方法: 自定义控件是被创造出来,所以先要复写它三个的构造方法,根据需求决定复写哪个,若没有自定义属性,复写只有一个参数的即可。若有自定义属性,则可以通过obtainSty
- 出错啦,求指导 linker commond fialed with exit code 1
- 多线程如何并发访问SQLite数据库?
- openwrt下ngrok命令缺少libstdc++库的问题 can't load library 'libstdc++.so.6'
- android 放大招,上右右键,开启大招。求解??
- birt动态sql
- Hyperledger Fabric继peer启动之后的源码解析一
- SecureCRT萌新常用命令及Linux命令大全整理
- iOS POST请求,将base64编码的图片数据传输给后台,转义字符消失
- ora11g 安装报错ins_emagent.mk
- PHP获取汉字首字母函数
- VMware Workstation 12 Pro 安装kali2.0
- 关于一个布局里面显示多个接口里面数据
- 显示不了安卓虚拟机的画面