java数据库处理与事务机制

发表于:2017-9-22 12:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:HuiHui    来源:51Testing软件测试网采编

#
java
分享:
  数据库连接
  数据库连接步骤如下:
  下载mysql-connector-java的jar包,并导入
  加载注册驱动程序,Class.forName(“com.mysql.jdbc.Driver”)
  连接数据库
  conn = DriverManager.getCOnnection(DB_URL,USER,PASS)
  执行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);
  //数据库更新(删除)和插入相似
  关闭数据库连接
  rs.close();
  stmt.close();
  conn.close();
  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();
  }
  }
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号