JDBC总结

本文介绍了JDBC事务的使用,包括如何开启和提交事务,以及在发生异常时如何回滚。同时,展示了批量处理在数据库操作中的优势,通过示例演示了如何执行批量SQL语句以提高效率。最后,讨论了数据库连接池的概念,解释了其在管理数据库连接中的作用,并列举了几种常见的连接池实现,如C3P0和Druid,以实现更高效的资源利用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.JDBC事务:

JDBC程序中当一个Connection对象创建时,默认情况下是自动提交事务:每次执行一个SQL语句时,如果执行成功,就会向数据库自动提交,而不能回滚。调用Connection的setAutoCommit(false)可以取消自动提交事务。在所有的SQL语句都成功执行后,调用commit();方法提交事务。在其中某个操作失败或出现异常时,调用rollback();方法回滚事务。

创建一个数据库:

CREATE TABLE ACCOUNT(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(32) NOT NULL DEFAULT '',
    balance DOUBLE NOT NULL DEFAULT 0) CHARACTER SET utf8;
INSERT INTO ACCOUNT VALUES(NULL,'小明',3000);
INSERT INTO ACCOUNT VALUES(NULL,'小红',10000);
SELECT * FROM ACCOUNT;

使用事务:

public static void main(String[] args) {
    Transaction_ transaction = new Transaction_();
    transaction.useTransaction();
}
//事务来解决
public void useTransaction() {
    Connection connection = null;
    String sql = "update account set balance = balance - 100 where id = 1";
    String sql2 = "update account set balance = balance + 100 where id = 2";
    PreparedStatement preparedStatement = null;
    try {
        connection = JDBCUtils.getConnection(); //在默认情况下,connection是默认自动提交
        //将 connection 设置为不自动提交
        connection.setAutoCommit(false); //开启事务
        preparedStatement = connection.prepareStatement(sql);
        preparedStatement.executeUpdate();
        preparedStatement.executeUpdate();
        preparedStatement = connection.prepareStatement(sql2);
        preparedStatement.executeUpdate();
        //提交事务
        connection.commit();
    } catch (SQLException e) {
        System.out.println("执行发生了异常,撤销执行的sql");
        try {
            connection.rollback();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        e.printStackTrace();
    } finally {
        JDBCUtils.close(null, preparedStatement, connection);
    }
}

2.批量处理:

批量处理允许多条语句一次性提交给数据库批量处理。addBatch():添加需要批量处理的SQL语句或参数。executeBatch():执行批量处理语句。clearBatch():清空批处理包的语句。JDBC连接MySQL时,要使用批处理功能,要在url中加参数?rewriteBatchedStatements=true

创建一个数据库:

CREATE TABLE admin2(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(32) NOT NULL,
    PASSWORD VARCHAR(32) NOT NULL);
SELECT COUNT(*) FROM admin2;
DROP TABLE admin2;

使用批量方式:

public static void main(String[] args) throws Exception {
    Batch_ batch = new Batch_();
    batch.batch();
}
//使用批量方式添加数据
public void batch() throws Exception {
    Connection connection = JDBCUtils.getConnection();
    String sql = "insert into admin2 values(null,?,?)";
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    System.out.println("开始执行");
    long start = System.currentTimeMillis();//开始时间
    for (int i = 0; i < 5000; i++) {
        preparedStatement.setString(1, "jack" + i);
        preparedStatement.setString(2, "666");
        preparedStatement.addBatch();
        if ((i + 1) % 1000 == 0) {
            preparedStatement.executeBatch();
            preparedStatement.clearBatch();
        }
    }
    long end = System.currentTimeMillis();//结束时间
    System.out.println("批量方式 耗时=" + (end - start));
    JDBCUtils.close(null, preparedStatement, connection);
}

3.数据库连接池:

预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。数据库连接池种类:C3P0数据库连接池;DBCP数据库连接池;Proxool数据库连接池;BoneCP数据库连接池;Druid是阿里提供的数据库连接池。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值