PreparedStatement的优势:
-
解决Statement的拼串、sql问题
-
可以操作Blob的数据
-
可以实现更高效的批量操作
例如:
//设置
FileInputStream is = new FileInputStream(new File("girl.jpg"));
ps.setBlob(2,is);
//获取,将Blob类型的字段下载下来,以文件的方式保存在本地
Blob photo = rs.getBlob("photo");
InputStream is = photo.getBinaryStream();
FileOutputStream fos =
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}
如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数:max_allowed_packet=16M。同时,重启mysql服务
使用PreparedStatement实现批量数据的操作:
此时的批量操作,主要是指批量插入,update和delete本身就具有批量操作的效果
批量插入的方式一:
public class InsertTest{
@Test
public void testInsert1(){
Connection conn = null;
PreparedStatement ps = null;
try {
long start = System.currentTimeMillis();
conn = JDBCTools.getConnection2();
String sql = "insert into goods values (?)";
ps = conn.prepareStatement(sql);
for(int i = i;i <= 20000; i++){
ps.setObject(i,"name_" + i);
ps.execute();
}
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(ps, conn);
}
}
}
批量插入的方式二:
使用addBatch()、executeBatch()、clearBatch()
mysql服务器默认是关闭批处理的,需要通过一个参数,让MySQL开启批处理,
?rewriteBatchedStatements=true写在配置文件的url后面
public class InsertTest{
@Test
public void testInsert2(){
Connection conn = null;
PreparedStatement ps = null;
try {
long start = System.currentTimeMillis();
conn = JDBCTools.getConnection2();
String sql = "insert into goods values (?)";
ps = conn.prepareStatement(sql);
for(int i = i;i <= 20000; i++){
ps.setObject(i,"name_" + i);
//1、“攒”sql
ps.addBatch();
if(i % 500 == 0){
//2、执行batch
ps.executeBatch();
//3、清空batch
ps.clearBatch();
}
}
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(ps, conn);
}
}
}
批量插入的方式三:
设置不自动提交
public class InsertTest{
@Test
public void testInsert2(){
Connection conn = null;
PreparedStatement ps = null;
try {
long start = System.currentTimeMillis();
conn = JDBCTools.getConnection2();
//设置不自动提交
conn.setAutoCommit(false);
String sql = "insert into goods values (?)";
ps = conn.prepareStatement(sql);
for(int i = i;i <= 20000; i++){
ps.setObject(i,"name_" + i);
//1、“攒”sql
ps.addBatch();
if(i % 500 == 0){
//2、执行batch
ps.executeBatch();
//3、清空batch
ps.clearBatch();
}
}
//提交数据
conn.commit();
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCTools.release(ps, conn);
}
}
}


PreparedStatement在JDBC中提供多种优势,如解决SQL拼接问题、支持Blob数据操作及高效批量操作。当处理Blob类型遇到大小限制时,可通过调整mysql配置参数max_allowed_packet。批量操作包括批量插入、更新和删除,可以通过addBatch、executeBatch和clearBatch方法实现。开启MySQL批处理需在URL中添加?rewriteBatchedStatements=true,并设置事务不自动提交。
763

被折叠的 条评论
为什么被折叠?



