본문 바로가기

Oracle/JDBC Image

Oracle JDBC Image example

Oracle JDBC Image 저장 및 가져오기


오라클 데이터베이스와 JDBC를 이용하여 이미지를 저장하고 가져와서 화면에 보여주는 예


우선 테스트용 테이블을 생성할 때 이미지를 저장할 수 있는 컬럼의 자료형을 BLOB 로 지정한다


create table EMP_IMG (EMPNO number, ENAME varchar2(20), IMAGE blob);



Screen Shot



사용된 이미지

Persian_Smile.zip



DB_ImgFrame.java

import java.awt.*;

import java.awt.image.*;

import java.io.*;

import java.sql.*;


import javax.imageio.*;

import javax.swing.*;

import javax.swing.border.*;


public class DB_ImgFrame extends javax.swing.JFrame {


    ImgPanel imgPanel;

    

    public DB_ImgJFrame() {

        setTitle("Oracle JDBC Image Insert, Retrieve example");

        initComponents();

        

        imgPanel = new ImgPanel();

        imgPanel.setBounds(0, 0,610, 410);

        imgPanel.setBorder(new LineBorder(Color.yellow));

        getContentPane().add(imgPanel);

    }

    

    /** 로컬 시스템의 파일을 DB에 저장 */

    private void insertImage() throws Exception

    {

        Connection conn = getConnection();

        PreparedStatement ps=conn.prepareStatement("insert into EMP_IMG values(?,?,?)");  

        ps.setInt(1,100);  

        ps.setString(2, "SMITH");

        

        FileInputStream fin=new FileInputStream("D:/test/Persian_Smile.jpg");


        ps.setBinaryStream(3, fin, fin.available());  

        int i = ps.executeUpdate();

        fin.close();


        System.out.println(i+" records affected");  

        conn.close();  

    }


    /** 메모리에 저장된 BufferedImage 를 데이터베이스에 저장 */

    private void insertImage(BufferedImage bi) throws Exception

    {

        Connection conn = getConnection();

        PreparedStatement ps=conn.prepareStatement("insert into EMP_IMG values(?,?,?)");  

        ps.setInt(1,100);  

        ps.setString(2, "SMITH");

        

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        ImageIO.write(bi, "png", baos);

        baos.flush();

        byte[] bytes = baos.toByteArray();

        

        ps.setBytes(3, bytes);

        int i = ps.executeUpdate();

        baos.close();

        System.out.println(i+" records affected");  

        conn.close();  

    }

    

    /** 데이터베이스로부터 이미지를 가져와서 BufferedImage로 리턴 */

    private BufferedImage getDBImage() throws Exception

    {

        Connection conn = getConnection();

        

        PreparedStatement ps = conn.prepareStatement("select empno, ename, image from emp_img where empno=100");

        ResultSet rs = ps.executeQuery();

        rs.next();

        InputStream in = rs.getBinaryStream(3);

        BufferedImage bi = ImageIO.read(in);

        

        in.close();

        rs.close();

        ps.close();

        conn.close();

        return bi;

    }

    

    /** 데이터베이스에 연결하고 Connection을 리턴 */

    public Connection getConnection()

    {

        Connection conn = null;

        Statement stmt = null;


        String jdbc_driver = "oracle.jdbc.OracleDriver";

        String db_url = "jdbc:oracle:thin:@localhost:1521:XE";


        try{

          Class.forName(jdbc_driver);

          conn = DriverManager.getConnection(db_url,"scott","tiger");

          return conn;

        }

        catch(Exception e) {

            e.printStackTrace();

        }

        return null;

    }


    /** 현재 프로젝트의 클래스와 동일한 패키지에 저장된 이미지 파일명을 ImgPanel에 전달하여 화면에 출력되도록 한다 */

    private void jButtonImgOpenActionPerformed(java.awt.event.ActionEvent evt) {                                               

        imgPanel.setImage("Persian_Smile.jpg");

        

    }                                              


    /** 데이터베이스에 이미지 저장 */

    private void jButtonDBSaveActionPerformed(java.awt.event.ActionEvent evt) {                                              


        try {

            insertImage();

            JOptionPane.showMessageDialog(this, "DB에 이미지 저장 성공");

            imgPanel.bi = null;

            imgPanel.repaint();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        

    }                                             


    /** 데이터베이스에서 이미지를 가져와서 ImgPanel 에 그린다 */

    private void jButtonGetDBImgActionPerformed(java.awt.event.ActionEvent evt) {                                                

        try {

            BufferedImage bi = getDBImage();

            imgPanel.bi = bi;

            imgPanel.repaint();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }                                               


    /** ImgPanel 상에 그려진 BufferedImage를 데이터베이스에 저장 */

    private void jButtonBufferedImgInsertActionPerformed(java.awt.event.ActionEvent evt) {                                                         

        BufferedImage bi = imgPanel.bi;

        try {

            insertImage(bi);

        } catch (Exception ex) {

            ex.printStackTrace();

        }

    }                                                        

    

    /** 화면에 그려진 그림을 지운다 */

    private void jButtonScreenRemoveActionPerformed(java.awt.event.ActionEvent evt) {                                                    

        imgPanel.bi = null;

        imgPanel.repaint();

    }                                                   


    /** 데이터베이스에 저장된 이미지를 포함한 행을 삭제 */

    private void jButtonDbImgDeleteActionPerformed(java.awt.event.ActionEvent evt) {                                                   

        Connection conn = getConnection();

        try{

            PreparedStatement ps = conn.prepareStatement("delete from emp_img");

            int rows = ps.executeUpdate();

            System.out.println("All rows deleted.");

            ps.close();

            conn.close();

        }catch(Exception e){

            e.printStackTrace();

        }

    }   


    public static void main(String args[]) {

         .................

         .................

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                new DB_ImgFrame().setVisible(true);

            }

        });

    }



ImgPanel.java

import java.awt.*;

import java.awt.image.*;

import java.io.*;

import javax.imageio.*;

import javax.swing.*;


public class ImgPanel extends JPanel

{

    BufferedImage bi;

    

    ImgPanel(){}

    

    /** 현재 프로젝트안에 저장된 이미지를 읽어서 BufferedImage를 생성한다 */

    public void setImage(String fileName)

    {

        try {

            bi = ImageIO.read(getClass().getResource(fileName));

            repaint();

        } catch (IOException ex) {

            ex.printStackTrace();

        }

    }


    /** 화면을 다시 그릴 때 자동으로 호출됨. 화면에 BufferedImage의 내용을 그린다 */

    @Override

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.drawImage(bi, null, 0, 0);

    }


}