|
首先要加載數(shù)據(jù)庫相應(yīng)的驅(qū)動(dòng),以mysql為例 下載mysql的java驅(qū)動(dòng),例如 mysql-connector-java-8.0.1 這就是mysql的驅(qū)動(dòng),把它放到項(xiàng)目當(dāng)中建立依賴,就可以使用相關(guān)API操作mysql數(shù)據(jù)庫了
先來一個(gè)簡單的使用示例(并不規(guī)范) public static void main(String[] args) throws ClassNotFoundException, SQLException { 從現(xiàn)在開始正式介紹jdbc
1.注冊(cè)驅(qū)動(dòng)(介紹三種方式)
由于只有先通過DriverManager注冊(cè)驅(qū)動(dòng),才能獲得數(shù)據(jù)庫連接,所以第一步要先注冊(cè)驅(qū)動(dòng) 注冊(cè)驅(qū)動(dòng)的關(guān)鍵就是 DriverManager.registerDriver(所使用的數(shù)據(jù)庫對(duì)應(yīng)的驅(qū)動(dòng)類); ①(推薦方式) Class.forName("com.mysql.jdbc.Driver"); 這種方式為什么能注冊(cè)驅(qū)動(dòng)呢?因?yàn)檫@行代碼表示類加載器加載com.mysql.jdbc.Driver這個(gè)類,而加載這個(gè)了這類就要執(zhí)行這個(gè)類的靜態(tài)代碼塊,我們看這個(gè)類的靜態(tài)代碼塊就會(huì)一目了然 public class Driver extends NonRegisteringDriver implements java.sql.Driver { 我們可以看到靜態(tài)代碼塊中執(zhí)行了注冊(cè)驅(qū)動(dòng)的代碼 ② DriverManager.registerDriver(new com.mysql.jdbc.Driver());
這段代碼其實(shí)注冊(cè)了兩次驅(qū)動(dòng),registerDriver方法本身就是注冊(cè)驅(qū)動(dòng)的關(guān)鍵代碼,而方法中new的新對(duì)象又是Driver對(duì)象,Driver類一旦加載其靜態(tài)代碼塊又注冊(cè)一次驅(qū)動(dòng)。因此產(chǎn)生了垃圾驅(qū)動(dòng),所以不推薦使用這種方式。(而且其實(shí)僅僅new出對(duì)象也注冊(cè)了驅(qū)動(dòng),不需要使用registerDriver方法)
③ System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
這種方式為什么能像第一種方式一樣注冊(cè)驅(qū)動(dòng)呢?因?yàn)?/span>DriverManager類會(huì)初始化,而在初始化的過程中會(huì)查詢系統(tǒng)屬性,如下 private static void loadInitialDrivers() { 這種方式可以同時(shí)注冊(cè)多個(gè)驅(qū)動(dòng),只需要在setProperty方法的第二個(gè)參數(shù)中添加就好,多個(gè)驅(qū)動(dòng)之間用冒號(hào)隔開。
2.建立連接
需要數(shù)據(jù)庫url,用戶名和密碼才能建立連接
示例 String url="jdbc:mysql://localhost:3306/tdb?useSSL=false"; 注意url中localhost是默認(rèn)主機(jī)名,3306是默認(rèn)端口,如果你也是使用默認(rèn)主機(jī)名和端口的話可以省略這部分讓url寫成String url =
"jdbc:mysql:///jdbc";(注意jdbc是數(shù)據(jù)庫名字不是非要寫jdbc)
url格式 JDBC:子協(xié)議://主機(jī)名:端口/數(shù)據(jù)庫名?屬性名=屬性值&...
3.創(chuàng)建語句
示例 Statement statement=conn.createStatement(); Statement 對(duì)象用來承接sql語句
4.執(zhí)行語句
示例 ResultSet resultSet=statement.executeQuery("SELECT * FROM tt"); 調(diào)用executeQuery方法執(zhí)行sql語句獲得結(jié)果集
5.處理結(jié)果
示例 while(resultSet.next()){ rs.next()代表移動(dòng)到結(jié)果集的下一條記錄 rs.getObject(1)獲得第一項(xiàng)
6.釋放資源
從后往前依次釋放資源(數(shù)據(jù)庫連接要盡量晚建立早釋放,減小數(shù)據(jù)庫壓力)
resultSet.close(); |
|
|