一.preparedStatement的特点
1.结构框架
2.blob的插入
①插入blob数据(输入流)
FileInputStream fs = new FileInputStream(new File("girl.jpg"));
ps.setBlob(2, fs);
②查询blob数据(输出流)
Blob blob = rs.getBlob(2);
InputStream is = blob.getBinaryStream();
FileOutputStream fs = new FileOutputStream("fengjing.jpg");
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fs.write(buffer, 0, len);
}
fs.close();
is.close();
3.数据批处理
①statement插入
- 批量插入方式:通过statement来执行insert语句的拼接操作
- 缺点:一次执行一条sql语句,效率低
②使用preparedStatement批量操作(填充占位符)
- 批量插入方式:通过填充占位符来批量操作
- 缺点:由于SQL数据库执行的时间很快,但是每次都只传执行一次sql语句
- 核心代码:
//2.使用preparedStatement批量操作
@Test
public void testInsert1() throws Exception{
Connection conn = JDBCUtils.getConnection();
String sql = "insert into goods(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
long cus = System.currentTimeMillis();
for(int i = 0 ;i<20;i++){
ps.setObject(1, "lihua"+i);
ps.execute();
}
long cusm = System.currentTimeMillis();
System.out.println(cus-cusm);
JDBCUtils.closeResource(conn, ps);
}
③使用preparedStatement批量操作(积攒占位符)
- 批量插入方式:通过积攒占位符一次性传入即让数据库一次性执行多条语句
- 缺点:每一次执行都需一次commit,因为DML自动commit
- 核心代码:
//3.积攒sql的占位符一起
// 默认情况下 sql不支持batch(需要更改init以及更新驱动)
@Test
public void testInsert2() throws Exception{
Connection conn = JDBCUtils.getConnection();
System.out.println("连接获取成功");
String sql = "insert into goods(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
long cus = System.currentTimeMillis();
for(int i = 0 ;i<20000;i++){
ps.setObject(1, "lihua"+i);
ps.addBatch();
if(i%500==0)
{
ps.execute();
ps.clearBatch();
}
}
long cusm = System.currentTimeMillis();
System.out.println(cus-cusm);
JDBCUtils.closeResource(conn, ps);
}
④使用preparedStatement批量操作(延迟commit)
- 批量插入方式:通过延迟commit来提高速度
- 核心代码
//4.DML执行一次会commit一次,我们可以延迟到最后再commit
@Test
public void testInsert3() throws Exception{
Connection conn = JDBCUtils.getConnection();
String sql = "insert into goods(name) values(?)";
PreparedStatement ps = conn.prepareStatement(sql);
long cus = System.currentTimeMillis();
conn.setAutoCommit(false);
for(int i = 0 ;i<20000;i++){
ps.setObject(1, "lihua"+i);
ps.addBatch();
if(i%500==0)
{
ps.execute();
ps.clearBatch();
}
}
conn.commit();
long cusm = System.currentTimeMillis();
System.out.println(cusm-cus);
JDBCUtils.closeResource(conn, ps);