日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

JDBC和MySQL的实现原理

發(fā)布時(shí)間:2023/12/10 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC和MySQL的实现原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這兩天復(fù)習(xí)了一下JDBC操作MySQL,把crud操作的例子記一下,

類(lèi)庫(kù)鏈接(mysql-connector-java-5.1.37-bin.jar):http://files.cnblogs.com/files/xujingyang/mysql-connector-java-5.1.37-bin.zip

1.1?JDBC概述

JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成。是Java訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)規(guī)范

JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。

JDBC需要連接驅(qū)動(dòng),驅(qū)動(dòng)是兩個(gè)設(shè)備要進(jìn)行通信,滿(mǎn)足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,設(shè)備提供商為設(shè)備提供驅(qū)動(dòng)軟件,通過(guò)軟件可以與該設(shè)備進(jìn)行通信。

今天我們使用的是mysql的驅(qū)動(dòng)mysql-connector-java-5.1.39-bin.jar

1.2?JDBC原理

Java提供訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)規(guī)范稱(chēng)為JDBC,而生產(chǎn)廠(chǎng)商提供規(guī)范的實(shí)現(xiàn)類(lèi)稱(chēng)為驅(qū)動(dòng)。

?

?

?

?

?

?

?

?

?

?

JDBC是接口,驅(qū)動(dòng)是接口的實(shí)現(xiàn),沒(méi)有驅(qū)動(dòng)將無(wú)法完成數(shù)據(jù)庫(kù)連接,從而不能操作數(shù)據(jù)庫(kù)!每個(gè)數(shù)據(jù)庫(kù)廠(chǎng)商都需要提供自己的驅(qū)動(dòng),用來(lái)連接自己公司的數(shù)據(jù)庫(kù),也就是說(shuō)驅(qū)動(dòng)一般都由數(shù)據(jù)庫(kù)生成廠(chǎng)商提供。

?

