'Blob and JDBC: Image'에 해당되는 글 1건

  1. 2010.02.19 Blob and JDBC: Image
01.JAVA/Java2010. 2. 19. 17:44
반응형
/*

MySQL and Java Developer's Guide


Mark Matthews, Jim Cole, Joseph D. Gradecki
Publisher Wiley,
Published February 2003,
ISBN 0471269239

*/


import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Vector;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class IDlookGetStream extends JFrame {

  private JButton getAccountButton, updateAccountButton, insertAccountButton,
      nextButton, previousButton, lastButton, firstButton;

  private JList accountNumberList;

  private JTextField accountIDText, nailFileText, thumbIDText;

  private JTextArea errorText;

  private Connection connection;

  private Statement statement;

  private ResultSet rs;

  private ImageIcon icon = null;

  private ImageIcon iconThumbnail = null;

  JLabel photographLabel;

  public IDlookGetStream() {
    try {
      Class.forName("com.mysql.jdbc.Driver").newInstance();
    } catch (Exception e) {
      System.err.println("Unable to find and load driver");
      System.exit(1);
    }
  }

  private void loadAccounts() {
    Vector v = new Vector();
    try {
      rs = statement.executeQuery("SELECT * FROM thumbnail");

      while (rs.next()) {
        v.addElement(rs.getString("acc_id"));
      }
    } catch (SQLException e) {
      displaySQLErrors(e);
    }
    accountNumberList.setListData(v);
  }

  private void buildGUI() {
    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    accountNumberList = new JList();
    loadAccounts();
    accountNumberList.setVisibleRowCount(2);
    JScrollPane accountNumberListScrollPane = new JScrollPane(
        accountNumberList);

    //Do Get Account Button
    getAccountButton = new JButton("Get Account");
    getAccountButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          rs.beforeFirst();
          while (rs.next()) {
            if (rs.getString("acc_id").equals(
                accountNumberList.getSelectedValue()))
              break;
          }
          if (!rs.isAfterLast()) {
            accountIDText.setText(rs.getString("acc_id"));
            thumbIDText.setText(rs.getString("thumb_id"));
            Blob blob = rs.getBlob("pic");

            int b;
            InputStream bis = rs.getBinaryStream("pic");
            FileOutputStream f = new FileOutputStream("pic.jpg");
            while ((b = bis.read()) >= 0) {
              f.write(b);
            }
            f.close();
            bis.close();

            icon = new ImageIcon(blob.getBytes(1L, (int) blob
                .length()));
            createThumbnail();
            photographLabel.setIcon(iconThumbnail);
          }
        } catch (Exception selectException) {
          displaySQLErrors(selectException);
        }
      }
    });

    //Do Update Account Button
    updateAccountButton = new JButton("Update Account");
    updateAccountButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          byte[] bytes = new byte[50000];
          FileInputStream fs = new FileInputStream(nailFileText
              .getText());
          BufferedInputStream bis = new BufferedInputStream(fs);
          bis.read(bytes);

          rs.updateBytes("thumbnail.pic", bytes);
          rs.updateRow();
          bis.close();

          accountNumberList.removeAll();
          loadAccounts();
        } catch (SQLException insertException) {
          displaySQLErrors(insertException);
        } catch (Exception generalE) {
          generalE.printStackTrace();
        }
      }
    });

    //Do insert Account Button
    insertAccountButton = new JButton("Insert Account");
    insertAccountButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          byte[] bytes = new byte[50000];
          FileInputStream fs = new FileInputStream(nailFileText
              .getText());
          BufferedInputStream bis = new BufferedInputStream(fs);
          bis.read(bytes);

          rs.moveToInsertRow();
          rs.updateInt("thumb_id", Integer.parseInt(thumbIDText
              .getText()));
          rs.updateInt("acc_id", Integer.parseInt(accountIDText
              .getText()));
          rs.updateBytes("pic", bytes);
          rs.updateObject("sysobject", null);
          rs.updateTimestamp("ts", new Timestamp(0));
          rs.updateTimestamp("act_ts", new Timestamp(
              new java.util.Date().getTime()));
          rs.insertRow();
          bis.close();

          accountNumberList.removeAll();
          loadAccounts();
        } catch (SQLException insertException) {
          displaySQLErrors(insertException);
        } catch (Exception generalE) {
          generalE.printStackTrace();
        }
      }
    });

    photographLabel = new JLabel();
    photographLabel.setHorizontalAlignment(JLabel.CENTER);
    photographLabel.setVerticalAlignment(JLabel.CENTER);
    photographLabel.setVerticalTextPosition(JLabel.CENTER);
    photographLabel.setHorizontalTextPosition(JLabel.CENTER);

    JPanel first = new JPanel(new GridLayout(4, 1));
    first.add(accountNumberListScrollPane);
    first.add(getAccountButton);
    first.add(updateAccountButton);
    first.add(insertAccountButton);

    accountIDText = new JTextField(15);
    thumbIDText = new JTextField(15);
    errorText = new JTextArea(5, 15);
    errorText.setEditable(false);

    JPanel second = new JPanel();
    second.setLayout(new GridLayout(2, 1));
    second.add(thumbIDText);
    second.add(accountIDText);

    JPanel third = new JPanel();
    third.add(new JScrollPane(errorText));

    nailFileText = new JTextField(25);

    c.add(first);
    c.add(second);
    c.add(third);
    c.add(nailFileText);
    c.add(photographLabel);

    setSize(500, 500);
    show();
  }

  public void connectToDB() {
    try {
      connection = DriverManager
          .getConnection("jdbc:mysql://192.168.1.25/identification?user=spider&password=spider");
      statement = connection.createStatement(
          ResultSet.TYPE_SCROLL_INSENSITIVE,
          ResultSet.CONCUR_UPDATABLE);

    } catch (SQLException connectException) {
      System.out.println(connectException.getMessage());
      System.out.println(connectException.getSQLState());
      System.out.println(connectException.getErrorCode());
      System.exit(1);
    }
  }

  private void displaySQLErrors(Exception e) {
    errorText.append("Exception: " + e.getMessage() + "\n");
    //    errorText.append("State: " + e.getSQLState() + "\n");
    //  errorText.append("VendorError: " + e.getErrorCode() + "\n");
  }

  private void init() {
    connectToDB();
  }

  private void createThumbnail() {
    int maxDim = 350;
    try {
      Image inImage = icon.getImage();

      double scale = (double) maxDim / (double) inImage.getHeight(null);
      if (inImage.getWidth(null) > inImage.getHeight(null)) {
        scale = (double) maxDim / (double) inImage.getWidth(null);
      }

      int scaledW = (int) (scale * inImage.getWidth(null));
      int scaledH = (int) (scale * inImage.getHeight(null));

      BufferedImage outImage = new BufferedImage(scaledW, scaledH,
          BufferedImage.TYPE_INT_RGB);

      AffineTransform tx = new AffineTransform();

      if (scale < 1.0d) {
        tx.scale(scale, scale);
      }

      Graphics2D g2d = outImage.createGraphics();
      g2d.drawImage(inImage, tx, null);
      g2d.dispose();

      iconThumbnail = new ImageIcon(outImage);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    IDlookGetStream id = new IDlookGetStream();

    id.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });

    id.init();
    id.buildGUI();
  }
}

Posted by 1010