大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java中JDBC連接數據庫詳解

Java中JDBC連接數據庫詳解

更新時間:2019-08-22 10:09:55 來源:動力節點 瀏覽3051次

  


今天動力節點java學院小編分享的是JDBC連接數據庫的相關知識,希望通過看過此文,各位小伙伴對DBC連接數據庫有所了解,下面就跟隨小編一起來看看JDBC連接數據庫的知識吧。


一、JDBC連接數據庫概念


  1、為了能讓程序操作數據庫,對數據庫中的表進行操作,每一種數據庫都會提供一套連接和操作該數據庫的驅動,而且每種數據庫的驅動都各不相同,例如mysql數據庫使用mysql驅動,oracle數據庫使用oracle驅動,這樣假如我們編寫的程序哪一天想要換數據庫,那樣就會很不方便,因為所有連接數據庫的代碼都要從新編寫。SUN公司為了簡化。統一對數據庫的操作,定義了一套java操作數據庫的標準或者規范,這個規范就是JDBC。


  2、JDBC全稱為:Java Data Base Connectivity(java數據庫連接),它主要由接口組成。我們在開發過程中,只要實現它相應的接口就可以非常進行連接。


  3、我們在開發JDBC應用時,還需要導入相應的數據庫的驅動jar包,這些驅動jar包是由數據庫公司自己編寫的。



  二、編寫JDBC應用程序(需要連接數據庫的程序)的前提準備


1、首先要確定連接的是哪個數據庫實例,例如在mysql中,我們可以先創建一個庫,然后在庫中新建一張表,在表中插入一些數據,我在這里提供一段在mysql數據庫中創建一個庫,以及表和數據的sql語句,這也是下面連接數據庫后操作的庫和表。


create database test ; /*創建一個名為Test的數據庫*/


use test; /*使用該數據庫或者說切換到該數據庫*/


create table book (


  id int primary key auto_increment, /*列:id ,類型:int,從0開始,自動增加, 備注:主鍵*/


  name varchar(40) NOT NULL,    /*列:name ,類型:varchar, 備注:非空*/


  author varchar(40)NOT NULL, /*列:author ,類型:varchar, 備注:非空*/


  prices double NOT NULL  /*列:prices ,類型:double, 備注:非空*/


); /*新建一張名為book的表*/


/*插入四大名著的數據*/


insert into book(id,name,author,prices) values (null,'西游記','吳承恩',25.00);


insert into book(id,name,author,prices) values (null,'水滸傳','施耐庵',30.00);


insert into book(id,name,author,prices) values (null,'紅樓夢','曹雪芹',35.00);


insert into book(id,name,author,prices) values (null,'三國演義','羅貫中',40.00);


  2、新建一個java項目,然后把mysql的驅動jar包導入進來,即添加到程序運行的庫中,具體的驅動jar包,我們可以在數據庫的安裝目錄下找到,或者都網上自己下載相對應的數據庫驅動jar包



  三、JDBC連接連接數據庫操作的步驟解析


  1、注冊數據庫驅動


  雖然我們剛才在新建java項目的時候將mysql數據庫的驅動jar包導入進來了,但是JBDC不知道這里有一個驅動包,此時我們就需要將這個驅動包交給JBDC去管理,我們可以使java.sql包下的DriverManager 工具類 提供的registerDriver(Driver driver) 方法來在JDBC中注冊這個數據驅動,這個registerDriver(Driver driver)方法需要一個Driver對象,而這個Driver類本身是JDBC提供的一個接口,我們的驅動里面已經實現了這個接口,所以我們只需要寫如下代碼就可以實現注冊數據庫驅動的功能。


import java.sql.DriverManager; //需要導入的是接口類包


