JDBC(六)PreparedStatement

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

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);
			}
		}
	}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值