一、概述 1.為什麼要用JDBC 資料庫是程式不可或缺的一部分,每一個網站和伺服器的建設都需要資料庫。對於大多數應用程式員(此處不包含資料庫開發人員)來說,我們更多的不是在DBMS中對資料庫進行操縱,而是在我們編寫的程式中對資料庫進行訪問,Java程式中一般都是通過JDBC來連接伺服器併進行增刪改查 ...
一、概述
1.為什麼要用JDBC
資料庫是程式不可或缺的一部分,每一個網站和伺服器的建設都需要資料庫。對於大多數應用程式員(此處不包含資料庫開發人員)來說,我們更多的不是在DBMS中對資料庫進行操縱,而是在我們編寫的程式中對資料庫進行訪問,Java程式中一般都是通過JDBC來連接伺服器併進行增刪改查操作的。下麵,就來具體介紹一下JDBC編程。
2.SQL語言的分類
根據所進行操作種類的不同,結構化查詢語言SQL分為三類,分別為:
(1)DQL:數據查詢語言 例:select
(2)DML:數據操縱語言 例:insert、update、delete
(3)DDL:數據定義語言 例:create
二、JDBC編程所需要的準備
1.開發環境準備
首先需要配置集成開發環境,本例中使用的IDE為MyEclipse2014,資料庫為MySQL資料庫。在我們進行編程之前,首先還要引用MySQL官方提供的jar包,該包中提供了資料庫驅動,資料庫驅動的載入是JDBC編程必不可缺的步驟。
引用jar包的步驟(在MyEclipse中):
(1)在項目路徑下建立lib文件夾
(2)下載獲得jar包,並複製到lib文件夾下
(3)右鍵單擊導入到lib文件夾中的jar包,選擇Build Path,之後添加到Build Path,添加到引用列表
在配置好了集成開發環境並引入MySQL的jar包後,我們就可以開始我們的JDBC編程了。
2.資料庫準備
我們建立了一個存儲員工的WORKER表,建表語句如下:
1 create table WORKER ( 2 worker_num varchar(10), 3 worker_name varchar(20) not null, 4 worker_dept int(3), 5 worker_address varchar(50), 6 worker_sal int(5), 7 worker_level varchar(10), 8 constraint pk_worker_num primary key(worker_num), 9 );
三、開始編寫第一個JDBC程式
1.JDBC程式編寫流程:
(1)載入資料庫驅動
資料庫驅動,就是應用於特定資料庫的一套實現了JDBC介面的類集。我們在準備的時候載入了mysql資料庫對應的jar包,其中就有資料庫驅動。只有載入了資料庫驅動,才能夠繼續進行對資料庫的操作。
1 //載入資料庫驅動的代碼如下 2 Class.forName("com.mysql.jdbc.Driver");
其中,forName方法的參數由不同的資料庫決定,這裡我們載入的是MySQL資料庫的驅動。
(2)定義資料庫的url(統一資源定位符)
url是獲取連接的必須要素,其格式如下:協議、IP地址、埠號、資料庫名
我們定義的url如下:
String url = “jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8”
其中,jdbc:mysql為協議部分;localhost為IP地址,此處是本機;3306為MySQL的預設埠號;mydb為資料庫名;問號後面部分的作用是防止亂碼。
(3)獲得資料庫連接(Connection對象)
要想進行對資料庫的操作,首先需要獲得資料庫的連接對象,JDBC中我們使用DriverManager的靜態方法進行連接對象的初始化。
1 //獲得資料庫連接對象的代碼如下: 2 Connection conn = DriverManager.getConnection(url, userName, passWord);
其中getConnection方法有三個String類型的參數,分別為資料庫連接的url,資料庫登陸的用戶名和資料庫登陸的密碼。
(4)創建Statement並初始化
Statement是用來執行語句的,我們利用Connection的內置方法對Statement進行初始化,之後通過Statement對象執行SQL語句。
//創建Statement對象的代碼如下: Statement stmt = conn.createStatement();
其中,conn為已經獲得的Connection對象
(5)執行SQL語句
(6)釋放資料庫資源
資料庫資源是有限的,如果一直不釋放連接對象,那麼一旦達到上限,則之後的應用無法獲取連接對象,也就無法繼續程式的執行;同理,Statement對象會占用記憶體,一旦記憶體使用完畢,也會阻礙程式的執行。因此,我們要在每次使用完這些對象後進行關閉。
2.一個對資料庫進行DQL操作的例子
1 //連接資料庫,併進行查詢 2 public class JdbcTest { 3 public static void main(String[] args) { 4 String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8"; 5 String user = "root"; 6 String psw = "root"; 7 String sql = "select * from WORKER"; 8 Connection conn = null; 9 Statement stmt = null; 10 ResultSet rs = null; 11 try { 12 Class.forName("com.mysql.jdbc.Driver"); 13 conn = DriverManager.getConnection(url, user, psw); 14 stmt = conn.createStatement(); 15 rs = stmt.executeQuery(sql); 16 while(rs.next()) { 17 String workerNumber = rs.getString("worker_num"); 18 System.out.println(workerNumber); 19 } 20 21 } catch (ClassNotFoundException e) { 22 e.printStackTrace(); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 }finally { 27 try { 28 stmt.close(); 29 conn.close(); 30 } catch (SQLException e) { 31 e.printStackTrace(); 32 } 33 } 36 } 37 }
其中,ResultSet是結果集對象,用來接收查詢的結果,最後從結果集中獲得查詢到的數據,進行輸出。
四、JDBC程式編寫的改進
1.將配置文件與程式分離
工具類的抽象方法是將一段需要執行多次的代碼抽象出來,形成工具方法。除卻此改進外,JDBC程式還可以利用配置文件,來將配置信息與程式分隔開來(這種方法被稱為軟編碼),這樣能夠避免在修改配置信息的時候修改程式,導致需要大量的對程式的重新測試。
常用的配置文件有兩種類型,一種是.xml文件,另一種是.properties文件。在這裡由於我們需要的配置都是一些二維的基本字元串,所以可以採用.properties文件進行配置。
配置文件如下:
1 #db.properties 2 driver = com.mysql.jdbc.Driver 3 url = jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8 4 username = root 5 password = root
2.對可復用代碼的封裝
仔細想一想JDBC程式的執行過程,會發現有很多操作是每次進行資料庫連接都需要做的:如果我們有幾個需要操作資料庫的類需要連接相同的資料庫並對其執行數據操作,那麼我們就可以把獲得Connection對象的功能抽象出來,形成一個單獨的工具類。具體如下:
1 //工具類的編寫 2 public class JDBCUtils { 3 private static String driverClass; 4 private static String url; 5 private static String userName; 6 private static String passWord; 7 static {
//對資源文件的讀取 8 Properties p = new Properties(); 9 try { 10 p.load(JDBCUtils.class.getResourceAsStream("db.properties")); 11 } catch (IOException e) { 12 e.printStackTrace(); 13 } 14 driverClass = p.getProperty("driver"); 15 url = p.getProperty("url"); 16 userName = p.getProperty("username"); 17 passWord = p.getProperty("password"); 18 try { 19 Class.forName(driverClass); 20 } catch (ClassNotFoundException e) { 21 e.printStackTrace(); 22 } 23 } 24 public static Connection getConnection(){ 25 Connection conn = null; 26 try { 27 conn = DriverManager.getConnection(url, userName, passWord); 28 } catch (SQLException e) { 29 e.printStackTrace(); 30 } 31 return conn; 32 } 33 public static void closeAll(ResultSet result, Statement stmt, Connection conn) { 34 try { 35 result.close(); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 } 39 try { 40 stmt.close(); 41 } catch (SQLException e) { 42 e.printStackTrace(); 43 } 44 try { 45 conn.close(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 } 50 public static void closeAll(PreparedStatement stmt, Connection conn) { 51 try { 52 stmt.close(); 53 } catch (SQLException e) { 54 e.printStackTrace(); 55 } 56 try { 57 conn.close(); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 } 61 } 62 }
工具類的編寫中,我們用到了static塊,此處static塊中包含的部分是只需要在類載入的時候執行的類,同時們把工具方法設置成靜態方法,方便調用。
3.改進後的JDBC程式
1 public class NewGetWorker { 2 public static void main(String[] args) { 3 Connection conn = null; 4 Statement stmt = null; 5 ResultSet result = null; 6 String sql = "select * from WORKER"; 7 conn = JDBCUtils.getConnection(); 8 try { 9 stmt = conn.createStatement(); 10 result = stmt.executeQuery(sql); 11 while(result.next()) { 12 String workerNum = result.getString("worker_num"); 13 String workerName = result.getString("worker_name"); 14 String workerAddress = result.getString("worker_address"); 15 String workerLevel = result.getString("worker_level"); 16 System.out.println(workerNum + " " + workerName + " " + workerAddress + " " + workerLevel); 17 } 18 } catch (SQLException e) { 19 e.printStackTrace(); 20 }finally { 21 JDBCUtils.closeAll(result, stmt, conn); 22 } 23 24 } 25 }
由改進後的程式中可以看到,我們可以直接調用工具類中的方法獲取連接對象,同時在finally塊中調用工具類的close方法對對象進行關閉,這樣做有效的增加了代碼的復用性。
五、總結
JDBC是Java提供的一套與資料庫進行連接的API的集合。利用這些API,已經可以滿足日常開發中Java程式連接資料庫的需求。關於JDBC的內容遠不止於這一篇博文的介紹,還有很多後續知識的介紹。相信看過了這篇博文,大家會對JDBC程式的編寫已有了初步的瞭解,後續還會寫更多文章進行介紹。
ps.博主也是正在學習路上的菜鳥,有想一起學習的小伙伴歡迎交流哈。