1.3?JDBC開(kāi)發(fā)步驟

  • 注冊(cè)驅(qū)動(dòng).
  • 獲得連接.
  • 獲得語(yǔ)句執(zhí)行平臺(tái)
  • 執(zhí)行sql語(yǔ)句
  • 處理結(jié)果
  • 釋放資源.
  • 1.3.1?導(dǎo)入驅(qū)動(dòng)jar包

    創(chuàng)建lib目錄,用于存放當(dāng)前項(xiàng)目需要的所有jar包

    選擇jar包,右鍵執(zhí)行build path / Add to Build Path

    1.4.1?API詳解:注冊(cè)驅(qū)動(dòng)

    代碼:Class.forName("com.mysql.jdbc.Driver");

    JDBC規(guī)范定義驅(qū)動(dòng)接口:java.sql.Driver,MySql驅(qū)動(dòng)包提供了實(shí)現(xiàn)類(lèi):com.mysql.jdbc.Driver

    DriverManager工具類(lèi),提供注冊(cè)驅(qū)動(dòng)的方法?registerDriver(),方法的參數(shù)是java.sql.Driver,所以我們可以通過(guò)如下語(yǔ)句進(jìn)行注冊(cè):

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

    以上代碼不推薦使用,存在兩方面不足

  • 硬編碼,后期不易于程序擴(kuò)展和維護(hù)
  • 驅(qū)動(dòng)被注冊(cè)兩次。
  • 通常開(kāi)發(fā)我們使用Class.forName()?加載一個(gè)使用字符串描述的驅(qū)動(dòng)類(lèi)。

    如果使用Class.forName()將類(lèi)加載到內(nèi)存,該類(lèi)的靜態(tài)代碼將自動(dòng)執(zhí)行。

    通過(guò)查詢(xún)com.mysql.jdbc.Driver源碼,我們發(fā)現(xiàn)Driver類(lèi)“主動(dòng)”將自己進(jìn)行注冊(cè)

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {

    static {

    try {

    java.sql.DriverManager.registerDriver(new Driver());

    } catch (SQLException E) {

    throw new RuntimeException("Can't register driver!");

    }?

    }

    ……

    }

    ?

    1.4.2?API詳解:獲得鏈接

    代碼:Connection con = DriverManager.getConnection
    (“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);

    獲取連接需要方法?DriverManager.getConnection(url,username,password),三個(gè)參數(shù)分別表示,url?需要連接數(shù)據(jù)庫(kù)的位置(網(wǎng)址)user用戶(hù)名 ?password?密碼

    url比較復(fù)雜,下面是mysql的url:

    jdbc:mysql://localhost:3306/mydb

    JDBC規(guī)定url的格式由三部分組成,每個(gè)部分中間使用冒號(hào)分隔。

    l 第一部分是jdbc,這是固定的;

    l 第二部分是數(shù)據(jù)庫(kù)名稱(chēng),那么連接mysql數(shù)據(jù)庫(kù),第二部分當(dāng)然是mysql了;

    l 第三部分是由數(shù)據(jù)庫(kù)廠(chǎng)商規(guī)定的,我們需要了解每個(gè)數(shù)據(jù)庫(kù)廠(chǎng)商的要求,mysql的第三部分分別由數(shù)據(jù)庫(kù)服務(wù)器的IP地址(localhost)、端口號(hào)(3306),以及DATABASE名稱(chēng)(mydb)組成。

    ?

    1.4.3?API詳解:獲得語(yǔ)句執(zhí)行平臺(tái)

    String sql = "某SQL語(yǔ)句";

    獲取Statement語(yǔ)句執(zhí)行平臺(tái):Statement stmt = con.createStatement();

    常用方法:

    n?int executeUpdate(String sql); --執(zhí)行insert update delete語(yǔ)句.

    n?ResultSet executeQuery(String sql); --執(zhí)行select語(yǔ)句.

    n?boolean execute(String sql); --執(zhí)行select返回true?執(zhí)行其他的語(yǔ)句返回false.

    1.4.4?API詳解:處理結(jié)果集(執(zhí)行insert、update、delete無(wú)需處理)

    ResultSet實(shí)際上就是一張二維的表格,我們可以調(diào)用其boolean next()方法指向某行記錄,當(dāng)?shù)谝淮握{(diào)用next()方法時(shí),便指向第一行記錄的位置,這時(shí)就可以使用ResultSet提供的getXXX(int col)方法(與索引從0開(kāi)始不同個(gè),列從1開(kāi)始)來(lái)獲取指定列的數(shù)據(jù):

    rs.next();//指向第一行

    rs.getInt(1);//獲取第一行第一列的數(shù)據(jù)

    常用方法:

    n?Object getObject(int index)?/ Object getObject(String name)?獲得任意對(duì)象

    n?String getString(int index)?/ Object getObject(String name)?獲得字符串

    n?int getInt(int index)?/ Object getObject(String name)?獲得整形

    n?double getDouble(int index)?/ Object getObject(String name)?獲得雙精度浮點(diǎn)型

    ?

    1.4.5?API詳解:釋放資源

    與IO流一樣,使用后的東西都需要關(guān)閉!關(guān)閉的順序是先得到的后關(guān)閉,后得到的先關(guān)閉。

    rs.close();

    stmt.close();

    con.close();

    1.5?SQL注入問(wèn)題

    假設(shè)有登錄案例SQL語(yǔ)句如下:

    SELECT * FROM?用戶(hù)表?WHERE NAME =?用戶(hù)輸入的用戶(hù)名?AND PASSWORD =?用戶(hù)輸?shù)拿艽a;

    此時(shí),當(dāng)用戶(hù)輸入正確的賬號(hào)與密碼后,查詢(xún)到了信息則讓用戶(hù)登錄。但是當(dāng)用戶(hù)輸入的賬號(hào)為XXX?密碼為:XXX’??OR ‘a(chǎn)’=’a時(shí),則真正執(zhí)行的代碼變?yōu)?#xff1a;

    SELECT * FROM?用戶(hù)表?WHERE NAME =?‘XXX’?AND PASSWORD =’?XXX’??OR ’a’=’a’;

    此時(shí),上述查詢(xún)語(yǔ)句時(shí)永遠(yuǎn)可以查詢(xún)出結(jié)果的。那么用戶(hù)就直接登錄成功了,顯然我們不希望看到這樣的結(jié)果,這便是SQL注入問(wèn)題。

    為此,我們使用PreparedStatement來(lái)解決對(duì)應(yīng)的問(wèn)題。

    1.6?API詳解:預(yù)處理對(duì)象

    使用PreparedStatement預(yù)處理對(duì)象時(shí),建議每條sql語(yǔ)句所有的實(shí)際參數(shù),都使用逗號(hào)分隔。

    String sql = "insert into sort(sid,sname) values(?,?)";;

    PreparedStatement預(yù)處理對(duì)象代碼:

    PreparedStatement psmt = conn.prepareStatement(sql)

    常用方法:

  • 執(zhí)行SQL語(yǔ)句:
  • l?int executeUpdate(); --執(zhí)行insert update delete語(yǔ)句.

    l?ResultSet executeQuery(); --執(zhí)行select語(yǔ)句.

    l?boolean execute(); --執(zhí)行select返回true 執(zhí)行其他的語(yǔ)句返回false.

  • 設(shè)置實(shí)際參數(shù)
  • l?void?setXxx(int?index, Xxx?xx) 將指定參數(shù)設(shè)置為給定Java的xx值。在將此值發(fā)送到數(shù)據(jù)庫(kù)時(shí),驅(qū)動(dòng)程序?qū)⑺D(zhuǎn)換成一個(gè)?SQL Xxx類(lèi)型值。

    例如:

    setString(2, "家用電器")?把SQL語(yǔ)句中第2個(gè)位置的占位符? 替換成實(shí)際參數(shù)?"家用電器"

    1.7?預(yù)處理對(duì)象executeUpdate方法

    通過(guò)預(yù)處理對(duì)象的executeUpdate方法,完成記錄的insert\update\delete語(yǔ)句的執(zhí)行。操作格式統(tǒng)一如下:

    1.?注冊(cè)驅(qū)動(dòng)

    2.?獲取連接

    3.?獲取預(yù)處理對(duì)象

    4. SQL語(yǔ)句占位符設(shè)置實(shí)際參數(shù)

    5.?執(zhí)行SQL語(yǔ)句

    6.?釋放資源

    ?

    2.1?使用properties配置文件

    開(kāi)發(fā)中獲得連接的4個(gè)參數(shù)(驅(qū)動(dòng)、URL、用戶(hù)名、密碼)通常都存在配置文件中,方便后期維護(hù),程序如果需要更換數(shù)據(jù)庫(kù),只需要修改配置文件即可。

    通常情況下,我們習(xí)慣使用properties文件,此文件我們將做如下要求:

  • 文件位置:任意,建議src下
  • 文件名稱(chēng):任意,擴(kuò)展名為properties
  • 文件內(nèi)容:一行一組數(shù)據(jù),格式是“key=value”.
  • a)?key命名自定義,如果是多個(gè)單詞,習(xí)慣使用點(diǎn)分隔。例如:jdbc.driver

    b)?value值不支持中文,如果需要使用非英文字符,將進(jìn)行unicode轉(zhuǎn)換。

    1.2?創(chuàng)建配置文件

    在項(xiàng)目跟目錄下,創(chuàng)建文件,輸入“db.properties”文件名。

    l?文件中的內(nèi)容

    driver=com.mysql.jdbc.Driver

    url=jdbc:mysql://localhost:3306/mydb

    user=root

    password=root

    ?

    1.3?加載配置文件:Properties對(duì)象

    對(duì)應(yīng)properties文件處理,開(kāi)發(fā)中也使用Properties對(duì)象進(jìn)行。我們將采用加載properties文件獲得流,然后使用Properties對(duì)象進(jìn)行處理。

    ?

    總結(jié)

    以上是生活随笔為你收集整理的JDBC和MySQL的实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。