- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- JDBC的擴展知識點(diǎn)總結
事務(wù)的ACID(acid)屬性
當一個(gè)連接對象被創(chuàng )建時(shí),默認情況下是自動(dòng)提交事務(wù):每次執行一個(gè) SQL 語(yǔ)句時(shí),如果執行成功,就會(huì )向數據庫自動(dòng)提交,而不能回滾
為了讓多個(gè) SQL 語(yǔ)句作為一個(gè)事務(wù)執行:
1. 調用 Connection 對象的 setAutoCommit(false); 以取消自動(dòng)提交事務(wù)
2.在所有的 SQL 語(yǔ)句都成功執行后,調用 commit(); 方法提交事務(wù)
3.在出現異常時(shí),調用 rollback(); 方法回滾事務(wù)
4.若此時(shí) Connection 沒(méi)有被關(guān)閉, 則需要恢復其自動(dòng)提交狀態(tài)
使用數據庫的事務(wù),我們需要配合異常處理try
public void testJDBCTransaction() { Connection conn = null; try { // 1.獲取數據庫連接 conn = JDBCUtils.getConnection(); // 2.開(kāi)啟事務(wù) conn.setAutoCommit(false); // 3.進(jìn)行數據庫操作 // 4.若沒(méi)有異常,則提交事務(wù) conn.commit(); } catch (Exception e) { e.printStackTrace(); // 5.若有異常,則回滾事務(wù) try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); }} finally { JDBCUtils.close(null, null, conn); } }
使用COMMIT 和 ROLLBACK語(yǔ)句,我們可以:
提交或回滾前的數據狀態(tài)
提交后的數據狀態(tài)
說(shuō)了這么多,還是使用代碼來(lái)舉例說(shuō)明更加清晰(數據庫連接的JDBCUtils類(lèi)上一章寫(xiě)過(guò)了):
package com.company.jdbcDemo; import com.company.jdbcDemo.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /* AA給CC轉賬1000 AA 2000 CC 2000 try{ 開(kāi)啟事務(wù) AA -= 1000 System.out.println(1/0); CC += 1000 提交(一旦提交數據不能再回滾(撤銷(xiāo))) }catch(Exception e){ 事務(wù)回滾(撤銷(xiāo)) } CREATE TABLE account( NAME VARCHAR(20), balance INT ) */ public class AccountDemo { public static void main(String[] args) throws SQLException { //1.獲取數據庫連接對象 Connection connection = JDBCUtils.getConnection(); PreparedStatement ps = null; try { //2.開(kāi)啟事物--禁止自動(dòng)提交 connection.setAutoCommit(false); //------------------------------------------------------------------- //3.做具體的操作---執行sql語(yǔ)句 //預編譯 String sql = "update account set balance=? where name=?"; ps = connection.prepareStatement(sql); //給占位符賦值 ps.setInt(1, 1000); ps.setString(2, "aa"); //執行sql ps.executeUpdate(); System.out.println(1 / 0); //給占位符賦值 ps.setInt(1, 3000); ps.setString(2, "cc"); //執行sql ps.executeUpdate(); //------------------------------------------------------------------- //4.事務(wù)提交 connection.commit(); }catch (Exception e){ e.printStackTrace(); //5.事務(wù)回滾 connection.rollback(); }finally { //6.允許自動(dòng)提交 connection.setAutoCommit(true); //7.關(guān)閉資源----最后關(guān)閉資源 JDBCUtils.close(ps,connection); } } }
概述
前面我們的示例代碼中,一直在調用我寫(xiě)的那個(gè)JDBCUtils類(lèi)來(lái)完成數據庫的連接,如果我們在別的工程中,就需要復制一下我的那個(gè)類(lèi),并且我寫(xiě)的那個(gè)也不是很?chē)乐?我前面實(shí)現的數據庫連接方式存在以下問(wèn)題:
使用數據庫連接池
阿里德魯伊連接池技術(shù)首先分為兩步:
1.加入jar包
例如:druid-1.1.10.jar
2.代碼步驟
第一步:建立一個(gè)數據庫連接池
第二步:設置連接池的參數
第三步:獲取連接
使用德魯伊連接數據庫的方式一
//1、創(chuàng )建數據源(數據庫連接池)對象 DruidDataSource ds =new DruidDataSource(); //2、設置參數 //(1)設置基本參數 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://localhost:3306/test"); ds.setUsername("root"); ds.setPassword("mysql123"); //3、獲取連接 Connection conn = ds.getConnection(); //如果這里沒(méi)有關(guān)閉,就相當于沒(méi)有還 conn.close();
使用德魯伊連接數據庫的方式二
// 創(chuàng )建配置文件druid.properties url=jdbc:mysql://localhost:3306/0319db ?rewriteBatchedStatements=true username=root password=123456 driverClassName=com.mysql.jdbc.Driver 代碼如下: Properties pro = new Properties(); pro.load(TestDruid2.class.getClassLoader().getResourceAsStream("druid.properties")); DataSource ds= DruidDataSourceFactory.createDataSource(pro); Connection conn = ds.getConnection();
這里注意了,德魯伊配置文件中的key,必須跟我下面一樣,否則連接不成功哦
// druid.properties內容 url=jdbc:mysql://localhost:3306/demo username=root password=123321 driverClassName=com.mysql.jdbc.Driver
我就直接上操作了,這里還是使用我前面實(shí)現的那個(gè)JDBCUtils類(lèi)哈,偷個(gè)懶…
package com.company.jdbc2; import com.company.jdbc.JDBCUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.junit.Test; import java.sql.SQLException; import java.util.List; /* 通過(guò)使用DBUtils工具類(lèi)實(shí)現增,刪,改,查的操作 */ public class DBUtilsDemo { @Test public void test() throws SQLException { //1.創(chuàng )建操作對象 QueryRunner queryRunner = new QueryRunner(); //2.增,刪,改是一個(gè)方法 /* update(Connection conn, String sql, Object param) conn : 連接對象 sql : sql語(yǔ)句 param : 給占位符賦值的內容 */ String sql = "insert into student(sid,sname,sage) values(?,?,?)"; //返回值 :有幾條數據受到影響 int i = queryRunner.update(JDBCUtils.getConnection(), sql, 10, "kongkong", 18); System.out.println("有" + i + "條數據受到影響"); } @Test public void test2() throws SQLException { QueryRunner queryRunner = new QueryRunner(); /* query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) conn : 連接對象 sql : sql語(yǔ)句 */ String sql = "select sid a,sname,sage from student where sid=?"; //注意:類(lèi)中的屬性名一定要和字段名相同。如果不相同則需要在sql語(yǔ)句中使用別名 // Student student = queryRunner.query(JDBCUtils.getConnection(), sql, // new BeanHandler<Student>(Student.class), 10); sql = "select sid a,sname,sage from student"; List<Student> list = queryRunner.query(JDBCUtils.getConnection(), sql, new BeanListHandler<Student>(Student.class)); for (Student s : list) { System.out.println(s); } } }
使用批處理
當我們需要對進(jìn)行大批量的數據操作時(shí),可以采用批處理技術(shù),很簡(jiǎn)單,在url中添加批處理的參數
jdbc:mysql://localhost:3306/Demo?rewriteBatchedStatements=true
示例代碼,(咳咳,依舊是我那個(gè)JDBCUtils實(shí)現連接的工具類(lèi)…)
package com.company.jdbc3; import com.company.jdbc.JDBCUtils; import org.junit.Test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /* 批處理: */ public class BatchDemo { /* 使用批處理: 1.mysql驅動(dòng)包的版本必須為5.1.3x 才支持批處理 2.在url連接中添加如下參數 jdbc:mysql://localhost:3306/Demo?rewriteBatchedStatements=true 3.使用一些API: //添加到批處理中 ps.addBatch(); //執行批處理 ps.executeBatch(); //清空批處理 ps.clearBatch(); */ @Test public void test2() throws SQLException { //1.獲取數據庫連接 Connection connection = JDBCUtils.getConnection(); //2.預編譯 PreparedStatement ps = connection.prepareStatement( "insert into student(sid,sname,sage) values(?,?,?)"); //3.給占位符賦值 for (int i = 1; i <= 100000 ; i++) { ps.setInt(1,i); ps.setString(2,"aaa"+i); ps.setInt(3,i); //添加到批處理中 ps.addBatch(); if (i % 1000 == 0){ //執行sql ps.executeBatch();//執行批處理 //清空批處理 ps.clearBatch(); } } //4.關(guān)資源 JDBCUtils.close(ps,connection); } @Test public void test() throws SQLException { //1.獲取數據庫連接 Connection connection = JDBCUtils.getConnection(); //2.預編譯 PreparedStatement ps = connection.prepareStatement( "insert into student(sid,sname,sage) values(?,?,?)"); //3.給占位符賦值 for (int i = 1; i <= 100000 ; i++) { ps.setInt(1,i); ps.setString(2,"aaa"+i); ps.setInt(3,i); //執行sql ps.executeUpdate(); } //4.關(guān)資源 JDBCUtils.close(ps,connection); } }
到此這篇關(guān)于JDBC的擴展知識點(diǎn)總結的文章就介紹到這了,更多相關(guān)JDBC知識點(diǎn)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2