【JDBC】Connection数据库连接对象

Connection数据库连接对象

功能:

  1.获取执行sql的对象

Statement st = con.createStatement(String sql);
PreparedStatement pst = con.prepareStatement(String sql);

  2.管理事务

con.setAutoCommit(false); / 开启事务(设置参数为false)
						  ※在执行sql语句之前开启事务
						  
con.commit();			  / 提交事务
						  ※在所有sql语句执行完后提交事务
						  
con.rollback();			  / 回滚事务
 						  ※在catch块里回滚事务,还应该注意两点,一是要把捕捉的异常范围扩大,更改为Exception e;二是在con.rollback()之前先判断下con是否为空

[案例]

      江给河转1024块钱,江的账户减少1024,河的账户增加1024,这两步操作必须作为一个事务整体,要么同时成功,要么同时失败

package jdbc;

import java.sql.*;

public class JDBC {

    public static void main(String[] args) {
        / 1.导入Oracle驱动jar包(将ojdbc6.jar放在web/lib文件夹下)
        Connection con = null;
        PreparedStatement pst1 = null;
        PreparedStatement pst2 = null;
        try {
            / 2.注册驱动
            Class.forName("oracle.jdbc.OracleDriver");
            / 3.获取数据库连接对象(Connection)
            con = DriverManager.getConnection(
                    "jdbc:oracle:thin:@localhost:1521:orcl", / 数据库地址
                    "system",								 / 数据库用户名
                    "root" 									 / 数据库密码
            );
            / 开启事务
            con.setAutoCommit(false);
            
            / 4.定义SQL语句
            String sql1 = "UPDATE table_emp SET salary = salary - ? WHERE name = '江'";
            String sql2 = "UPDATE table_emp SET salary = salary + ? WHERE name = '河'";
            / 5.获取执行SQL语句的对象(PreparedStatement)
            pst1 = con.prepareStatement(sql1);
            pst2 = con.prepareStatement(sql2);
            pst1.setInt(1,1024);
            pst2.setInt(1,1024);
            
            / 手动制造异常来测试JDBC的管理事务(java.lang.ArithmeticException: / by zero)
            int i = 3/0;
            
            / 6.执行SQL语句
            pst1.executeUpdate();
            pst2.executeUpdate();
            
            / 提交事务
            con.commit();
            
        / 此时把要捕捉的异常更改为Exception e
        } catch (Exception e) {
            try {
                if (con != null) {
                    / 回滚事务
                    con.rollback();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            / 8.关闭资源
            if (pst1 != null) {
                try {
                    pst1.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (pst2 != null) {
                try {
                    pst2.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        }
    }

}

我寻见一片海 碧蓝且耀着光
大片船只航行其上 都向着远方

                         Shared by Foriver_江河



© 1997-8023 江河 All Rights Reserved.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值