Võ Văn Hải's blog

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

Chèn và đọc hình từ cơ sở dữ liệu

Thao tác với dữ liệu BLOBs với JDBC.
Trong bài viết này, chúng ta cùng làm việc với trường hình ảnh(mở rộng ra là BLOBs – Binary Large Objects) với JDBC. Công việc của chúng ta sẽ là lưu hình từ 1 file vào cơ sở dữ liệu và đọc hình từ cơ sở dữ liệu ra lưu xuống 1 file.
Với JDBC, những công việc trên thật dễ dàng và có nhiều cách. Đây là một.
Cơ sở dữ liệu tôi sử dụng ở đây là my SQL. Bạn có thể dùng bằng MsSQL hay…
Đầu tiên bạn tạo bạng MyPictures với cấu trúc
Code:

create table MyPictures (
id INT PRIMARY KEY,
name VARCHAR(100),
photo BLOB
);

Bây giờ bạn có thể coding được rồi. Nhớ rằng project của bạn phải tham chiếu đến thư viện mysql jdbc driver nhé.
Code 1: Chèn hình từ file vào cơ sở dữ liệu:

package vovanhai.wordpress.com;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class InsertPictureToMySql {
	public static void main(String[] args) 
		throws Exception, IOException, SQLException {
		Class.forName("com.mysql.jdbc.Driver");
		String url="jdbc:mysql://localhost/vvhimagedb";
		Connection conn = DriverManager.getConnection(url, "root", "");
		String sql="insert into MyPictures(id,name,photo) values (?,?,?)";

		FileInputStream fis = null;
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			File file = new File("images/java.png");
			fis = new FileInputStream(file);
			ps = conn.prepareStatement(sql);
			ps.setString(1, "001");
			ps.setString(2, "java image");
			ps.setBinaryStream(3, fis, (int) file.length());
			ps.executeUpdate();
			conn.commit();
		} finally {
			ps.close();
			fis.close();
		}
	}
}

Code 2: Lấy hình từ cơ sở dữ liệu rồi lưu vào file

package vovanhai.wordpress.com;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class ReadPictureFromMySQL {
public static void main(String[] args) throws Exception{
Class.forName(“com.mysql.jdbc.Driver”);
String url=”jdbc:mysql://localhost/vvhimagedb”;
Connection conn = DriverManager.getConnection(url, “root”, “”);
String sql=”select * from mypictures”;
ResultSet rs=conn.createStatement().executeQuery(sql);
if(rs.next()){
int id=rs.getInt(1);
String name = rs.getString(2);
File image = new File(“c:\\java.png”);
FileOutputStream fos = new FileOutputStream(image);

byte[] buffer = new byte[1];
InputStream is = rs.getBinaryStream(3);
while (is.read(buffer) > 0) {
fos.write(buffer);
}
System.out.println(id+”; “+name);
fos.close();
conn.close();
}
}
}

OK

9 Responses to “Chèn và đọc hình từ cơ sở dữ liệu”

  1. Mai Phat Dat said

    Thầy ơi! Em có 1 đường dẫn ảnh trong cơ sở dữ liệu(MS Access), cho em hỏi làm sao mình load ảnh đó lên trang jsp được vậy thầy ,thầy có thể giải thích chi tiết cách làm dùm em được không ?.Trong cơ sở dữ liệu của em , bảng table có nhiều hàng ,cột , làm sao em có thể chỉ lấy dữ liệu tại 1 vị trí trong 1 cột của 1 hàng mà mình chọn bất kỳ để xuất ra trang jsp. (ví dụ :lấy dữ liệu của resulset thứ 3 ,cột thứ 5 ). Mong thầy giúp đỡ .Cám ơn thầy !

  2. Võ Văn Hải said

    1. Hình ảnh thì dùng tag img. VÍ dụ bảng cơ sở dữ liệu của em load lên trong 1 ResultSet có tên rs, trong đó có trường imagepath lưu trữ đường dẫn đến file hình. Code để load hình lên trang:

    <img src="<%=rs.getString("imagepath")%>" alt="img" width="200" height="200"/>
    

    2. Chuyển đến dòng mong muốn trong resultset, em dùng phương thức absolute, để lấy 1 cột nào đó thì em dùng phương thức getXXX. Với yêu cầu của em, code như sau:

    rs.absolute(3);
    String val=rs.getString(5);
    
  3. Mai Phat Dat said

    Em cảm ơn thầy nhiều !

  4. phuc said

    em cảm ơn thầy nhiều,

  5. Lee Tuấn said

    Dạ em chào thầy, thầy cho em hỏi chút ạ. Em đang làm 1 ứng dụng quản lý điện thoại di động, Em đã lưu hình ảnh từ file vào Database, bây giờ em có chức năng tìm kiếm, em muốn hiển thị ra 1 giao diện cả thông tin va hình ảnh của điện thoại tương ứng thì em phải làm thế nào ạ? Là hiển thị nhiều ảnh ra 1 Frame ạ.Em ỏi thêm nữa là ảnh em lưu trong Database kích thước lớn thì em hiển thị ra vậy có thu nhỏ kích thước được không ạ? Em cảm ơn thầy.

  6. Võ Văn Hải said

    Nếu bạn lưu hình nhiều và với kích thước lớn thì đùng bao giờ lưu vào cơ sở dữ liệu mà nên chứa nó trong 1 thư mục và chỉ lưu tên của hình mà thôi.
    Còn bạn muốn hiển thị nhiều hình thì bạn có dùng các picture box hoặc 1 panel nào đó. Hình bạn hoàn toàn có thể thu nhỏ được.

  7. vu thi hai said

    🙂

  8. Dạ em chào thầy.
    Thầy cho em hỏi. em mún lưu hình kiểu dữ liệu dạng Bitmap từ android vào trong csdl sql server thì như thế nào.
    Em cảm ơn thầy.

  9. Đây là cách em làm nhưng em không thể lưu vào được

    public void SaveImage() throws SQLException{

    byte[] bytes = bitmapToByteArray(selectedBitmap);

    String EMP_ID = editMsnv.getText().toString();
    Connect();
    String sql =(“Insert into FILB01AB(EMP_ID,PIC_DR) value(?,?)”);
    Log.e(“sql”, sql);

    PreparedStatement ps = null;
    try {
    conn.setAutoCommit(false);
    ps=conn.prepareStatement(sql);
    ps.setString(1, EMP_ID);
    ps.setBytes(2, bytes);
    ps.executeUpdate();
    conn.commit();
    } finally{
    // TODO Auto-generated catch block
    ps.close();
    }

    }

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: