Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Đọc hình từ MS SQL server rồi hiển thị lên JTable

Trong bài này tôi sẽ hướng dẫn bạn đọc hình từ MS SQL server rồi hiển thị lên JTable.
Để đọc 1 hình đưa thành một luồng, ta sử dụng ByteArrayOutputStream để lưu trữ hình tạm thời trước khi xử lý nó.

byte[] buffer = new byte[1024];
ByteArrayOutputStream bos=new ByteArrayOutputStream(); 
InputStream is = rs.getBinaryStream(2);
while (is.read(buffer) > 0) {
        bos.write(buffer);
}

Trong cáh đưa hình này lên JTable, ta phải chuẩn bị vài bước.
Thứ nhất là tại cột sẽ hiển thị hình, ta phải chỉ định ColumnClass cho nó phải là lớp ImageIcon.

dtm=new DefaultTableModel(header, 0){
	public java.lang.Class<?> getColumnClass(int columnIndex) {
		if(columnIndex==1)
			return ImageIcon.class;
		return Object.class;
	};			
};

Thứ hai là tạo 1 dòng dữ liệu để đưa nó lên bảng:

ImageIcon icon=new ImageIcon(bos.toByteArray());
Object []row={name,icon};
dtm.addRow(row);

Kết quả như sau:

Code hoàn chỉnh như sau:

package vovanhai.wordpress.com;

import java.awt.BorderLayout;
import java.awt.Font;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
 * Đọc dữ liệu trong DBMS rồi hiển thị trên JTable
 * @author VoVanHai
 * https://vovanhai.wordpress.com
 */
public class JTableImageFromDatabase extends JFrame{
	private DefaultTableModel dtm;
	private JTable table;
	
	public JTableImageFromDatabase() throws Exception{
		setTitle("https://vovanhai.wordpress.com");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(600,400);
		JLabel lbl=new JLabel("Get Image From Database & display on JTable",JLabel.CENTER);
		lbl.setFont(new Font("Arial",Font.BOLD,20));
		
		this.add(lbl,BorderLayout.NORTH);
		//Tạo Bảng
		String[]header={"Image path","Image preview"};
		dtm=new DefaultTableModel(header, 0){
			public java.lang.Class<?> getColumnClass(int columnIndex) {
				if(columnIndex==1)
					return ImageIcon.class;
				return Object.class;
			};			
		};
		this.add(new JScrollPane(table=new JTable(dtm)));
		table.setRowHeight(200);
		table.getTableHeader().setFont(new Font("Arial",Font.BOLD,16));
		//chèn dữ liệu vào
		LoadDBData2JTable();
	}
	/**
	 * Đọc dữ liệu từ cơ sở dữ liệu rồi dưa lên JTable
	 * @throws Exception
	 */
	public void LoadDBData2JTable() throws Exception{
		
		Connection conn=getConnection();
		String sql="select * from tblImages";
		ResultSet rs=conn.createStatement().executeQuery(sql);
		while(rs.next()){
			String name = rs.getString(1);
			byte[] buffer = new byte[1024];
			ByteArrayOutputStream bos=new ByteArrayOutputStream(); 
			InputStream is = rs.getBinaryStream(2);
			while (is.read(buffer) > 0) {
				bos.write(buffer);
			}
			ImageIcon icon=new ImageIcon(bos.toByteArray());
			Object []row={name,icon};
			dtm.addRow(row);
		}
		conn.close();
	}
	/**
	 * Tạo kết nối đền cơ sở dữ liệu 
	 * @return Connection
	 * @throws Exception
	 */
	private Connection getConnection()throws Exception{
		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		String url="jdbc:sqlserver://localhost:1433;databaseName=TestImageDB";
		Connection conn=DriverManager.getConnection(url,"sa","");
		return conn;
	}
	
	/**
	 * Hàm main
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args)throws Exception {
		new JTableImageFromDatabase().setVisible(true);
	}
}

Chúc các bạn thành công!

4 Responses to “Đọc hình từ MS SQL server rồi hiển thị lên JTable”

  1. Thưa thầy em muốn load hình ảnh từ cở sở dữ liệu là access lên table như thầy có được không ạ. Em có chạy demo bài thầy viết với cơ sở dữ liệu là access mà không được, thầy giúp em được không ạ.

  2. Lê Văn Thương said

    Bác Hải thân mếm. Hôm nay em có ghé qua blog của bác. Em thấy bác hướng dẫn những bài cơ bản về java hay quá. Em đang học lập trình java với cơ sở dữ liệu. Bác có cuốn ebook nào nói về lập trình cơ sở dữ liệu với java không. Nếu có thì bác có thể send cho em được không.

  3. Võ Văn Hải said

    Bạn cuốn này xem: Core Java – Advanced features

  4. lulu said

    Chào thầy !!!

    Thầy cho em hỏi là nếu connect sql mà dùng jboss thì nó thay đổi như thế nào, em test nó connect ok nhưng khi đổ data lên ResultSet em không biết làm thế nào cả

    ds = (DataSource) envContext.lookup(“java:/DefaultDS”);
    như dòng này rồi ráp vô chỗ này của thầy thì ráp làm sao em đang làm jms mà bị bí chỗ này

    String sql=”select * from tblImages”;
    ResultSet rs=conn.createStatement().executeQuery(sql);
    while(rs.next()){
    String name = rs.getString(1);
    }

    Cảm ơn thầy, chúc thầy ngày nhà giáo việt nam 20/11 nhiều niềm vui, luôn mạnh khỏe, hạnh phúc và gặt hái nhiều thành tựu trong công tác giảng dạy.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.