java開發中JDBC連線資料庫的步驟
阿新 • • 發佈:2019-01-03
JDBC核心類
DriverManager 用於管理驅動/獲得連線
Connection 用於連線資料庫
Statement 用於執行SQL語句
ResultSet 使用者獲取執行結果,可以對資料庫欄位進行取出,修改,刪除等操作
完整java開發中JDBC連線資料庫包含7個步驟
1, 載入註冊JDBC驅動 在連線資料庫之前,首先要載入想要連線的資料庫的驅動到JVM(Java虛擬機器), 這通過java.lang.Class類的靜態方法forName(String className)實現。 Class.forName("com.mysql.jdbc.Driver");會丟擲ClassNotFoundException異常 (當驅動沒找到時),catch住提醒“MYSQL驅動載入失敗” 2,提供JDBC連線的URL 連線URL定義了連線資料庫時的協議、子協議、資料來源標識,使用者名稱,密碼。 ("jdbc:mysql://localhost/demo1?useUnicode=true&charcterEncoding= UTF-8","root","root") //協議://主機:埠號/資源路徑?查詢字串 3,通過驅動連線資料庫 要連線資料庫,需要向java.sql.DriverManager請求並獲得Connection物件, 該物件就代表一個數據庫的連線 使用DriverManager的getConnectin(String url , String username , String password )方法傳入指定的欲連線的資料庫的路徑、資料庫的使用者名稱和 密碼來獲得。 第一個引數叫"連線字串",用於設定連線到哪臺伺服器(localhost),哪個資料庫(demo1), 以及其他配置資訊(和資料庫的編碼一致).連線字串的格式由不同DBMS的驅動來規定, 具體檢視驅動的文件 第2,3個引數為使用者名稱,密碼 4,執行SQL包下面的預編譯sql語句物件Statement 要執行SQL語句,必須獲得java.sql.Statement例項,Statement例項分為以下3 種類型: A、執行靜態SQL語句。通常通過Statement例項實現。 B、執行動態SQL語句。通常通過PreparedStatement例項實現。 C、執行資料庫儲存過程。通常通過CallableStatement例項實現。 PreparedStatement ps = conn.prepareStatement("insert into T_Persons(Name,Age,Gender)values('無崖子',22,1)") ps.executeUpdate();//執行更新 5,執行SQL語句 Statement介面提供了三種執行SQL語句的方法:executeQuery 、executeUpdate 和execute A、ResultSet executeQuery(String sqlString):執行查詢資料庫的SQL語句 ,返回一個結果集(ResultSet)物件。 B、int executeUpdate(String sqlString):用於執行INSERT、UPDATE或 DELETE語句以及SQL DDL語句,如:CREATE TABLE和DROP TABLE等 C、execute(sqlString):用於執行返回多個結果集、多個更新計數或二者組合的 語句。 具體實現的程式碼: ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; int rows = stmt.executeUpdate("INSERT INTO ...") ; boolean flag = stmt.execute(String sql) ; 6, 處理結果 兩種情況: 1、執行更新返回的是本次操作影響到的記錄數。 2、執行查詢返回的結果是一個ResultSet物件。 • ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法提供了對這些 行中資料的訪問。 • 使用結果集(ResultSet)物件的訪問方法獲取資料: while(rs.next()){ String name = rs.getString("name") ; String pass = rs.getString(1) ; // 此方法比較高效 } (列是從左到右編號的,並且從列1開始) 7,關閉JDBC物件 操作完成以後要把所有使用的JDBC物件全都關閉,以釋放JDBC資源,關閉順序和聲 明順序相反: A、關閉記錄集 B、關閉宣告 C、關閉連線物件 preparedstatement是加工SQL的介面。 把sql的引數域編譯成確切的sql儲存起來! -------------------------------------------- public interface PreparedStatement extends Statement表示預編譯的 SQL 語句的物件。 SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。 ---------------------------------------------------------- 事務(Transaction)有四大特徵:原子性,一致性,隔離性,永續性。 原子性值得是”幾個操作要麼都成功,要麼都失敗“! JDBC事務 首先 1,設定Connection的setAutoCommit(false), 禁止自動提交; 2,操作結束執行conn.commit()提交事務; 3,如果執行出錯,則conn.rollback() 回滾(當前事務的操作全部取消)
案例:
1,對資料庫批量提交插入資料,先把資料裝箱,通過addBacth(),每滿多少筆時候提交一次executeBatch();
2,模擬銀行轉賬,通過連線資料庫 對某賬號進行 + - 金額
try
{
conn = JdbcUtils.createConnection();
conn.setAutoCommit(false);//通過事務禁止自動提交
ps1 = conn.prepareStatement("Update T_Employees Set Salary=Salary-10 where Name='Tom'" );
ps1.executeUpdate();
ps2 = conn.prepareStatement("Update T_Employees Set1 Salary=Salary+10 where Name='Jerry'");
ps2.executeUpdate();
conn.commit();//全部操作一致無誤後,提交
} catch (SQLException e)
{
conn.rollback();//如果操作中有誤,則回滾,之前的操作都不算
}
---------------------------------------------------------- 批量提交 採用批量提交:要配合事務使用,否則沒效果。把executeUpdate() 改成 addBatch(),在最後再ps.executeBatch(),看看用多長時間
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
* 案例1:通過批量提交插入,優化處理
* */
public class BatchTest2
{
public static void main(String[] args)
{
Connection conn= null;
PreparedStatement ps = null;
//計算用時 比較
long start = System.currentTimeMillis();
try
{
//建立資料庫連線,注意批量提交應確保連線中,要在事務中配合使用
conn = JDBCUtils.createConnection();
//批量提交配合事務使用,設定禁止自動提交
conn.setAutoCommit(false);
//建立預處理sql語句物件,共用此物件,
ps = conn.prepareStatement("insert into t_persons2(Name,Age,Gender) values(?,?,?)");
//設定插入引數值
for(int i = 0;i<10000;i++)
{
ps.clearParameters();//記住Statement重複使用要把上次設定的
查詢引數的值清空,才能繼續設定下一次的值
ps.setString(1, "東方白"+i);
ps.setInt(2, 25);
ps.setBoolean(3, true);
//ps.executeUpdate();// ,每次插入都通知mysql,
ps.addBatch(); //裝到"箱子裡" ,用批量提交則先把資料
加入到箱子裡面來 一次性批量提交箱子
//以每滿1000筆提交一次箱子,根據資料量而定
if(i%1000==0)
{
ps.executeBatch();//每1000筆提交一次
}
}
//把箱子中剩下的,餘下的沒滿1000的再提交一次
ps.executeBatch();//把"箱子裡"的命令一次提交給mysql
conn.commit();//在所有的操作之後,提交事務,
long end = System.currentTimeMillis();
System.out.println("耗時"+(end-start));
}
catch (SQLException e)
{
try
{
conn.rollback();//如果發生異常則回滾,剛才的操作都不算
} catch (SQLException e1)
{
System.out.println("回滾失敗");
}
e.printStackTrace();
}
finally
{
JDBCUtils.closeQuietly(conn);
}
}
}