用JDBC做为jasper report的数据源来连接数据库读取数据
1. 在Eclipse中新建Java项目(过程略),我的Java项目的结构如下所示:
注:这里的有关spring的jar包并不是改项目运行必须的,是我在做用JavaBean做为数据源的时候用到的包,请忽略。
2.连接数据库代码(我连接的是Mysql数据库)
1 package com.report.sample; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 public class ConnectionProvider { 8 private static String driverClassName ="com.mysql.jdbc.Driver"; 9 private static String username="root"; 10 private static String password="root"; 11 private static String url="jdbc:mysql://localhost/test"; 12 13 static{ 14 try { 15 Class.forName(driverClassName); 16 } catch (ClassNotFoundException e) { 17 throw new RuntimeException(e); 18 } 19 } 20 21 public static Connection getConnection(){ 22 try { 23 return DriverManager.getConnection(url, username, password); 24 } catch (SQLException e) { 25 throw new RuntimeException(e); 26 } 27 } 28 }
3.获取编译后的.jasper文件所在的路径(有关.jrxml编译成.jasper文件我会单独再写)
1 package com.report.sample; 2 3 import java.io.IOException; 4 5 public class GetPath { 6 7 public String showURL() throws IOException { 8 return this.getClass().getResource("/").getPath(); 9 } 10 }
4.连接数据源,将从数据库中读取的数据显示到PDF上并保存到和.jasper 文件同一个目录下(可以输出html, excel, pdf多种形式,我会在另一篇里面详细总结)
1 package com.report.sample; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.util.HashMap; 8 import java.util.Map; 9 10 import net.sf.jasperreports.engine.JRException; 11 import net.sf.jasperreports.engine.JasperRunManager; 12 13 public class JRWithJdbcDatasource { 14 15 public static void main(String[] args) throws Exception{ 16 Map<String, Object> parameters = new HashMap<String,Object>(); 17 Connection connection = ConnectionProvider.getConnection(); 18 GeneratePDFReport(new GetPath().showURL(), parameters, connection); 19 } 20 21 private static void GeneratePDFReport(String path, Map<String, Object> parameters, Connection connection){ 22 try { 23 byte[] pdfStream = JasperRunManager.runReportToPdf(path + "/DBReport.jasper", parameters, connection); 24 File file = new File(path + "/report.pdf"); 25 FileOutputStream op = new FileOutputStream(file); 26 op.write(pdfStream); 27 op.flush(); 28 op.close(); 29 } catch (IOException e) { 30 e.printStackTrace(); 31 } catch (JRException e) { 32 e.printStackTrace(); 33 } 34 } 35 }
5.在项目中新建个目录来存放设计出来的report模板文件(我新建的文件夹是"res"), 然后右键新建 jasper report如下如所示步骤
继续选择想要设计report采用的模板,按自己需要选择,我这里选择的是Blank_A4_Landscape
然后选择要保存的目录,选择之前你新建的打算保存这个模板文件的那个目录并且给文件命名,我这里选择的是“res”目录, DBReport1.xml
选择数据源,这里我选择的是“Database JDBC connect”
设定有关JDBC数据源连接的相关信息
注:这里我用的是test数据库里的t_employee表和v视图来做的实验,实验结果是我们可以从表和视图中均可以读取数据
看到如图所示的界面,说明我们的JDBC连接已经创建成功可以正常的去访问数据库了
6.使用jasper studio 来设计我们的report模板(有关如何去设计模板,我会在另外一篇里面大概说明,因为内容较多,我也只是会简单的设计太复杂的我还没来的及去学)
选TextField然后双击会出现如图所示的界面,这里遵循的是我们Java的语法
点击保存,我们的模板就有了一个字段:name了,我这里还添加了个字段是salary
7.重要的部分,数据库还忘记给大家说了,这里我是简单的创建了一个test数据库里面就一张表t_employee, 还有一个视图v,创建语句如下:
a) 创建数据库
1 CREATE DATABASE `test`
b) 创建表t_employee
CREATE TABLE `t_employee` ( `id` int(11) NOT NULL, `name` varchar(45) DEFAULT NULL, `age` varchar(45) DEFAULT NULL, `salary` int(11) DEFAULT NULL, `address` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
c) 创建视图 v (这里创建视图不是必须的,只是为了去做实验说明数据源不仅仅可以是表还可以是视图)
create view v as select id, name, age, salary, address from t_employee;
8. 至此,我们就可以去运行,JRWithJdbcDatasource类里面的main方法来测试我们的过程是否正确,如果在你的项目的bin目录下生成一个.pdf文件,则说明创建成功
因为我这里做的实验是生成pdf文件,所以生成的是PDF的格式,输出的路径可以自己定义。JDBC做为数据源来读取数据库中的值显示在PDF上面的实验到此就结束。