數據庫是程序不可或缺的一部分,每一個網站和服務器的建設都需要數據庫。對於大多數應用程序員(此處不包含數據庫開發人員)來說,我們更多的不是在DBMS中對數據庫進行操縱,而是在我們編寫的程序中對數據庫進行訪問,Java程序中一般都是通過JDBC來連接服務器並進行增刪改查操作的。下面,就來具體介紹一下JDBC編程。
根據所進行操作種類的不同,結構化查詢語言SQL分為三類,分別為:
(1)DQL:數據查詢語言 例:select
(2)DML:數據操縱語言 例:insert、update、delete
(3)DDL:數據定義語言 例:create
首先需要配置集成開發環境,本例中使用的IDE為MyEclipse2014,數據庫為MySQL數據庫。在我們進行編程之前,首先還要引用MySQL官方提供的jar包,該包中提供了數據庫驅動,數據庫驅動的加載是JDBC編程必不可缺的步驟。
引用jar包的步驟(在MyEclipse中):
(1)在項目路徑下建立lib文件夾
(2)下載獲得jar包,並復制到lib文件夾下
(3)右鍵單擊導入到lib文件夾中的jar包,選擇Build Path,之後添加到Build Path,添加到引用列表
在配置好了集成開發環境並引入MySQL的jar包後,我們就可以開始我們的JDBC編程了。
我們建立了一個存儲員工的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接口的類集。我們在准備的時候加載了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對象會占用內存,一旦內存使用完畢,也會阻礙程序的執行。因此,我們要在每次使用完這些對象後進行關閉。
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程序還可以利用配置文件,來將配置信息與程序分隔開來(這種方法被稱為軟編碼),這樣能夠避免在修改配置信息的時候修改程序,導致需要大量的對程序的重新測試。
常用的配置文件有兩種類型,一種是.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
仔細想一想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塊中包含的部分是只需要在類加載的時候執行的類,同時們把工具方法設置成靜態方法,方便調用。
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.博主也是正在學習路上的菜鳥,有想一起學習的小伙伴歡迎交流哈。