java数据库处理与事务机制

数据库连接

数据库连接步骤如下:

1、 下载mysql-connector-java的jar包,并导入
2、加载注册驱动程序,Class.forName(“com.mysql.jdbc.Driver”)
3、 连接数据库

conn = DriverManager.getCOnnection(DB_URL,USER,PASS)

4、执行sql语句

//创建用于执行sql语句的Statement对象
stmt = (Stattement)conn.createStatement();
//执行查询语句,返回查询结果
ResultSet rs = stmt.executeQuery("SELECT id,name FROM test");
while(rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    out.println("..."+id+"..."+name);
    out.println("<br />")
}
//执行插入语句,返回插入行数
String 失去了= “INSERT INTO test ...VALUES(...)”
stmt = (Statement)conn.create.Statement();
int count = stmt.executeUpdate(sql);
//数据库更新(删除)和插入相似

5、 关闭数据库连接

rs.close();
stmt.close();
conn.close();   

6、PrepareStatement
是Statement的子接口,可以传入带占位符的sqlyuju,提供补充占位符变量的方法

String sql = "insert into mysql_test values(?,?,?)"
PrepareStatement ps = conn.preprareStatement(sql);
ps.setString(1, '');
ps.setString(2, '');
ps.setString(3, '');
ps.execteUpdate();

Java事务处理

何为事物: 所有的操作要么同时完成,要么同时失败。在mysql中提供Commit和Rollback命令进行事务的提交与回滚。

java的事务处理类型有三种,JDBC、JTA(Java Transaction API)事务、容器事务。容器事务多用于Spring中。

JDBC事务处理机制

JDBC一切行为包括事务是基于一个connection的.
JDBC事务处理步骤:

  • 取消JDBC的自动提交

    void setAutoCommit(bollean autoCommit)=>setAutoCommit(false)

  • 执行各个sql语句,加入到批处理之中

  • 如若所有语句都执行成功,则提交事务commit(),如果出现错误,则回滚:roolback()

基本核心如下:

//取消自动提交
conn.setAutoCommit(false)
//将sql加入到批处理
stmt.addBatch();
stmt.addBatch();
//执行批处理操作
stmt.execteBatch();
//提交事务
commit();
//发生错误
try{
    rollback();
}

优缺点:

  • 可以将多个sql语句放到同一个事务中,保证ACID特性,API比较简单,性能好
  • 局限是:一个JDBC事务不能跨多个数据库

实例如下所示:

public static void example(){
    Connection conn = null;
}try{
    Class.forName("com.mysql.jdbc.Driver");
    conn = DreiverManager.getConnection("jdbc:ysql://localhost:3306/mysqltest", USSR, PASS);
    conn.setAutoCommit(false);//取消自动提交,改为手动提交
    String sql_1 = "update test_table set name='...' where name='...'";
    String sql_2 = "insert test_table (name,url) values('...',''),('','')";
    stmt = (Statement)conn.create.Statement();
    int count = stmt.executeUpdate(sql_1);
    //若所有结果执行完成,则执行提交事务
    stmt.execteUpdate(sql_2);
    conn.commit();
    ps.close();
    conn.close()
    catch(ClassNotFoundException e){
        e.printStackTrace();
    }catch(SQLException e){
        e.printStackTrace();
        try{
            //只要有一个sql语句错误,则事务回滚
            conn.rollback();
        }catch(SQLException e){
            e.printStackTrace();    
        }   
    }
}   

JTA事务处理

JDBC事务无法满足分布式数据库的处理,所以使用JTA,JTA是一个java企业版的应用程序接口,在java中,允许完成跨越多个XA资源的分布式事务
XA(数据库与事务管理器的接口标准,Oracle,DB2,Sybase提供XA支持)

JTA提供了java.transaction.UserTansaction,主要方法为:

  • begin:开启一个事务
  • commit:提交当前事务
  • rollback:回滚当前事务
  • setRollbackOnly:把当前事务标记为回滚
  • setTransactionTimeout:设置事务的事件,就是抛出异常,回滚事务

要想使用用 JTA 事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection 是参与 JTA 事务的 JDBC 连接。

要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。

XA连接(javax.sql.XAConnection)和非XA(java.sql.Connection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。

public void JtaTransfer() { 
        javax.transaction.UserTransaction tx = null;
        java.sql.Connection conn = null;
         try{ 
             tx = (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");  //取得JTA事务,本例中是由Jboss容器管理
             javax.sql.DataSource ds = (javax.sql.DataSource) context.lookup("java:/XAOracleDS");  //取得数据库连接池,必须有支持XA的数据库、驱动程序  
             tx.begin();
            conn = ds.getConnection();

             // 将自动提交设置为 false,
             //若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交
             conn.setAutoCommit(false);

             stmt = conn.createStatement(); 
             // 将 A 账户中的金额减少 500 
             stmt.execute("\
             update t_account set amount = amount - 500 where account_id = 'A'");
             // 将 B 账户中的金额增加 500 
             stmt.execute("\
             update t_account set amount = amount + 500 where account_id = 'B'");

             // 提交事务
             tx.commit();
             // 事务提交:转账的两步操作同时成功
         } catch(SQLException sqle){            
             try{ 
                 // 发生异常,回滚在本事务中的操做
              tx.rollback();
                 // 事务回滚:转账的两步操作完全撤销
                 stmt.close(); 
                 conn.close(); 
             }catch(Exception ignore){ 

             } 
             sqle.printStackTrace(); 
         } 
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值