DriverManager.registerDriver(new Driver());



  2、獲取(創建)數據庫的連接


  我們注冊好數據庫驅動后,并沒有連接上數據庫,以往,我們不管在CMD窗口下,通過可視化數據庫管理工具操作數據庫時,我們都需要先連接數據庫服務器,java程序連接數據庫也不例外,這里的java程序就相當于客戶端,只有先連接上數據庫服務,才能對數據庫進行操作。


  客戶端與數據庫所有交互都是通過connection對象完成的,這個對象的常用方法:


  createStatement():創建向數據庫發送sql的statement對象。


  prepareStatement(sql) :創建向數據庫發送預編譯sql的


  這里我們可以通過DriverManager工具類里的getConnection(url,user,password)方法來創建數據庫連接對象,此方法需要傳入三個參數:


  User: 數據庫的用戶名


  Password:用戶密碼


  URL:數據庫服務器地址,不同的數據庫的URL寫法不同,我在這里提供三種主流數據庫的URL地址寫法:


  Oracle寫法:jdbc:oracle:thin:@localhost:1521:sid


  SqlServe寫法:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid


  MySql寫法:jdbc:mysql://localhost:3306/sid


  Mysql的url地址的簡寫形式: jdbc:mysql:///sid


  注:后面的sid就是數據庫的實例名稱(使用的數據庫名)


import java.sql.Connection; //導入的是接口類包


Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root"); //這里使用的是一個名為test的mysql數據庫,用戶名和密碼都是root 



  3、創建傳輸器對象


  上面我們已經創建了數據庫的連接,已經連上數據庫了,但是如果我們想要操作該數據庫,我們需要用到sql語句,而我們怎樣使用在java程序中使用sql語句來操作數據庫呢,這里我們就需要一個傳輸器對象來傳輸sql語句到數據庫中去執行。上文提到在Connection 類中就有一個createStatement()的方法可以創建一個傳輸器對象。


import java.sql.Statement; //導入的是接口類包


Statement stat = conn.createStatement();



  4、利用傳輸器對象傳輸sql語句到數據庫中執行操作,將結果用結果集返回


  java.sql.Statement身上有許多傳輸sql語句的方法:其中用的最多的是


  executeQuery(String sql) :用于向數據發送查詢語句。


  executeUpdate(String sql):用于向數據庫發送insert、update或delete語句


  execute(String sql):用于向數據庫發送任意sql語句


import java.sql.ResultSet; //需要導入的接口類包


ResultSet rs = stat.executeQuery("select * from book"); //傳輸一條查詢語句,查詢book表中所有的元組數據



  5、遍歷結果集,并獲取查詢對象


  Jdbc程序中的ResultSet用于代表Sql語句的執行結果。Resultset封裝執行結果時,采用的類似于表格的方式。ResultSet 對象維護了一個指向表格數據行的游標,初始的時候,游標在第一行之前,調用ResultSet.next() 方法,可以使游標指向具體的數據行,進行調用方法獲取該行的數據。


  ResultSet既然用于封裝執行結果的,所以該對象提供的都是用于獲取數據的get方法:


  獲取指定類型的數據,例如:


  getString(int index)


  getString(String columnName)


  ResultSet還提供了對結果集進行滾動的方法:


  next():移動到下一行


  Previous():移動到前一行


  absolute(int row):移動到指定行


  beforeFirst():移動resultSet的最前面。


  afterLast() :移動到resultSet的最后面。


while(rs.next())

 {

 String name = rs.getString("name");

 System.out.println(name);

}



  6、關閉連接(先創建的后關閉)


  Jdbc程序運行完后,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet, Statement和Connection對象。


  特別是Connection對象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是盡量晚創建,盡量早的釋放。


rs.close(); 

stat.close();

conn.close();


初期完整的源代碼


package jdbcDemo;

/****************************

 * 初版連接數據庫程序

 **************************/

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

//不能導入 java.sql 中的 Driver 接口,要導入驅動jar包中實現該接口的類,只有這要才能注冊相對應的數據庫驅動

import com.mysql.jdbc.Driver; 

public class JDBCTest {

