数据库连接
数据库连接步骤如下:
下载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(); } } |