Jasper Report merupakan tools untuk membuat laporan pada Java yang bersifat free dan open source. Hal ini menjadikan Jasper Report sangat populer dikalangan para pengembang Java.
Hibernate sudah diakui sebagai framework ORM handal untuk menangani persistency data pada platform pengembangan Java. Kepopulerannya menyebabkan Java EE merasa kecolongan karena tools persistence data milik mereka yakni Entity Bean (merupakan bagian dari EJB) dianggap “berat” dan membuat para pengembang beralih ke Hibernate. Di kemudian hari Java EE membuat standar yang diilhami oleh Hibernate untuk persistency data, maka lahirlah JPA dan sekarang Hibernate merupakan salah satu implementasi dari standar tersebut.
Pada tutorial jasper report ini saya akan berbagi tentang integrasi Hibernate sebagai sumber data dan Jasper Report sebagai engine untuk membuat suatu laporan. Studi kasusnya sederhana saja, dimana aplikasi akan membuat sebuah laporan (jasper report) data matakuliah yang diambil oleh seorang mahasiswa. Mahasiswa yang kita ambil untuk melihat laporannya bersifat dinamis, artinya kita bisa menginputkan mahasiswa siapa saja yang berada pada sistem untuk ditampilkan data matakuliah yang diambilnya. Bentuk tampilan aplikasinya adalah sebagai berikut:
Sedangkan bentuk laporan jasper report yang dihasilkan adalah seperti gambar berikut ini
dan berikut adalah desain databasenya
Masih tertarik untuk membuatnya? 😀 … mari kita lanjutkan belajar jasper reportnya
Langkah#1 Membuat Projek dan Menyiapkan Pakcage
Buatlah projek dengan nama ReportSederhana serta buat package-package untuk mengelompokkan Class sesuai tipenya. Berikut gambar struktur projeknya:
Langkah#2 Menyiapkan Sumber Data Laporan Jasper Report
Pada default package buatlah file xml dengan nama hibernate.cfg.xml. File ini digunakan untuk membuat koneksi dengan database, keperluan mapping Class dan lain sebagainya
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/reportsederhana?zeroDateTimeBehavior=convertToNull</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <property name="hibernate.hbm2ddl.auto">update</property> <mapping class="reportsederhana.model.Matakuliah"/> <mapping class="reportsederhana.model.Mahasiswa"/> </session-factory> </hibernate-configuration> |
Parameter username,password dan url silahkan sesuaikan dengan kebutuhan Anda.
Selanjutnya kita buat Class HibernateUtil pada package reportsederhana.util
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package reportsederhana.util; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.SessionFactory; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } } //jasper report |
Kalau sudah selesai, langkah selanjutnya adalah membuat Class Domain Model, yaitu Class yang merepresentasikan data pada tabel di database. Pada package reportsederhana.model buat 2 buah Class, Mahasiswa dan Matakuliah.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
package reportsederhana.model; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; import javax.persistence.UniqueConstraint; @Entity @Table(name="mahasiswa" ,catalog="reportsederhana" ) public class Mahasiswa implements java.io.Serializable { private String nim; private String nama; private List matakuliahs = new ArrayList(); public Mahasiswa() { } public Mahasiswa(String nim, String nama) { this.nim = nim; this.nama = nama; } public Mahasiswa(String nim, String nama, List matakuliahs) { this.nim = nim; this.nama = nama; this.matakuliahs = matakuliahs; } @Id @Column(name="nim", unique=true, nullable=false, length=25) public String getNim() { return this.nim; } public void setNim(String nim) { this.nim = nim; } @Column(name="nama", nullable=false, length=50) public String getNama() { return this.nama; } public void setNama(String nama) { this.nama = nama; } @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY) @JoinTable(name="mahasiswa_to_matakuliah", catalog="reportsederhana", uniqueConstraints=@UniqueConstraint(columnNames="nim"), joinColumns = { @JoinColumn(name="nim", unique=false, nullable=false, updatable=false) }, inverseJoinColumns = { @JoinColumn(name="kode", unique=false, nullable=false, updatable=false) }) public List getMatakuliahs() { return this.matakuliahs; } public void setMatakuliahs(List matakuliahs) { this.matakuliahs = matakuliahs; } } //jasper report |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
package reportsederhana.model; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; @Entity @Table(name="matakuliah" ,catalog="reportsederhana" ) public class Matakuliah implements java.io.Serializable { private String kode; private String nama; private List mahasiswas = new ArrayList(); public Matakuliah() { } public Matakuliah(String kode, String nama) { this.kode = kode; this.nama = nama; } public Matakuliah(String kode, String nama, List mahasiswas) { this.kode = kode; this.nama = nama; this.mahasiswas = mahasiswas; } @Id @Column(name="kode", unique=true, nullable=false, length=25) public String getKode() { return this.kode; } public void setKode(String kode) { this.kode = kode; } @Column(name="nama", nullable=false, length=50) public String getNama() { return this.nama; } public void setNama(String nama) { this.nama = nama; } @ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="matakuliahs") public List getMahasiswas() { return this.mahasiswas; } public void setMahasiswas(List mahasiswas) { this.mahasiswas = mahasiswas; } } //jasper report |
Langkah#3 Membuat Template Laporan Jasper Report
Untuk membuat template laporan paling enak adalah menggunakan iReport, tinggal drag n drop sudah jadi :D.
Buatlah template dengan nama reportsederhana yang kurang lebih bentuknya seperti ini
Disitu saya menggunakan 2 buah field dan 1 buah parameter. Field digunakan untuk menampilkan data matakuliah yang diambil dari database dan lewat hibernate collection object. Sedangkan parameter digunakan untuk menampilkan nama mahasiswa. Untuk gambar silahkan sesuaikan dengan selera Anda.
Setelah selesai mendesain template laporan, simpan dengan nama reportsederhana.jrxml lalu beserta file gambar yang digunakan kopikan ke package reportsederhana
File jrmxl yang saya buat seperti ini
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
<?xml version="1.0" encoding="UTF-8"?> <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="reportsederhana" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="17bfeba5-53fa-47a9-9765-1b81ae86a740"> <property name="ireport.zoom" value="1.0"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <parameter name="namaMahasiswa" class="java.lang.String"/> <parameter name="gambar" class="java.io.InputStream"/> <field name="nama" class="java.lang.String"/> <field name="kode" class="java.lang.String"/> <background> <band splitType="Stretch"/> </background> <title> <band height="102" splitType="Stretch"> <staticText> <reportElement uuid="3e17c21c-2249-4838-b7a2-b48e99fbcda7" x="134" y="22" width="360" height="67"/> <textElement> <font fontName="Arial Black" size="36"/> </textElement> <text><![CDATA[Daftar Matakuliah]]></text> </staticText> <image onErrorType="Blank"> <reportElement uuid="1df387d9-3f27-45dc-b3c5-e56f6daad146" x="0" y="0" width="121" height="102"/> <imageExpression><![CDATA[$P{gambar}]]></imageExpression> </image> </band> </title> <pageHeader> <band height="66" splitType="Stretch"> <staticText> <reportElement uuid="e7f75531-451b-4f53-a7c1-eca537b32050" x="95" y="7" width="100" height="20"/> <textElement/> <text><![CDATA[Nama Mahasiswa :]]></text> </staticText> <textField> <reportElement uuid="f95e613c-51ee-4a5a-b20b-f648ea660158" x="223" y="7" width="100" height="20"/> <textElement/> <textFieldExpression><![CDATA[$P{namaMahasiswa}]]></textFieldExpression> </textField> <staticText> <reportElement uuid="ca0af7bb-9f69-4d45-84ac-f190ac40abeb" x="95" y="39" width="100" height="20"/> <textElement/> <text><![CDATA[ Matakuliah :]]></text> </staticText> <staticText> <reportElement uuid="8c205227-41f0-437f-afb2-1b5765550a3a" x="223" y="39" width="100" height="20"/> <textElement/> <text><![CDATA[Nama Matakuliah]]></text> </staticText> <staticText> <reportElement uuid="0e03f0a6-adaa-427f-b7c6-a9a3ccc76a38" x="348" y="39" width="100" height="20"/> <textElement/> <text><![CDATA[Kode Matakuliah]]></text> </staticText> </band> </pageHeader> <detail> <band height="32" splitType="Stretch"> <textField> <reportElement uuid="d7d92714-b969-49e0-9540-8de0bef4f34d" x="223" y="10" width="108" height="20"/> <textElement/> <textFieldExpression><![CDATA[$F{nama}]]></textFieldExpression> </textField> <textField> <reportElement uuid="84c7cd02-d95e-4ae6-83f1-9746d712a397" x="348" y="10" width="100" height="20"/> <textElement/> <textFieldExpression><![CDATA[$F{kode}]]></textFieldExpression> </textField> </band> </detail> <pageFooter> <band height="54" splitType="Stretch"/> </pageFooter> <summary> <band height="42" splitType="Stretch"/> </summary> </jasperReport> |
Langkah#4 Membuat Class Service
Langkah keempat adalah membuat Class yang menangani pengambilan data dari database serta menangani laporan. Class ini biasa dinamakan Service. Sebenarnya dibawah Class Service ada lagi Class Repository atau DAO tetapi karena aplikasi kita kali ini simpel maka kita tidak memerlukan Repository/DAO.
Pada package reportsederhana.service buat 1 buah interface dengan nama MahasiswaService dan 1 buah Class implementasi dengan nama MahasiswaServiceImpl. Interface digunakan supaya adanya loosely coupled dengan membuat layering.
Ketikkan kode berikut pada MahasiswaService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package reportsederhana.service; import java.util.List; import reportsederhana.model.Mahasiswa; import reportsederhana.model.Matakuliah; public interface MahasiswaService { public Mahasiswa getMahasiswa(String nim); public void showReportDaftarKuliah(Mahasiswa mahasiswa,List matakuliahs); } //jasper report |
Jangan lupa buat implementasinya dalam Class MahasiswaServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package reportsederhana.service; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.xml.JRXmlLoader; import net.sf.jasperreports.view.JasperViewer; import org.hibernate.Session; import reportsederhana.model.Mahasiswa; import reportsederhana.model.Matakuliah; import reportsederhana.util.HibernateUtil; public class MahasiswaServiceImpl implements MahasiswaService{ @Override public Mahasiswa getMahasiswa(String nim) { Session session=HibernateUtil.getSessionFactory().openSession(); return (Mahasiswa) session.get(Mahasiswa.class, nim); } @Override public void showReportDaftarKuliah(Mahasiswa mahasiswa, List<Matakuliah> matakuliahs) { try { JRBeanCollectionDataSource beanCollection=new JRBeanCollectionDataSource(matakuliahs); Map<String,Object> map=new HashMap<String, Object>(); map.put("namaMahasiswa", mahasiswa.getNama()); map.put("gambar",MahasiswaServiceImpl.class.getResourceAsStream("/reportsederhana/JavaUniversity-Duke-150x111.gif")); InputStream input=MahasiswaServiceImpl.class.getResourceAsStream("/reportsederhana/reportsederhana.jrxml"); JasperDesign design=JRXmlLoader.load(input); JasperReport report=JasperCompileManager.compileReport(design); JasperPrint jasperPrint=JasperFillManager.fillReport(report, map, beanCollection); jasperPrint.setName("Laporan "+mahasiswa.getNama()); JasperViewer jv=new JasperViewer(jasperPrint, false); jv.setTitle("Laporan Mahasiswa"); jv.setVisible(true); } catch (JRException ex) { Logger.getLogger(MahasiswaServiceImpl.class.getName()).log(Level.SEVERE, null, ex); } } } //jasper report |
Perhatikan pada bagian ini
1 2 |
Map<String,Object> map=new HashMap<String, Object>(); map.put("namaMahasiswa", mahasiswa.getNama()); |
Pada kode diatas kita memasukkan item dengan nama “namaMahsiswa” yang mana merupakan parameter yang kita buat tadi pada template laporan jasper report, yang isi dari item tersebut adalah nama mahasiswa yang didapatkan dari mahasiswa.getNama()
Langkah#5 Membuat Tampilan Aplikasi Jasper Report
Langkah terakhir adalah membuat tampilan aplikasi. Tampilan yang saya rancang memiliki rupa seperti ini
Selanjutnya pada constructor tambahkan kode berikut supaya Form pada saat pertama kali muncul berada pada posisi ditengah-tengah layar monitor
1 2 3 4 5 6 |
public Framemain() { initComponents(); this.setLocationRelativeTo(null); //tambahkan baris ini } //jasper report |
Jika sudah beres semua, saatnya menambahkan Action Listener ke pada button dengan cara klik kanan Events > Action > actionPerformed. Pada kode yang digenerate tambahkan kode untuk menampilkan laporan sehingga menjadi seperti berikut ini
1 2 3 4 5 6 7 8 9 10 11 12 |
private void jButtonGenerateActionPerformed(java.awt.event.ActionEvent evt) { MahasiswaService mahasiswaService=new MahasiswaServiceImpl(); Mahasiswa mahasiswa=mahasiswaService.getMahasiswa(jTextField1.getText().trim()); if(mahasiswa==null){ JOptionPane.showMessageDialog(rootPane, "Data Mahasiswa Tidak Ada", "Nim Salah", JOptionPane.ERROR_MESSAGE); return; } mahasiswaService.showReportDaftarKuliah(mahasiswa, mahasiswa.getMatakuliahs()); } //jasper report |
Selesai!
Akhirnya selesai juga aplikasi laporan sederhana kita 😀
saatnya mengetes jalannya aplikasi
coba jalankan dan lihat hasilnya, masukkan nim mahasiswa dan laporan seharusnya muncul
Jika ada yang mengalami kesulitan saya persilahkan untuk diskusi bareng melalui fitur komentar pada artikel ini
Happy Coding 😀