Blob数据类型、数据库事务

Blob数据类型、数据库事务概述 MySQL 中 Blob 是一个二进制大型对象 是一个可以存储大量数据的容器 它能容纳不同大小的数据 说明 插入 Blob 类型的数据必须使用 PreparedStat 因为 Blob 类型的数据无法使用字符串拼接写 介绍 MySQL 的四种 Blob 类型 除了在存储的最大信息量上不同外 他们是等同的 实际使用中根据需要存入的数据大小定义不同的 Blob 类型

目录

Blob类型字段

批量插入

数据库事务

Blob类型字段


概述:MySQL中,Blob是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。

说明:插入Blob类型的数据必须使用PreparedStatement,因为Blob类型的数据无法使用字符串拼接写。

介绍:MySQL的四种Blob类型 (除了在存储的最大信息量上不同外,他们是等同的),实际使用中根据需要存入的数据大小定义不同的Blob类型。

Blob数据类型、数据库事务

注意:

  • 如果存储的文件过大,数据库的性能会下降
  • 如果在指定了相关的Blob类型以后,还报错:xxx too large,那么在mysql的安装目录下,找my.ini文件加上如下的配置参数:max_allowed_packet=16M,同时注意:修改了my.ini文件之后,需要重新启动mysql服务

代码实现:插入、查询Blob类型的数据

 //向数据表customers中插入Blob类型的字段 @Test public void testInsert() throws Exception { //获取连接 Connection conn = JDBCUtils.getConnection(); String sql = "insert into customers(name,email,birth,photo)values(?,?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql); //填充占位符 ps.setObject(1, "薛之谦"); ps.setObject(2, ""); ps.setObject(3, "1983-7-17"); //操作Blob类型的变量 FileInputStream is = new FileInputStream(new File("x.jpg")); ps.setBlob(4, is); //执行 ps.execute(); JDBCUtils.closeResource(conn, ps); } //查询数据表customers中Blob类型的字段 @Test public void testQuery() { Connection conn = null; PreparedStatement ps = null; InputStream is = null; FileOutputStream fos = null; ResultSet rs = null; try { conn = JDBCUtils.getConnection(); String sql = "select id,name,email,birth,photo from customers where id=?"; ps = conn.prepareStatement(sql); ps.setInt(1, 22); //执行 rs = ps.executeQuery(); if (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String email = rs.getString("email"); Date birth = rs.getDate("birth"); Customer cust = new Customer(id, name, email, birth); System.out.println(cust); //将Blob类型的字段下载下来,以文件的方式保存在本地 Blob photo = rs.getBlob("photo"); is = photo.getBinaryStream(); fos = new FileOutputStream("xzq.jpg"); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } JDBCUtils.closeResource(conn, ps, rs); } }

批量插入


概述: 当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。

JDBC的批量处理语句包括三个方法:

  1. addBatch(String):添加需要批量处理的SQL语句或是参数
  2. executeBatch():执行批量处理语句
  3. clearBatch():清空缓存的数据

通常两种批量执行SQL语句的情况:

  • 多条SQL语句的批量处理
  • 一个SQL语句的批量传参

代码实现:向数据表中插入20000条数据

