当前位置: 首页 > news >正文

JDBC2:preparedStatement的优点(blob数据和批处理)

一.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);

相关文章:

  • 给政府做网站/医院网站建设方案
  • 门户网站建设和推广/seo是啥意思
  • 网站建设链接/湖南 seo
  • wordpress页面文本编辑评论/黑龙江新闻头条最新消息
  • emlog to wordpress/免费自助建站
  • 网站做微信支付接口/短视频赚钱app软件
  • 小程序开发 |微信公众平台SpringBoot开发实例 │ OAuth2.0网页授权应用开发
  • Python快速刷题网站——牛客网 数据分析篇(十五)
  • Gated-SCNN: Gated Shape CNNs for Semantic Segmentation
  • 实用水文篇--SpringBoot整合Netty实现消息推送服务器
  • 使用JS和CSS实现图片的3D透视效果及动画
  • LeetCode栈与队列应用——739.每日温度
  • 那些年我用国产内网穿透工具cpolar干的事
  • 【NLP开发】Python实现聊天机器人(微软Azure机器人服务)
  • Blog ACM竞赛
  • 物联网平台ThingsBoard源码讲解
  • 动态加载APP运行(原理篇)
  • 【韩顺平老师讲MySQL】创建数据库和表以及备份数据库