user3608233 user3608233 - 11 days ago 5
Java Question

embed MS Access database with runnable jar

So my aim is to make a runnable jar. I've made a program using swings which uses MS Access database to fetch records. So, I've used an absolute path to refer to the database for connection.
Now, I intend to distribute this runnable jar to other people as well. So I guess the best option would be to embed the MS Access database as well in the jar file. But I don't know how to do that. Where should I keep the database in my Project Explorer ? Should I use a relative path etc. Any form of help would be appreciable.

I've found many tutorials for using Derby database that would implement the same but none pertaining to Ms Access database. Suggestions are welcome !

This is my code:-

import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.Vector;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class r_search extends JFrame implements ActionListener {

JFrame frame1;
JLabel l0, l1, l2;
JComboBox c1;
JButton b1;
Connection con;
ResultSet rs, rs1;
Statement st, st1;
PreparedStatement pst;
String ids;
static JTable table;
String[] columnNames = {"SECTION NAME", "REPORT NAME", "CONTACT", "LINK"};
String from;






r_search() {

l0 = new JLabel("Fetching Search Results...");
l0.setForeground(Color.blue);
l0.setFont(new Font("Serif", Font.BOLD, 20));
l1 = new JLabel("Search");
b1 = new JButton("submit");

l0.setBounds(100, 50, 350, 40);
l1.setBounds(75, 110, 75, 20);
b1.setBounds(150, 150, 150, 20);
b1.addActionListener(this);

setTitle("Search Executive Reports :) ");
setLayout(null);
//setVisible(true);
setSize(500, 500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

add(l0);
add(l1);;
add(b1);
try {
Vector v = new Vector();
String url="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + "C:\\users\\ppreeti\\executive_db.accdb";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection(url,"","");
/*con = DriverManager.getConnection("jdbc:oracle:thin:@mcndesktop07:1521:xe", "sandeep", "welcome");*/
st = con.createStatement();
rs = st.executeQuery("select index_name from Index1");
// Vector v = new Vector();
while (rs.next()) {
ids = rs.getString(1);
v.add(ids);
}
c1 = new JComboBox(v);
c1.setBounds(150, 110, 150, 20);

add(c1);
st.close();
rs.close();
} catch (Exception e) {
}
setVisible(true);
}

public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == b1) {
showTableData();
}

}

public void showTableData() {

frame1 = new JFrame("Database Search Result");
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame1.setLayout(new BorderLayout());
//TableModel tm = new TableModel();
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(columnNames);
//DefaultTableModel model = new DefaultTableModel(tm.getData1(), tm.getColumnNames());
//table = new JTable(model);
table = new JTable();
table.setModel(model);
table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
table.setFillsViewportHeight(true);
JScrollPane scroll = new JScrollPane(table);
scroll.setHorizontalScrollBarPolicy(
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
from = (String) c1.getSelectedItem();
//String textvalue = textbox.getText();
String uname = "";
String email = "";
String pass = "";
String cou = "";

try {
/* pst = con.prepareStatement("select * from emp where UNAME='" + from + "'");*/
pst = con.prepareStatement("select distinct Section.Section_Name,Report.Report_Name,Report.Link,Contact.Contact_Name "
+ "FROM (( Section INNER JOIN Report ON Report.Section_ID=Section.Section_ID ) INNER JOIN Contact ON Contact.Contact_ID=Report.Contact_ID ) LEFT JOIN Metrics ON Metrics.Report_ID=Report.Report_ID "
+ " WHERE Section.Section_Name LIKE '%"+from+"%' OR Report.Report_Name LIKE '%"+from+"%' OR Metrics.Metric_Name LIKE '%"+from+"%' OR Contact.Contact_Name LIKE '%"+from+"%' ");
ResultSet rs = pst.executeQuery();
int i = 0;
while (rs.next()) {
uname = rs.getString("Section_Name");
email = rs.getString("Report_Name");
pass = rs.getString("Contact_Name");
cou = rs.getString("Link");
model.addRow(new Object[]{uname, email, pass, cou});
i++;
}
if (i < 1) {
JOptionPane.showMessageDialog(null, "No Record Found", "Error", JOptionPane.ERROR_MESSAGE);
}
if (i == 1) {
System.out.println(i + " Record Found");
} else {
System.out.println(i + " Records Found");
}
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
frame1.add(scroll);
frame1.setVisible(true);
frame1.setSize(1000, 400);
}

public static void main(String args[]) {
new r_search();
}
}

Answer

The following worked for me using Eclipse and JavaSE-1.7. Eclipse shows the following in its Package Explorer

PackageExplorer.png

The [folders] and files in my project folder are

[C:]
   [Users]
      [Gord]
         [workspace]
            [com.example.jartest]
               [src]
                  [com]
                     [example]
                        [jartest]
                           JarTestMain.java
                           [resources]
                              JarData.mdb

The Java code in JarTestMain.java is

package com.example.jartest;

import java.io.*;
import java.nio.file.*;
import java.sql.*;

public class JarTestMain {

    public static void main(String[] args) {
        String mdbFileName = "JarData.mdb";
        String tempDbPath = System.getenv("TEMP").replace('\\', '/') + "/" + mdbFileName; 

        // retrieve .mdb database from the JAR file and save to %TEMP% folder
        InputStream strmIn = JarTestMain.class.getResourceAsStream("resources/" + mdbFileName);
        File f = new File(tempDbPath);
        try {
            Files.copy(strmIn, f.toPath(), StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // open the copy of the database in %TEMP% folder and read from its table
        String connectionString = 
                "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};" +
                "DBQ=" + tempDbPath;
        try (Connection con = DriverManager.getConnection(connectionString)) {
            Statement s = con.createStatement();
            ResultSet rs = s.executeQuery("SELECT * FROM Table1");
            while (rs.next()) {
                System.out.println(String.format(
                        "%d: %s", 
                        rs.getInt("ID"), 
                        rs.getString("TextField")));
            }
            rs.close();
            con.close();
            f.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

After I exported the project to a "Runnable JAR file" named JarTest.jar I was able to run it on my 32-bit Windows test machine using...

"C:\Program Files\Java\jre7\bin\java" -jar JarTest.jar

...and on my 64-bit Windows development machine via

"C:\Program Files (x86)\Java\jre7\bin\java" -jar JarTest.jar