Examples
This section gives an example to demonstrate storing and retrieving images. In this example, you will create a table, populate it with data (including images), and retrieve and display images. The table is named Country. Each record in the table consists of three fields: name, flag, and description. flag is an image field. The program first creates the table and stores data to it. Then the program retrieves the country names from the table and adds them to a combo box. When the user selects a name from the combo box, the country's flag and description are displayed, as shown in Figure 1.
Figure 1 The program enables you to retrieve data, including images, from a table and then displays them.
The example consists of two classes: DescriptionPanel (see Listing 1) and StoreAndRetrieveImage (see Listing 2). DescriptionPanel is a component for displaying a country's name, flag, and description. StoreAndRetrieveImage is the main class that initializes the table and creates the user interface using a DescriptionPanel and a combo box.
Follow these steps to create this project:
Create a package named jdbcdemo, create a new applet named StoreAndRetrieveImage, and create a new JavaBeans component named DescriptionPanel that extends JPanel using the JavaBeans wizard.
Build DescriptionPane as follows:
With DescriptionPane.java selected in the project pane, switch the UI designer. Drop a JSplitPane from the Swing Containers page to the center of the applet to create jSplitPane1. Drop a JPanel to the left of the split pane to create jPanel1 and a JScrollPane to the right of the split pane.
Set the layout of jPanel1 to BorderLayout. Drop an ImageViewer to the center of jPanel1 to create imageViewer1, and drop a JLabel to the south of jPanel1 to create jLabel1. Drop a JTextArea to the scroll pane to create jTextArea1.
Use BeansExpress to create the properties name, imageIcon, and description. Modify the set method in these properties to display the properties in imageViewer1, jLabel1, and jTextArea1, as shown in Listing 1.
Build StoreAndRetrieveImage as follows:
In the UI designer for StoreAndRetrieveImage.java, drop a JComobBox to the north of the applet to create jComboBox1, and drop a DescriptionPanel to the center of the applet to create descriptionPanel1.
In the Event tab of the inspector for jComboBox1, double-click the value field of itemStateChanged to generate a handler for the ItemEvent. Implement the handler to retrieve data from the database and display it in descriptionPanel1, as shown in Listing 1.
Implement the code for connecting the database, creating the table, populating data (including images) into the table, retrieving data, and displaying data, as shown in Listing 2.
Listing 1: DescriptionPanel.java
package jdbcdemo; import java.awt.*; import javax.swing.*; import imageviewerdemo.*; public class DescriptionPanel extends JPanel { BorderLayout borderLayout1 = new BorderLayout(); JPanel jPanel1 = new JPanel(); JScrollPane jScrollPane1 = new JScrollPane(); JTextArea jTextArea1 = new JTextArea(); BorderLayout borderLayout2 = new BorderLayout(); ImageViewer imageViewer1 = new ImageViewer(); JLabel jLabel1 = new JLabel(); private String name; private String description; private javax.swing.ImageIcon imageIcon; JSplitPane jSplitPane1 = new JSplitPane(); public DescriptionPanel() { try { jbInit(); } catch(Exception ex) { ex.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(borderLayout1); jTextArea1.setText("jTextArea1"); jPanel1.setLayout(borderLayout2); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jLabel1.setText("jLabel1"); this.add(jSplitPane1, BorderLayout.CENTER); jSplitPane1.add(jPanel1, JSplitPane.LEFT); jPanel1.add(imageViewer1, BorderLayout.CENTER); jPanel1.add(jLabel1, BorderLayout.SOUTH); jSplitPane1.add(jScrollPane1, JSplitPane.RIGHT); jScrollPane1.getViewport().add(jTextArea1, null); } public void setName(String newName) { name = newName; jLabel1.setText(name); } public String getName() { return name; } public void setDescription(String newDescription) { description = newDescription; jTextArea1.setText(description); } public String getDescription() { return description; } public void setImageIcon(javax.swing.ImageIcon newImageIcon) { imageIcon = newImageIcon; imageViewer1.setImage(imageIcon.getImage()); } public javax.swing.ImageIcon getImageIcon() { return imageIcon; } }
Listing 2: StoreAndRetrieveImage.java
package jdbcdemo; import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.sql.*; import java.io.*; public class StoreAndRetrieveImage extends JApplet { boolean isStandalone = false; DescriptionPanel descriptionPanel1 = new DescriptionPanel(); JComboBox jComboBox1 = new JComboBox(); // Connection to the database Connection connection; // Statement for static SQL statements Statement stmt; // Prepared statement PreparedStatement pstmt = null; /**Construct the applet*/ public StoreAndRetrieveImage() { } /**Initialize the applet*/ public void init() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } /**Component initialization*/ private void jbInit() throws Exception { this.setSize(new Dimension(400,300)); jComboBox1.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(ItemEvent e) { jComboBox1_itemStateChanged(e); } }); this.getContentPane().add(descriptionPanel1, BorderLayout.CENTER); this.getContentPane().add(jComboBox1, BorderLayout.NORTH); connectDB(); // Connect to DB storeDataToTable(); // Store data to the table (including image) fillDataInComboBox(); // Fill in combo box retrieveFlagInfo((String)(jComboBox1.getSelectedItem())); } private void connectDB() throws Exception { // Load the driver Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("Driver loaded"); // Establish connection connection = DriverManager.getConnection ("jdbc:oracle:thin:@liang.armstrong.edu:1521:test", "scott", "tiger"); System.out.println("Database connected"); // Create a statement for static SQL stmt = connection.createStatement(); // Create a prepared statement to retrieve flag and description pstmt = connection.prepareStatement("select flag, description " + "from Country where name = ?"); } private void storeDataToTable() { String[] countries = {"Canada", "UK", "USA", "Germany", "Indian", "China"}; String[] imageFilenames = {"c:\\radjb\\image\\ca.gif", "c:\\radjb\\image\\uk.gif", "c:\\radjb\\image\\us.gif", "c:\\radjb\\image\\germany.gif", "c:\\radjb\\image\\india.gif", "c:\\radjb\\image\\china.gif"}; String[] descriptions = {"A text to describe Canadian " + "flag is omitted", "British flag ...", "American flag ...", "German flag ...", "Indian flag ...", "Chinese flag ..."}; try { stmt.executeUpdate("drop table Country" ); System.out.println("Table Country removed."); } catch (Exception ex) { System.out.println(ex); } try { // Create the Country table stmt.executeUpdate("create table Country(" + "name varchar(30) not null, " + "flag blob, description varchar(1000), " + "primary key(name))"); System.out.println("Table Country created"); // Create a prepared statement to insert records PreparedStatement pstmt = connection.prepareStatement( "insert into Country values(?, ?, ?)"); // Store all predefined records for (int i=0; i<countries.length; i++) { pstmt.setString(1, countries[i]); // Store image to the table cell File file = new File(imageFilenames[i]); InputStream inputImage = new FileInputStream(file); pstmt.setBinaryStream(2, inputImage, (int)(file.length())); pstmt.setString(3, descriptions[i]); pstmt.executeUpdate(); } System.out.println("Table Country populated"); } catch (Exception ex) { ex.printStackTrace(); } } private void fillDataInComboBox() throws Exception { ResultSet rs = stmt.executeQuery("select name from Country"); while (rs.next()) { jComboBox1.addItem(rs.getString(1)); } } void jComboBox1_itemStateChanged(ItemEvent e) { retrieveFlagInfo((String)(e.getItem())); } private void retrieveFlagInfo(String name) { try { pstmt.setString(1, name); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { Blob blob = rs.getBlob(1); ImageIcon imageIcon = new ImageIcon( blob.getBytes(1, (int)blob.length())); descriptionPanel1.setImageIcon(imageIcon); descriptionPanel1.setName(name); String description = rs.getString(2); descriptionPanel1.setDescription(description); } } catch (Exception ex) { System.err.println(ex); } } }