我需要创建一个JButton
来从oracle数据库下载BLOB文件。
这是我的JButton
代码:
JButton btnsave = new JButton("Save");
btnsave.setBounds(478, 542, 120, 23);
getContentPane().add(btnsave);
btnsave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
此类已连接到数据库,但这是我的代码的一部分:
Connection con;
String link="*******************************************";
String u="user";
String p="pw";
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection(link,u,p);
Statement su=con.createStatement();
那么如何在ActionListener
下载JButton
的blob文件?我还需要创建另一个声明吗?
提前致谢!
答案 0 :(得分:4)
您可以使用此代码(但我目前无法尝试)。 query
是查询,index
SELECT
clausole中的索引列,file
是输出文件。
// take the result of the query
ResultSet rs = su.executeQuery(query);
while(rs.next()) { // for each row
// take the blob
Blob blob = rs.getBlob(index);
BufferedInputStream is = new BufferedInputStream(blob.getBinaryStream());
FileOutputStream fos = new FileOutputStream(file);
// you can set the size of the buffer
byte[] buffer = new byte[2048];
int r = 0;
while((r = is.read(buffer))!=-1) {
fos.write(buffer, 0, r);
}
fos.flush();
fos.close();
is.close();
blob.free();
}
su.close();
同样,我目前无法尝试此代码。先测试一下,确保它的效果与您想要的一样。
答案 1 :(得分:0)
不建议在ActionListener中执行长操作。试试这种方法:
以下是一个例子:
private JButton button = new JButton(new ClickListener());
private LoaderListener blobLoaderListener = new BlobLoaderListener();
private byte[] blob;
private Connection con; // connection code is ommited
private class ClickListener extends AbstractAction {
@Override
public void actionPerformed(ActionEvent e) {
new SQLLoader(blobLoaderListener).start();
}
}
private class SQLLoader extends Thread {
private final LoaderListener listener;
public SQLLoader(LoaderListener listener) {
this.listener = listener;
}
public void run() {
byte[] blob = null;
try {
// create another statement here
Statement su = con.createStatement();
// perform you SQL query, get your 'blog'
// once you have done, notify listener
listener.onLoad(blob);
} catch (Exception e) {
// TODO: handle exception
listener.onError();
}
}
}
private interface LoaderListener {
void onLoad(byte[] blob);
void onError();
}
private class BlobLoaderListener implements LoaderListener {
@Override
public void onLoad(byte[] blob) {
BlobLoader.this.blob = blob;
// notify UI about changes
}
@Override
public void onError() {
// TODO
}
}