溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JDBC筆記介紹

發(fā)布時(shí)間:2020-02-28 17:24:34 來源:網(wǎng)絡(luò) 閱讀:321 作者:ckllf 欄目:MySQL數(shù)據(jù)庫

  1.JDBC的設(shè)計(jì)

  從一開始,Java技術(shù)開發(fā)人員就意識(shí)到了Java在數(shù)據(jù)庫應(yīng)用方面的巨大潛力。從1995年開始,他們就致力于擴(kuò)展Java標(biāo)準(zhǔn)類庫,使之可以運(yùn)用SQL訪問數(shù)據(jù)庫。他們最初希望通過擴(kuò)展Java,就可以讓人們“純”用Java語言與任何數(shù)據(jù)庫進(jìn)行通信。但是,他們很快發(fā)現(xiàn)這是一項(xiàng)無法完成的任務(wù):因?yàn)闃I(yè)界存在許多不同的數(shù)據(jù)庫,且他們所使用的協(xié)議也各不相同。盡管許多數(shù)據(jù)庫供應(yīng)商都表示支持Java提供一套數(shù)據(jù)庫訪問的標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議,但是每一家企業(yè)都希望Java能采用自己的網(wǎng)絡(luò)協(xié)議。

  所有的數(shù)據(jù)庫供應(yīng)商和工具開發(fā)商都認(rèn)為,如果Java能夠?yàn)镾QL訪問提供一套“純”JavaAPI,同時(shí)提供一個(gè)驅(qū)動(dòng)管理器,以允許第三方驅(qū)動(dòng)程序可以連接到特定的數(shù)據(jù)庫,那它就會(huì)顯得非常有用。這樣,這樣數(shù)據(jù)庫供應(yīng)商就可以提供自己的驅(qū)動(dòng)程序,將其插入到驅(qū)動(dòng)管理器中。這將成為一種向驅(qū)動(dòng)管理器注冊(cè)第三方驅(qū)動(dòng)程序的簡(jiǎn)單機(jī)制。

  這種接口組織方式遵循了微軟公司非常成功的ODBC模式,ODBC為C語言訪問數(shù)據(jù)庫提供了一套編程接口。JDBC和ODBC都基于同一個(gè)思想:根據(jù)API編寫的程序都可以與驅(qū)動(dòng)管理器進(jìn)行通信,而驅(qū)動(dòng)管理器則通過驅(qū)動(dòng)程序與實(shí)際的數(shù)據(jù)庫進(jìn)行通信。

  所有這些都意味著JDBC API是大部分程序員不得不使用的接口。

  JDBC:java database connectivity SUN公司提供的一套操作數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范。

  JDBC與數(shù)據(jù)庫驅(qū)動(dòng)的關(guān)系:接口與實(shí)現(xiàn)的關(guān)系。

  JDBC規(guī)范(掌握四個(gè)核心對(duì)象):

  DriverManager:用于注冊(cè)驅(qū)動(dòng)

  Connection:表示與數(shù)據(jù)庫創(chuàng)建的連接

  Statement:操作數(shù)據(jù)庫sql語句的對(duì)象

  ResultSet:結(jié)果集或一張?zhí)摂M表

  開發(fā)一個(gè)JDBC程序的準(zhǔn)備工作:

  JDBC規(guī)范在哪里:

  JDK中:

  java.sql.*;

  javax.sql.*;

  數(shù)據(jù)庫廠商提供的驅(qū)動(dòng):jar文件

  *.jar

  2.開發(fā)一個(gè)JDBC程序

  實(shí)現(xiàn)查詢數(shù)據(jù)庫中的數(shù)據(jù)顯示在java的控制臺(tái)中

  1、創(chuàng)建數(shù)據(jù)庫表,并向表中添加測(cè)試數(shù)據(jù)

  2、創(chuàng)建java project項(xiàng)目,添加數(shù)據(jù)庫驅(qū)動(dòng)

  3、實(shí)現(xiàn)JDBC操作

  //1、注冊(cè)驅(qū)動(dòng)

  DriverManager.registerDriver(new com.mysql.jdbc.Driver());

  //2、創(chuàng)建連接

  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","password");

  //3、得到執(zhí)行sql語句的Statement對(duì)象

  Statement stmt = conn.createStatement();

  //4、執(zhí)行sql語句,并返回結(jié)果

  String sql = "select * from user";

  ResultSet rs = stmt.executeQuery(sql);

  //5、處理結(jié)果

  while(rs.next()){

  System.out.println(rs.getObject(1));

  ......

  }

  //6、關(guān)閉資源

  rs.close();

  stmt.close();

  3.JDBC常用的類和接口詳解

  1、java.sql.Drivermanager類 : 創(chuàng)建連接

  a、注冊(cè)驅(qū)動(dòng)

  DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建議使用

  原因有2個(gè):

  導(dǎo)致驅(qū)動(dòng)被注冊(cè)2次

  強(qiáng)烈依賴數(shù)據(jù)庫的驅(qū)動(dòng)jar

  解決辦法:

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

  b、與數(shù)據(jù)庫建立連接

  static Connection getConnection(String url, String user, String password) //試圖建立到給定數(shù)據(jù)庫 URL 的連接。

  getConnection("jdbc:mysql://localhost:3306/day06", "root", "password");

  URL:SUN公司與數(shù)據(jù)庫廠商之間的一種協(xié)議。

  jdbc:mysql://localhost:3306/mydb1

  協(xié)議 子協(xié)議 IP :端口號(hào) 數(shù)據(jù)庫

  mysql: jdbc:mysql://localhost:3306/mydb1或者 jdbc:mysql:///mydb1(默認(rèn)本機(jī)連接)

  oracle: jdbc:oracle:thin:@localhost:1521:sid

  Properties info = new Properties(); //要參考數(shù)據(jù)庫文檔

  info.setProperty("user", "root");

  info.setProperty("password","password");

  getConnection(String url, Properties info)

  getConnection(String url)

  DriverManager.getConnection("jdbc:mysql://localhost:3306/day14?user=root&password=password");

  2、java.sql.Connection接口:一個(gè)連接

  接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中。所有與數(shù)據(jù)庫交互都是基于連接對(duì)象的。

  Statement createStatement(); //創(chuàng)建操作sql語句的對(duì)象

  3、java.sql.Statement接口:操作sql語句,并返回相應(yīng)結(jié)果的對(duì)象(小貨車)

  接口的實(shí)現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)中。用于執(zhí)行靜態(tài)SQL語句并返回它所生成結(jié)果的對(duì)象。

  ResultSet executeQuery(String sql); //根據(jù)查詢語句返回結(jié)果集。只能執(zhí)行select語句

  int executeUpdate(String sql); //根據(jù)執(zhí)行的DML(insert update delete)語句,返回受影響的行數(shù)

  boolean execute(String sql); //此方法可以執(zhí)行任意sql語句。返回boolean值,表示是否返回ResultSet結(jié)果集。僅當(dāng)執(zhí)行select語句,且有返回結(jié)果時(shí)返回true, 其它語句都返回false;無錫看婦科的醫(yī)院 http://www.ytsgfk120.com/

  4、java.sql.ResultSet接口:結(jié)果集(客戶端存表數(shù)據(jù)的對(duì)象)

  a、封裝結(jié)果集的

  提供一個(gè)游標(biāo),默認(rèn)游標(biāo)指向結(jié)果集第一行之前

  調(diào)用一次next(),游標(biāo)向下移動(dòng)一行

  提供一些get方法

  封裝數(shù)據(jù)的方法

  Object getObject(int columnIndex); //根據(jù)序號(hào)取值,索引從1開始

  Object getObject(String ColomnName); //根據(jù)列名取值。

  將結(jié)果集中的數(shù)據(jù)封裝到j(luò)avaBean中

  java的數(shù)據(jù)類型與數(shù)據(jù)庫中的類型的關(guān)系

  java 數(shù)據(jù)庫

  byte tityint

  short smallint

  int int

  long bigint

  float float

  double double

  String char varchar

  Date date

  boolean next(); //將光標(biāo)從當(dāng)前位置向下移動(dòng)一行

  int getInt(int colIndex); //以int形式獲取ResultSet結(jié)果集當(dāng)前行指定列號(hào)值

  int getInt(String colLabel); //以int形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值

  float getFloat(int colIndex); //以float形式獲取ResultSet結(jié)果集當(dāng)前行指定列號(hào)值

  float getFloat(String colLabel); //以float形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值

  String getString(int colIndex); //以String 形式獲取ResultSet結(jié)果集當(dāng)前行指定列號(hào)值

  String getString(String colLabel); //以String形式獲取ResultSet結(jié)果集當(dāng)前行指定列名值

  Date getDate(int columnIndex);

  Date getDate(String columnName);

  void close(); //關(guān)閉ResultSet 對(duì)象

  b、可移動(dòng)游標(biāo)的方法

  boolean next(); //將光標(biāo)從當(dāng)前位置向前移一行。

  boolean previous(); //將光標(biāo)移動(dòng)到此 ResultSet 對(duì)象的上一行。

  boolean absolute(int row); //參數(shù)是當(dāng)前行的索引,從1開始根據(jù)行的索引定位移動(dòng)的指定索引行。

  void afterLast(); //將光標(biāo)移動(dòng)到末尾,正好位于最后一行之后。

  void beforeFirst(); //將光標(biāo)移動(dòng)到開頭,正好位于第一行之前。

  4.SQL注入問題:preparedStatement

  preparedStatement:預(yù)編譯對(duì)象, 是Statement對(duì)象的子類

  特點(diǎn):

  性能要高

  會(huì)把sql語句先編譯

  sql語句中的參數(shù)會(huì)發(fā)生變化,過濾掉用戶輸入的關(guān)鍵字

  PreparedStatement ps = null;

  ResultSet rs = null;

  try{

  conn = DBUtils.getConnection();

  String sql = "select * from user where name=? and password=?";

  ps = conn.prepareStatement(sql); //注:創(chuàng)建此對(duì)象時(shí),要把sql語句先放進(jìn)去

  //給預(yù)編譯sql語句賦值

  ps.setString(1, name);

  ps.setString(2, password);

  rs = ps.executeQuery();

  }catch(Exception e){

  e.printStackTrace();

  }


向AI問一下細(xì)節(jié)
推薦閱讀:
  1. JDBC的介紹與使用
  2. JDBC

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI