データベースに保存されている画像を取得するために、次のコードを試しました。 image_db
というテーブルを含むimage_details
というデータベースを作成しました。テーブルにはid
とimage_path
の2つのフィールドがあり、両方ともmediumblob
型です。image_path
フィールドにいくつかの画像をバイナリとして保存しました。今、それを取得して表示したい。
package cbir.imageAddition;
import Java.awt.Image;
import Java.awt.Toolkit;
import Java.io.ByteArrayOutputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.sql.ResultSet;
import Java.sql.SQLException;
import Java.sql.*;
enter code here
public class ImageRetrieve {
public ImageRetrieve() throws SQLException, IOException, ClassNotFoundException
{
Connection con = null;
Statement st = null;
ResultSet rs = null;
String url = "jdbc:mysql://localhost:3306/";
String db = "image_db";
String driver = "com.mysql.jdbc.Driver";
String user = "root";
String pass = "root";
Class.forName(driver);
con = DriverManager.getConnection(url + db, user, pass);
//System.out.println("Connection url : "+url + db);
st = con.createStatement();
String sql = "select image_path from image_details where id=1";
rs = st.executeQuery(sql);
InputStream stream = rs.getBinaryStream(2);
ByteArrayOutputStream output = new ByteArrayOutputStream();
int a1 = stream.read();
while (a1 >= 0) {
output.write((char) a1);
a1 = stream.read();
}
Image myImage = Toolkit.getDefaultToolkit().createImage(output.toByteArray());
output.close();
}
}
上記のコードを実行すると、次の例外が発生します。
awtJan 12, 2012 12:55:48 AM cbir.imageAddition.add_image_window jButton5ActionPerformed
SEVERE: null
Java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.Java:927)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.Java:841)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.Java:5650)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.Java:5570)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.Java:5610)
at cbir.imageAddition.ImageRetrieve.<init>(ImageRetrieve.Java:49)
at cbir.imageAddition.add_image_window.jButton5ActionPerformed(add_image_window.Java:280)
at cbir.imageAddition.add_image_window.access$400(add_image_window.Java:26)
at cbir.imageAddition.add_image_window$5.actionPerformed(add_image_window.Java:89)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.Java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.Java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.Java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.Java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.Java:252)
at Java.awt.Component.processMouseEvent(Component.Java:6504)
at javax.swing.JComponent.processMouseEvent(JComponent.Java:3321)
at Java.awt.Component.processEvent(Component.Java:6269)
at Java.awt.Container.processEvent(Container.Java:2229)
at Java.awt.Component.dispatchEventImpl(Component.Java:4860)
at Java.awt.Container.dispatchEventImpl(Container.Java:2287)
at Java.awt.Component.dispatchEvent(Component.Java:4686)
at Java.awt.LightweightDispatcher.retargetMouseEvent(Container.Java:4832)
at Java.awt.LightweightDispatcher.processMouseEvent(Container.Java:4492)
at Java.awt.LightweightDispatcher.dispatchEvent(Container.Java:4422)
at Java.awt.Container.dispatchEventImpl(Container.Java:2273)
at Java.awt.Window.dispatchEventImpl(Window.Java:2713)
at Java.awt.Component.dispatchEvent(Component.Java:4686)
at Java.awt.EventQueue.dispatchEventImpl(EventQueue.Java:707)
at Java.awt.EventQueue.access$000(EventQueue.Java:101)
at Java.awt.EventQueue$3.run(EventQueue.Java:666)
at Java.awt.EventQueue$3.run(EventQueue.Java:664)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.Java:76)
at Java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.Java:87)
at Java.awt.EventQueue$4.run(EventQueue.Java:680)
at Java.awt.EventQueue$4.run(EventQueue.Java:678)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.Java:76)
at Java.awt.EventQueue.dispatchEvent(EventQueue.Java:677)
at Java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.Java:211)
at Java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.Java:128)
at Java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.Java:117)
at Java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.Java:113)
at Java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.Java:105)
at Java..EventDispatchThread.run(EventDispatchThread.Java:90)
これはどのように引き起こされ、どのように解決できますか?
結果セットの最初の行にアクセスするには、rs.next()を呼び出す(およびtrueを返すことを確認する)必要があります。
if (rs.next() {
InputStream stream = rs.getBinaryStream(1);
...
また、クエリは1つの列のみを選択するため、インデックスが1であるべきではありません。
また、intをcharにキャストする意味がわかりません。メソッドは引数としてintを取ります。バイトへのキャストは少なくとも論理的ですが、Javaではバイトと文字は同じものではありません。
選択クエリを実行してResultSetオブジェクトを取得し、それを反復すると、この例外は発生しません。 ResultSet rs = null;
rs = statement.executeQuery( "select UUID_BINARY()");
if(rs.next()){
newTripUUID = rs.getBytes(1);
}