JDBC知识详解(三)

简介: JDBC(java database connectivity)驱动程序是对JDBC规范完整的实现,它的存在在JAVA程序与数据库系统之间建立了一条通信的渠道。

JDBC知识详解(一)

JDBC知识详解(二)

JDBC事务

事务(Transaction) :数据库中保证交易可靠的机制。

计算机中使用到原子,基本是指某项不能在分或打开的。即不可再分的。例如:交易操作,即借钱中,一个账户的扣除和另一个账户的增加必须同时进行,这中间操作不可再分了。

隔离性演示:

如数据库未执行完,并未进行commit,那么对于同一影响的数据就不能够被操作,会在执行过程中类似于卡住,这是因为数据进行了加锁。(oracle数据库)

事务API

conn.setAutoCommit(false);//开启事务
conn.commit();//提交事务
conn.rollback();//回滚事务
交易测试案例
public class test {
    public static void main(String[] args) {
        pay("bob","cindy",100);
        pay("alice","bob",-100);
    }
    public static void pay(String from ,String to,double money ){
        String sql1="update k set balance=balance+ ? where name=? ";
        String sql2="select balance from k where name= ? ";
        Connection conn=null;
        try{
            conn=DBUtils.getConnection();
            conn.setAutoCommit(false);
            PreparedStatement ps=conn.prepareStatement(sql1);
            ps.setDouble(1,-money);
            ps.setString(2,from);
            int n=ps.executeUpdate();
            if (n!=1){
                throw new Exception("error");
            }
            //加余额
            ps.setDouble(1,money);
            ps.setString(2,to);
            n=ps.executeUpdate();
            if (n!=1){
                throw new Exception("ok");
            }
            ps.close();
            //检查
            ps=conn.prepareStatement(sql2);
            ps.setString(1,from);
            ResultSet resultSet=ps.executeQuery();
            while (resultSet.next()){
                double balance=resultSet.getDouble(1);
                if (balance<0){
                    throw new Exception("nonono");
                }
            }
            conn.commit();
        }catch (Exception e){
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }finally {
            DBUtils.close(conn);
        }
    }
}

JDBC批量处理

一个批处理是被发送到数据库以作为单个单元执行的一组更新语句。

批处理API

executeBatch()

int[] executeBatch() throws SQLException;

数组值可能是以下之一:

  • 大于或等于零的数字,表示命令已成功处理,并且是更新计数,给出了数据库中受命令影响的行数执行

  • SUCCESS_NO_INFO ( -2)的值,表示命令为处理成功,但受影响的行数为未知
  • 如果批量更新中的命令之一无法正确执行,此方法引发BatchUpdateException,JDBC driver可能会也可能不会继续处理剩余的命令。但是driver的行为是与特定的DBMS绑定的,要么总是继续处理命令,要么从不继续处理命令。如果驱动程序继续处理,方法将返回 EXECUTE_FAILED(-3)

批量执行SQL语句

public class ddl {
    public static void main(String[] args){
        String sql1="create table log_1 (id int(8),msg varchar(100))";
        String sql2="create table log_2 (id int(8),msg varchar(100))";
        Connection conn=null;
        try {
            conn= DBUtils.getConnection();
            Statement st=conn.createStatement();
            st.addBatch(sql1);
            st.addBatch(sql2);
            //执行一批SQL语句
            int [] ary=st.executeBatch();
            System.out.println(Arrays.toString(ary));
            System.out.println("ok");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtils.close(conn);
        }
    }
}

批量参数处理

import test.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Arrays;
public class test {
    public static void main(String[] args){
        String sql="insert into k (name,age,balance) values(?,?,?)";
        Connection conn=null;
        try {
            conn= DBUtils.getConnection();
            PreparedStatement ps=conn.prepareStatement(sql);
            for (int i=0;i<5;i++){
                //替换参数
                ps.setString(1,"doc");
                ps.setInt(2,25+i);
                ps.setInt(3,800);
                //将参数添加到ps缓存区
                ps.addBatch();
            }
            //批量执行
            int [] ary=ps.executeBatch();
            System.out.println(Arrays.toString(ary));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            DBUtils.close(conn);
        }
    }
}

防止OutOfMemory错误

如果Preparedstatement 对象中的SQL列表包含过多的待处理SQL语句可能会产生OutOfMemory错误。

可以采取分批次执行,可以避免内存溢出问题

if ((i+1)%4==0){
ps.executeBatch();
ps.clearBatch();
 }
}


目录
相关文章
|
安全 Java 数据处理
Java面试题:什么是Java中的Optional类及其使用场景?
Java面试题:什么是Java中的Optional类及其使用场景?
259 0
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
589 212
|
4天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
234 138
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
828 60
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1207 157
|
6天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
505 109