#数据库中提供一个goods表。创建如下: CREATE TABLE goods( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) );
 @Test public void testInsert4() { Connection conn = null; PreparedStatement ps = null; try { long start = System.currentTimeMillis(); conn = JDBCUtils.getConnection(); //设置不允许自动提交数据 conn.setAutoCommit(false); String sql = "insert into goods(name)values(?)"; ps = conn.prepareStatement(sql); for (int i = 1; i <= 20000; i++) { ps.setObject(1, "name_" + i); //1."攒"sql ps.addBatch(); if (i % 500 == 0) { //2.执行 ps.executeBatch(); //3.清空batch ps.clearBatch(); } } //提交数据 conn.commit(); long end = System.currentTimeMillis(); System.out.println("执行的时间:" + (end - start)); //执行的时间:703 } catch (Exception e) { e.printStackTrace(); } finally { JDBCUtils.closeResource(conn, ps); } }

数据库事务


说明:这里只介绍JDBC中的事务处理,基本的数据库事务介绍可以参考博主之前的文章。

概述:一组逻辑操作单元,使数据从一种状态变换到另一种状态。(一组逻辑操作单元,一个或多个DML操作)

特点:

  • 数据一旦提交,就不可回滚
  • 数据什么时候被提交?
    • DDL操作一旦执行,会自动提交,set autocommit = false 对DDL操作失效
    • DML默认情况下一旦执行,就会自动提交,通过set sutocommit = false,取消DML操作的自动提交
    • 关闭数据库连接,数据就会自动的提交
    • 当一个连接对象被创建时,默认情况下是自动提交事务

JDBC程序中让多个SQL语句作为一个事务执行:

  • 调用Connection对象的setAutoCommit(false),以取消自动提交事务
  • 在所有的SQL语句都成功执行后,调用commit(), 方法提交事务
  • 在出现异常时,调用rollback()方法回滚事务

代码实现:用户AA向用户BB转账100

 //考虑数据库事务情况下的转账操作 @Test public void testUpdateWithTx() { Connection conn = null; try { conn = JDBCUtils.getConnection(); System.out.println(conn.getAutoCommit()); //true //1.取消数据的自动提交 conn.setAutoCommit(false); String sql1 = "update user_table set balance = balance - 100 where user = ?"; update(conn,sql1,"AA"); //模拟网络异常 //System.out.println(10/0); String sql2 = "update user_table set balance = balance + 100 where user = ?"; update(conn,sql2,"BB"); System.out.println("转账成功!"); //2.提交数据 conn.commit(); }catch (Exception e){ e.printStackTrace(); //3.回滚数据 try { conn.rollback(); } catch (SQLException throwables) { throwables.printStackTrace(); } } finally { //修改其为自动提交数据,主要针对于使用数据库连接池时 try { conn.setAutoCommit(true); } catch (SQLException throwables) { throwables.printStackTrace(); } JDBCUtils.closeResource(conn,null); } } //通用的增删改操作 ----version 2.0(考虑上事务) public int update(Connection conn,String sql,Object ...args) { PreparedStatement ps = null; try { //1.预编译sql语句,返回PreparedStatement实例 ps = conn.prepareStatement(sql); //2.填充占位符 for (int i = 0; i < args.length; i++) { ps.setObject(i+1,args[i]); } //3.执行 return ps.executeUpdate(); }catch (Exception e){ e.printStackTrace(); }finally { //4.资源关闭 JDBCUtils.closeResource(null, ps); } return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200928.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:18
下一篇 2026年3月20日 上午10:19


相关推荐

  • c++ string类头文件_printf用什么头文件

    c++ string类头文件_printf用什么头文件1.string与cstring有什么区别是C++标准库头文件,包含了拟容器classstd::string的声明(不过classstring事实上只是basic_string的typedef),用于字符串操作。是C标准库头文件<string.h>的C++标准库版本,包含了C风格字符串(NUL即’\0’结尾字符串)相关的一些类型和函数的声明,例如strcmp、strchr、strstr等。和<string.h>的最大区别在于,其中声明的名称都是位于std命名空间中的,而不是后

    2025年11月2日
    5
  • OpenVSCode Server监控与日志:全面了解系统运行状态

    OpenVSCode Server监控与日志:全面了解系统运行状态

    2026年3月12日
    3
  • 计算机病毒的分类

    计算机病毒的分类病毒与木马病毒:指编制或在计算机程序中插入的破坏计算机功能或破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或程序代码。木马:是一种后门程序,被黑客用作控制远程计算机的工具。木马与病毒不同的是,木马不会自我繁殖,并不会刻意地感染其他文件,它的作用就是为黑客打开远程计算机的门户,从而可以让黑客来远程控制计算机,使黑客获取有用的信息。病毒是自动破坏目标计算机,而木马需要人为的去操控…

    2022年5月3日
    48
  • 关于SpringCloud项目注册中心eruka切换nacos注册不成功记录

    关于SpringCloud项目注册中心eruka切换nacos注册不成功记录使用IDEA新建的项目,SpringBoot版本是2.1.9,引入的nacos版本是0.2.1.RELEASE,配置都是ok的,启动项目也没有报错,但是一直就是注册不上去,原因是因为SpringBoot的版本太高,nacos版本太低,导致不兼容,兼容版本SpringBoot版本是2.0.6.RELEASE,nacos版本是0.2.1.RELEASE…

    2022年8月21日
    6
  • webstrom的格式化代码快捷键

    webstrom的格式化代码快捷键windows下webstorm格式化代码的快键键Ctrl+Alt+lmac下webstorm格式化代码的快捷键Option+Command+lcentOS下webstorm格式化代码的快捷键Ctrl+Shift+l windows下webstorm格式化代码的快键键Ctrl+Alt+lmac下webstorm格式化代码的快捷键Option+Command+l…

    2022年5月2日
    45
  • Java中的反射——(1)什么是反射

    Java中的反射——(1)什么是反射

    2022年1月18日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号