大家好,又见面了,我是你们的朋友全栈君。
JDBC Blob数据类型
PreparedStatement操作Blob类型数据
Blob是一个二进制大型对象
Statement不能操作Blob数据类型,以为Blob数据类型是无法使用字符串拼接的,PreparedStatement可以操作Blob数据类型 插入Blob
代码语言:javascript复制 //插入Blob
String sql = "insert into customers(name,email,birth,photo) values(?,?,?,?)";
java.sql.PreparedStatement ps = connection.prepareStatement(sql);
ps.setObject(1,"张宇豪");
ps.setObject(2,"zhang@qq.com");
ps.setObject(3,"1992-09-08");
FileInputStream fileInputStream = new FileInputStream(new File("play.jpg"));
ps.setBlob(4,fileInputStream);
ps.execute();
ps.close();
connection.close();
查询Blob
代码语言:javascript复制//查询Blob
String sql = "select id,name,birth,photo from customers where id = ?";
java.sql.PreparedStatement ps = connection.prepareStatement(sql);
ps.setInt(1,2);
ResultSet resultSet = ps.executeQuery();
if(resultSet.next()){
int id = resultSet.getInt(1);
String name = resultSet.getString(2);
String email = resultSet.getString(3);
Date birth = resultSet.getDate(4);
Blob photo = resultSet.getBlob(5);
//将Blob类型的字段下载下来,以文件的方式保存在本地
InputStream is = photo.getBinaryStream();
FileOutputStream fos = new FileOutputStream("zhangyuhao.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
}
ps.execute();
ps.close();
connection.close();
批量操作(主要指插入) PreparedStatement比Statement效率更高 原因:DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行,而数据库不会对Statement语句进行缓存
进一步优化: addBatch()方法 executeBatch() clearBatch()(和缓存的原理差不多) 注意:默认情况下mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
代码语言:javascript复制//批量插入
String sql = "insert into goods(name) values(?)";
java.sql.PreparedStatement ps = connection.prepareStatement(sql);
for(int i = 1;i <= 20000;i ){
ps.setObject(1,"name_" i);
ps.addBatch();
if(i % 500 == 0){
ps.execute();
ps.clearBatch();
}
}
进一步优化 设置connection.setAutoCommit(false),最后等所有sql语句执行完统一commit(相当于所有的语句都缓存起来了)。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168822.html原文链接:https://javaforall.cn