 public static void main(String[] args) throws SQLException {

 //1.注冊數據庫驅動

 DriverManager.registerDriver(new Driver());

 //2.獲取數據庫的連接 

 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");

 //3.創建傳輸器對象

 Statement stat = conn.createStatement();

 //4.利用傳輸器對象傳輸sql語句到數據庫中執行操作,將結果用結果集返回

  ResultSet rs = stat.executeQuery("select * from book");

 //5.遍歷結果集,并獲取查詢結果

 while(rs.next()) {

  String name = rs.getString("name");

  System.out.println(name);

 }

 //6.關閉連接(后開先關)

 rs.close(); 

 stat.close();

 conn.close();

 } 

}


數據表視圖和運行結果:


1.png


  四、初期連接數據庫程序中出現的問題


  1、注冊數據庫驅動方法不當導致出現了兩次注冊,程序通用性低


  我們在查看Driver類的源碼中可以看到如下代碼,從第7行代碼中我們可以看到,mysql在Driver類的實現中自己注冊了一次,而我們在程序中又注冊了一次,導致注冊兩次。


  我們在注冊驅動時,需要導入mysql驅動jar包中已經實現的Driver類,這樣程序就和具體的數據庫綁定在一起了,程序的通用性就降低了,如果我們想要切換數據庫,還得改動源碼。


  修復方法:


  使用Class.forname() 方法將mysql中已經實現的Driver類加載到程序中來,由于Driver類在實現接口時使用的是靜態代碼塊,而靜態代碼塊只會在類加載的時候執行一次,即保證了數據庫驅動只會被注冊一次,同時不用導入mysql驅驅動里的類包,程序通用性提高。


Class.forName("com.mysql.jdbc.Driver");


  2、忽略了程序中可能會拋出的異常(最大的問題)


  我們在執行程序時,它的許多方法的調用都會拋出異常,如果它拋出異常后,沒有做相應的處理(catch 這個異常)那么程序就會中斷執行,Statement對象和Connection對象就沒有被關閉,而我們知道Connection對象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機,所以我們需要保證無論程序中哪一步出現了異常導致程序中斷,連接關閉的代碼都會被執行,此時我們就會想到異常處理中的finally代碼塊,我們可以把異常向上拋出,而是先 try 住然后 catch 異常,最后執行 finally 代碼塊,修改之后,我們發現每個close() 都提示有異常要處理,此時我們也直接 try/catch 每個異常。


修改后的源代碼:


package jdbcDemo;

