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


目录
相关文章
|
存储 安全 算法
键值对Map
键值对Map
|
量子技术
中科大、浙大联合攻关诞生的中国首台光量子计算机到底有多牛?
今天上午(5月3日),中国科技界迎来了一则重磅消息!中国科学技术大学教授、中国科学院院士潘建伟在上海宣布,中国科研团队成功构建光量子计算机,首次演示了超越早期经典计算机的量子计算能力。 值得一提的是,这次演示的光量子计算机是“世界首台”,更是货真价实的“中国造”,由中国科学技术大学潘建伟教授及其同事陆朝阳、朱晓波等,联合浙江大学王浩华教授研究组共同攻关。
2189 0
|
7天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1738 116
|
8天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
1228 8
|
14天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1956 9
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
8天前
|
编解码 人工智能 安全
2核4G/4核8G/8核16G阿里云服务器如何选择实例?经济型e、通用算力型u2i与计算型c9i选哪个?
本文介绍了阿里云2核4G、4核8G、8核16G三档主流配置下经济型e、通用算力型u2i和计算型c9i三种实例的最新活动价格与适用场景。同配置下三者价差显著,以2核4G为例,经济型e低至599.93元/年,计算型c9i则高达1742.08元/年。文章详细解析了各实例的性能定位:经济型e适合轻负载入门场景,u2i兼顾稳定算力与性价比,c9i凭借第9代至强处理器与芯片级安全能力支撑高性能业务。同时提示用户可叠加满减优惠券享受折上折,建议根据业务负载与预算综合决策。
542 112
缓存 安全 IDE
900 2
|
20天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
2917 4