JDBC对与BLOB字段数据的处理


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import org.junit.Test;


public class JDBCTest {
/**
* 读取blob数据:
* 1.使用getBlob方法获取Blob对象
* 2.使用Blob对象的getBinaryStream()方法得到输入流,再使用IO输出流操作即可
* */
@Test
public void testReadBlob(){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
String sql = "select flow_id, "
+ "student_name studentName,"
+ "location,grade,picture from examstudent where "
+ "flow_id = 2";

preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();

if(resultSet.next()){
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
String location = resultSet.getString(3);
int grade = resultSet.getInt(4);
Blob picture = resultSet.getBlob(5);
System.out.println(id + ", "+ name +", "+location+", "+grade +", "+picture);

InputStream in =picture.getBinaryStream();
OutputStream out = new FileOutputStream("flower.jpg");

byte [] buffer = new byte[1024];
int len = 0;
while((len= in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally{

}
}

/**
* 插入Blob类型的数据必须使用PreparedStatement:
* 因为BLOB类型的数据无法使用字符串拼写的。
*
* 调用setBlob(int index ,InputStream inputstream)
* */
@Test
public void testInsertBlob(){
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection =  JDBCTools.getConnection();
String sql = "insert into examstudent(student_name,location,grade,picture) "
+ "values(?,?,?,?) ";
preparedStatement = connection.prepareStatement(sql);


preparedStatement.setString(1, "TOM");
preparedStatement.setString(2, "SHENZHEN");
preparedStatement.setInt(3, 98);

InputStream inputStream = new FileInputStream("116474.jpg");
preparedStatement.setBlob(4, inputStream);

preparedStatement.executeUpdate();


} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(null, preparedStatement, connection);
}
}
/**
* 获取数据库自动生成的主键
* */
@Test
public void testGetkeyValue() {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection =  JDBCTools.getConnection();
String sql = "insert into examstudent(student_name,location,grade) "
+ "values(?,?,?) ";
//preparedStatement = connection.prepareStatement(sql);

//使用重载的prepareStatement(sql,flag)
//来生成prepareStatement对象
preparedStatement = connection.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "TOM");
preparedStatement.setString(2, "SHENZHEN");
preparedStatement.setInt(3, 98);

preparedStatement.executeUpdate();

//通过preparedStatement的。getGeneratedKeys()方法获取包含了新生成的主键的ResultSet对象
resultSet = preparedStatement.getGeneratedKeys();
if(resultSet.next()){
System.out.println(resultSet.getObject(1));
}
ResultSetMetaData rsmd = resultSet.getMetaData();
for(int i = 0; i<rsmd.getColumnCount(); i++){
System.out.println(rsmd.getColumnName(i+1));
}
} catch (Exception e) {
e.printStackTrace();
} finally{
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}
}

}



----这里边主要遇到的问题
因mysql数据库驱动版本太低,导致抛出bug
今天在向mysql数据库中写入大文本时遇到了一个bug
Exception in thread “main” java.lang.AbstractMethodError: Method com/mysql/jdbc/PreparedStatement.setCharacterStream(ILjava/io/InputStream;J)V is abstract

这里可以更新mysql的驱动程序版本即可


猜你喜欢

转载自wangyaweinihao.iteye.com/blog/2326238