/****************************

 * 修改版連接數據庫程序

 **************************/

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class JDBCTest {

 public static void main(String[] args) {

 Connection conn = null;

 Statement stat = null;

 ResultSet rs = null;

 try {

  //1.注冊數據庫驅動

  Class.forName("com.mysql.jdbc.Driver");

  //2.獲取數據庫的連接 

   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");

  //3.創建傳輸器對象

   stat = conn.createStatement();

  //4.利用傳輸器對象傳輸sql語句到數據庫中執行操作,將結果用結果集返回

   rs = stat.executeQuery("select * from book");

  //5.遍歷結果集,并獲取查詢結果

  while(rs.next()) {

   String name = rs.getString("name");

   System.out.println(name);

  }

 }catch(Exception e) {

  e.printStackTrace();

 }finally {

  //6.關閉連接(后開先關)

  try {

  rs.close();

  } catch (SQLException e) {

  e.printStackTrace();

  } 

  try {

  stat.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

  try {

  conn.close();

  } catch (SQLException e) {

  e.printStackTrace();

  }

 }

 } 

}



  五、修改后程序中被忽略的異常


  異常問題


  1、由于我們在程序開頭先聲明了三個對象的引用,并且都賦值為null,假如程序在執行到注冊數據庫這一步時就拋出了異常,此時catch 到這個異常 后執行finally 代碼塊,結果發現ResultSet 對象的引用,Connection對象的引用以及Statement對象的引用都是空值,調用這個對象上的方法就會拋出空指針異常。


  2、close()這個方法身上也有異常,如果我們不做相應的異常處理,那些對象還是不能被正常關閉。


  解決辦法


  1、為了防止出現空指針異常,我們可以先判斷哪些對象的引用是否為null,如果不為null,則執行異常處理代碼。


  2、在每個close()異常處理后在加上一個finally靜態代碼塊,將每個相應對象的引用值置為null,原理是:如果程序執行到close() 方法并拋出了異常,那么最后finally代碼塊執行,給該對象的應用值置為null,由于這個對象沒有任何引用指向它,它就成為了垃圾對象,JVM垃圾回收器就會回收這個對象資源,這個對象也就關閉了。


  異常處理完后最終的源代碼:


package jdbcDemo;

/****************************

 * 無異常版連接數據庫程序

 **************************/

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class JDBCTest {

 public static void main(String[] args) {

 Connection conn = null;

 Statement stat = null;

 ResultSet rs = null;

 try {

  //1.注冊數據庫驅動

  Class.forName("com.mysql.jdbc.Driver");

  //2.獲取數據庫的連接 

   conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");

  //3.創建傳輸器對象

   stat = conn.createStatement();

  //4.利用傳輸器對象傳輸sql語句到數據庫中執行操作,將結果用結果集返回

   rs = stat.executeQuery("select * from book");

  //5.遍歷結果集,并獲取查詢結果

  while(rs.next()) {

   String name = rs.getString("name");

   System.out.println(name);

  }

 }catch(Exception e) {

  e.printStackTrace();

 }finally {

  //6.關閉連接(后開先關)

  if(rs != null) {

   try {

   rs.close();

   } catch (SQLException e) {

   e.printStackTrace();

   } finally {

   rs = null;

   }

  }

  if(stat != null) {

   try {

   stat.close();

   } catch (SQLException e) {

   e.printStackTrace();

   }finally {

   stat = null;

   }

  }

  if(conn != null) {

   try {

   conn.close();

   } catch (SQLException e) {

   e.printStackTrace();

   }finally {

   conn = null;

   }

  } 

 } //--finally

 } //--main 

}//--class


以上就是動力節點java學院小編介紹的“Java中JDBC連接數據庫詳解”的內容,希望對大家有幫助,更多精彩內容請關注動力節點java學院官網。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产精品视_精品国产免费 国产精品视频2021 | 神马视频我不卡 | 久久乐国产精品亚洲综合m3u8 | 成人毛片在线观看 | 看全色黄大色黄大片 视 | www.久久精品视频 | 亚洲国产成人久久精品hezyo | 久久 精品 一区二区 | 我不卡老子影院午夜伦我不卡四虎 | 一级爱爱片一级毛片-一毛 一级白嫩美女毛片免费 | 狠狠色欧美亚洲综合色黑a 狠狠色视频 | 美女视频黄的全i免费 | 特黄特色大片免费播放器999 | 好吊色青青草 | 亚洲第一页色 | 日韩爱爱 | 天天插狠狠干 | 成人 在线欧美亚洲 | 色综合天天综一个色天天综合网 | 九九九色视频在线观看免费 | 99国产精品免费观看视频 | 久久福利青草精品资源站免费 | 久久免费精品视频 | 国产三级久久 | 久久久久免费精品国产小说 | 日日天天| 国产2021久久精品 | 2级毛片 | 色黄啪啪网18以下勿入 | 99久久久国产精品免费播放器 | 999精品视频这里只有精品 | 国四虎影永久 | 国产福利一区二区在线观看 | 亚洲天天网综合自拍图片专区 | 毛片在线观看网站 | 亚洲精品成人久久 | 久久99精品这里精品3 | 国产成人精品曰本亚洲78 | 青草社区视频 | 亚洲精品一区二区伦理 | 嫩草成人国产精品 |