一萬年太久,只爭朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 資料庫連接,主要提供編寫 Java 資料庫應用程式的 API 支持 java.sql包中定義的常用的基本的 JDBC API: 類 DriverManager-管理一組 JDBC ...
一萬年太久,只爭朝夕
What JDBC
上部
JDBC(Java DataBase Connectivity)Java 資料庫連接,主要提供編寫 Java 資料庫應用程式的 API 支持
java.sql包中定義的常用的基本的 JDBC API:
類 DriverManager-管理一組 JDBC 驅動程式的基本服務 介面 Connection-獲得與特定資料庫的連接
介面 Statement-用於執行靜態 SQL 語句並返回它所生成結果的對象
介面 ResultSet-表示資料庫結果集的數據表,通常通過執行
查詢資料庫的語句生成 類 SQLException-有關資料庫操作的異常
使用JDBC 訪問資料庫的前提條件
資料庫的主機地址(IP地址)localhost 127.0.0.1 如果你訪問的是別人的資料庫,記得輸入別人的IP
埠號:oracle 1521 ,MySql 3306, SqlServer 1433 因為我連得資料庫是oracle,Ojdbc14.jar包,千萬別忘了
數據的用戶名/密碼
JDBC核心API
Driver介面:驅動程式介面
Connection connect(String url, Properties info) 用於連接資料庫的方法
可以使用驅動程式管理類獲取這樣的連接
DriverManager.getConnection(String url, String user, String password)
Connection 介面 :代表和資料庫的連接
Statement createStatement() 創建Statement介面的對象
PreparedStatement prepareStatement(String sql) 創建PreparedStatement介面的對象
Statement介面 用於執行靜態sql語句
int executeUpdate(String sql) 執行DDL和DML語句,如果不記得什麼是DDL和DML,可以參考上一篇oracle基礎
ResultSet executeQuery(String sql) 執行DQL語句,同理
PreparedStatement介面 : 用於執行預編譯的sql語句
int executeUpdate(String sql) 執行DDL和DML語句
ResultSet executeQuery(String sql) 執行DQL語句
ResultSet介面:表示資料庫的結果集
boolean next() 將游標轉移到下一行的位置
getXXX() 獲取結果集中每列的值
很少用,瞭解
CallableStatement prepareCall(String sql)
CallableStatement介面 :(瞭解)用於存儲過程的SQL語句
下部
詳解DriverManager類
用DriverManager載入驅動,,獲得與資料庫的連接,
驅動設備管理器進行連接
Driver driver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(driver);
//推薦使用該方法
//驅動程式(只註冊一次)
Class.forName("oracle.jdbc.driver.OracleDriver");
關於url 的寫法
jdbc:oracle:thin:@localhost:1521:orcl
詳解Connection 類
用於與資料庫的連接,資料庫與客戶端的打交道都是由Connection方法來完成的,常用方法:
createStatement():創建向資料庫發送sql的statement對象。
prepareStatement(sql) :創建向資料庫發送預編譯sql的PrepareSatement對象。
setAutoCommit(boolean autoCommit):設置事務是否自動提交。
commit() :提交事務。
rollback() :回滾事務。
詳解Statement 介面
Statement對象用於向資料庫發送SQL語句, Statement對象常用方法:
executeQuery(String sql) :用於向數據發送查詢語句。
executeUpdate(String sql):用於向資料庫發送insert、update或delete語句
詳解ResultSet 介面
ResultSet用於代表Sql語句的執行結果。開始的時候,游標在第一行之前,調用ResultSet.next() 方法,可以使游標指向具體的數據行,進行調用方法獲取該行的數據。
ResultSet既然獲得資料庫執行後的對象,提供了獲取數據的get 方法
獲取指定類型的數據,例如:
getString(int index)
getString(String columnName)
ResultSet還提供了對結果集進行滾動的方法:
next():移動到下一行
關於釋放資源:
切記一點,一定要記得關閉,還有就是先開的後關,後開的先關。
詳解部分參照API文檔:
代碼展示
目錄結構:
1 package Jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 9 /** 10 * statement 用於執行靜態sql 但是實際開發很少用, PreparedStatement :用於執行預編譯的sql語句 11 * @author Administrator 12 * 13 */ 14 public class FirstJdbc { 15 16 private static String user = "scott"; 17 private static String password = "tiger"; 18 private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 19 20 public static void main(String[] args) throws ClassNotFoundException, SQLException { 21 22 // 載入驅動 23 24 Class.forName("oracle.jdbc.driver.OracleDriver"); 25 26 //獲取資料庫連接 27 28 Connection conn = DriverManager.getConnection(url, user, password); 29 30 System.out.println(conn); 31 // 下麵是輸出 conn 的結果 ;證明資料庫連接成功 32 //oracle.jdbc.driver.T4CConnection@5afec107 33 34 //準備sql語句 35 String sql = "select * from userinfo"; 36 37 //獲取用於向資料庫發送sql語句的statement 38 Statement stmt = conn.createStatement(); 39 //獲取資料庫連接對象 40 ResultSet rs = stmt.executeQuery(sql); 41 while(rs.next()){ 42 43 System.out.println("uname="+rs.getString("uname")); 44 System.out.println("upass="+rs.getString("upass")); 45 } 46 //關閉連接,釋放資源(遵循原則 先開喉管) 47 rs.close(); 48 stmt.close(); 49 conn.close(); 50 } 51 52 53 }
1 package Jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 10 public class SecondJdbc { 11 12 /** 13 * PreparedStatement :用於執行預編譯的sql語句,動態拼接sql ?作為占位符, 可以有效的防止Sql註入的問題 14 * 15 */ 16 private static Connection conn = null; 17 private static String user = "scott"; 18 private static String password = "tiger"; 19 private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 20 21 public static void main(String[] args) throws ClassNotFoundException, SQLException { //為了使頁面使頁面乾凈,在這裡處理的異常都向外拋出 22 // TODO Auto-generated method stub 23 24 // 載入驅動 25 26 Class.forName("oracle.jdbc.driver.OracleDriver"); 27 28 //獲取資料庫連接 29 30 Connection conn = DriverManager.getConnection(url, user, password); 31 32 System.out.println(conn); 33 // 下麵是輸出 conn 的結果 ;證明資料庫連接成功 34 //oracle.jdbc.driver.T4CConnection@5afec107 35 36 //準備sql語句 37 String sql = "insert into userinfo(uname,upass)values (?,?)"; 38 39 //獲取用於向資料庫發送sql語句的preparedStatement 40 PreparedStatement stmt = conn.prepareStatement(sql); 41 //設置參數 註意這裡的參數設置從1開始,不像數組等下標從0開始 42 stmt.setString(1,"張作霖"); 43 stmt.setString(2, "123"); 44 //獲取資料庫連接對象 45 int count = stmt.executeUpdate(); 46 //事務處理 47 if(count>0){ 48 conn.commit(); 49 }else{ 50 //這裡的rollback肯定執行不了,因為上面執行的sql(insert)用戶名是可以重覆的,用重名的可能性 51 conn.rollback(); 52 } 53 System.out.println("影響了"+count+"行"); 54 //關閉連接,釋放資源(遵循原則 先開喉管) 55 56 stmt.close(); 57 conn.close(); 58 } 59 60 }
1 package Jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 import javax.naming.Context; 10 import javax.naming.InitialContext; 11 import javax.naming.NamingException; 12 import javax.sql.DataSource; 13 14 15 /** 16 * 為了日後開發方便,不用頻繁的獲取驅動,獲取連接, 17 * 定義url ,資料庫,用戶名 等參數,所以自己封裝Jdbc工具類 18 * 19 */ 20 public class JdbcUtils { 21 22 //定義url 資料庫用戶名和密碼 23 private static Connection conn = null; 24 private static PreparedStatement pst; 25 private static String user = "scott"; 26 private static String password = "tiger"; 27 private static String url = "jdbc:oracle:thin:@localhost:1521:orcl"; 28 29 private JdbcUtils() { 30 } 31 32 //單例模式 33 public static Connection getcConnection() { 34 if (conn == null) { 35 try { 36 Class.forName("oracle.jdbc.driver.OracleDriver"); 37 conn = DriverManager.getConnection(url, user, password); 38 System.out.println("獲取connection連接成功"); 39 40 } catch (ClassNotFoundException e) { 41 System.out.println("載入驅動失敗"); 42 e.printStackTrace(); 43 } catch (SQLException e) { 44 System.out.println("連接資料庫失敗"); 45 e.printStackTrace(); 46 } 47 } 48 return conn; 49 50 } 51 //之前用作資料庫連接池連接,自己封裝,如果沒有用請忽略 52 /* public static Connection getPoolConnection(){ 53 if(conn==null){ 54 try { 55 Context context = new InitialContext(); 56 DataSource ds = 57 (DataSource) context.lookup("java:/comp/env/jdbc/oracleds"); 58 conn = ds.getConnection(); 59 System.out.println("連接池資料庫成功!"); 60 } catch (NamingException e) { 61 System.out.println("連接池資料庫失敗!"); 62 e.printStackTrace(); 63 } catch (SQLException e) { 64 System.out.println("連接池資料庫失敗!"); 65 e.printStackTrace(); 66 } 67 } 68 69 return conn; 70 }*/ 71 72 //關閉連接 73 public static void close() { 74 75 try { 76 if (conn != null) { 77 conn.close(); 78 conn = null; 79 } 80 if (pst != null) { 81 pst.close(); 82 pst = null; 83 } 84 System.out.println("關閉成功"); 85 } catch (SQLException e) { 86 System.out.println("關閉失敗"); 87 e.printStackTrace(); 88 } 89 90 } 91 92 // 執行更新操作 93 public static int executeUpdate(String sql, Object[] obj) { 94 int count = 0; 95 96 try { 97 pst = conn.prepareStatement(sql); 98 if (obj != null) { 99 for (int i = 0; i < obj.length; i++) { 100 pst.setObject(i + 1, obj[i]); 101 } 102 } 103 count = pst.executeUpdate(); 104 } catch (SQLException e) { 105 count = 0; 106 e.printStackTrace(); 107 } 108 109 return count; 110 } 111 //執行查詢操作,帶參數 112 public static ResultSet executeQuery(String sql, Object obj[]) { 113 ResultSet rs = null; 114 try { 115 pst = conn.prepareStatement(sql); 116 if (obj != null) { 117 for (int i = 0; i < obj.length; i++) { 118 pst.setObject(i + 1, obj[i]); 119 } 120 } 121 rs = pst.executeQuery(); 122 } catch (SQLException e) { 123 // TODO Auto-generated catch block 124 e.printStackTrace(); 125 } 126 127 return rs; 128 } 129 //執行查詢操作.無參數 130 public static ResultSet executeQuery(String sql) { 131 ResultSet rs = null; 132 133 try { 134 pst = conn.prepareStatement(sql); 135 rs = pst.executeQuery(); 136 } catch (SQLException e) { 137 // TODO Auto-generated catch block 138 e.printStackTrace(); 139 } 140 141 return rs; 142 } 143 //開始事物 144 public static void beginTransation() { 145 try { 146 conn.setAutoCommit(false); 147 System.out.println("開始事物"); 148 } catch (SQLException e) { 149 System.out.println("開始事物失敗"); 150 e.printStackTrace(); 151 } 152 153 } 154 //提交事物 155 public static void commit() { 156 try { 157 conn.commit(); 158 System.out.println("提交事物"); 159 } catch (SQLException e) { 160 System.out.println("提交事物失敗"); 161 e.printStackTrace(); 162 } 163 164 } 165 //回滾事物 166 public static void rollback(){ 167 try { 168 conn.rollback(); 169 System.out.println("回滾事務"); 170 } catch (SQLException e) { 171 System.out.println("回滾事務失敗"); 172 e.printStackTrace(); 173 } 174 } 175 }
資料庫表
select * from userinfo;
第一次代碼FirstJdbc 執行的結果:
第二次代碼SecondJdbc 執行的結果: