国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java數(shù)據(jù)庫開發(fā)-Mysql連接

Ververica / 2268人閱讀

摘要:是訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范。提供了一種基準(zhǔn)據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。代碼如下工具類數(shù)據(jù)庫驅(qū)動注冊失敗提供獲取連接的方法獲得連接返回連接

本文為大家介紹 Java 如何使用JDBC 連接 MySQL 數(shù)據(jù)庫。

JDBC概述

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

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

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

本文使用的是mysql的驅(qū)動mysql-connector-java-5.1.39-bin.jar
Download Now

JDBC原理

Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實現(xiàn)類稱為驅(qū)動。

JDBC是接口,驅(qū)動是接口的實現(xiàn),沒有驅(qū)動將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!每個數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動一般都由數(shù)據(jù)庫生成廠商提供。

JDBC開發(fā)步驟

Java數(shù)據(jù)庫鏈接主要包括以下幾步:

注冊驅(qū)動

獲得連接

獲得語句執(zhí)行平臺

執(zhí)行sql語句

處理結(jié)果

釋放資源

導(dǎo)入驅(qū)動包(jar包)

在項目文件夾下創(chuàng)建lib目錄,用于存放當(dāng)前項目需要的所有jar包(上面下載的jar包)選擇jar包,右鍵執(zhí)行build path / Add to Build Path

注冊驅(qū)動

JDBC規(guī)范定義驅(qū)動接口java.sql.Driver,MySql驅(qū)動包提供了實現(xiàn)類com.mysql.jdbc.Driver、DriverManager工具類,提供注冊驅(qū)動的方法 registerDriver(),方法的參數(shù)是java.sql.Driver,所以我們可以通過如下語句進(jìn)行注冊:

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

但是并不提倡使用這種方法,原因如下:

/*
通過查詢com.mysql.jdbc.Driver源碼,我們發(fā)現(xiàn)Driver類“主動”將自己進(jìn)行注冊
*/
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!");
        }
    }
……
}

// 這樣會造成驅(qū)動被注冊兩次  而且這樣編碼不易于程序擴(kuò)展和維護(hù)

通常開發(fā)我們使用Class.forName() 加載一個使用字符串描述的驅(qū)動類。
如果使用Class.forName()將類加載到內(nèi)存,該類的靜態(tài)代碼將自動執(zhí)行。
所以我們可以使用一下代碼來注冊驅(qū)動:

Class.forName("com.mysql.jdbc.Driver");
獲得連接

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

url比較復(fù)雜,下面是mysql的url:
jdbc:mysql://localhost:3306/mydb
JDBC規(guī)定url的格式由三部分組成,每個部分中間使用冒號分隔。
第一部分是jdbc,這是固定的;
第二部分是數(shù)據(jù)庫名稱,那么連接mysql數(shù)據(jù)庫,第二部分當(dāng)然是mysql了;
第三部分是由數(shù)據(jù)庫廠商規(guī)定的,我們需要了解每個數(shù)據(jù)庫廠商的要求,mysql的第三部分分別由數(shù)據(jù)庫服務(wù)器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb)組成。

代碼:Connection con = DriverManager.getConnection
(“jdbc:mysql://localhost:3306/mydb”,”root”,”root”);
獲得語句執(zhí)行平臺

常用方法有以下三種:

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

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

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

String sql = "某SQL語句";
獲取Statement語句執(zhí)行平臺:Statement stmt = con.createStatement();
結(jié)果處理

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

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

常用方法有以下幾種:

Object getObject(int index) / Object getObject(String name) 獲得任意對象

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

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

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

釋放資源

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

rs.close();
stmt.close();
con.close();
SQL 注入問題

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

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

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

SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

此時,上述查詢語句時永遠(yuǎn)可以查詢出結(jié)果的。那么用戶就直接登錄成功了,顯然我們不希望看到這樣的結(jié)果,這便是SQL注入問題。
為此,我們使用PreparedStatement來解決對應(yīng)的問題。

預(yù)處理對象

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

String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement預(yù)處理對象代碼:
PreparedStatement psmt = conn.prepareStatement(sql)

常用方法:
{% note info %} 執(zhí)行SQL語句
int executeUpdate(); --執(zhí)行insert update delete語句.
ResultSet executeQuery(); --執(zhí)行select語句.
boolean execute(); --執(zhí)行select返回true執(zhí)行其他的語句返回false.
{% endnote %}
{% note warning %}
設(shè)置實際參數(shù)
void setXxx(int index,Xxxxx)將指定參數(shù)設(shè)置為給定Java的xx值。在將此值發(fā)送到數(shù)據(jù)庫時,驅(qū)動程序?qū)⑺D(zhuǎn)換成一個 SQL Xxx類型值。
{% endnote %}

預(yù)處理對象executeUpdate方法

通過預(yù)處理對象的executeUpdate方法,完成記錄的insertupdatedelete語句的執(zhí)行。操作格式統(tǒng)一如下:

注冊驅(qū)動

獲取連接

獲取預(yù)處理對象

SQL語句占位符設(shè)置實際參數(shù)

執(zhí)行SQL語句

釋放資源

插入操作(insert)

實現(xiàn)向表中插入指定的新內(nèi)容

public void demo01() throws Exception {
        // 1注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對象
        String sql = "insert into sort(sname) values(?)";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實際參數(shù)
        stat.setString(1, "奢侈品");
        // 5執(zhí)行SQL語句
        int line = stat.executeUpdate();
        System.out.println("新添加記錄數(shù):" + line);
        // 6釋放資源
        stat.close();
        conn.close();
}
更新操作(update)
public void demo02() throws Exception {
        // 1注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對象中
        String sql = "update sort set sname=? where sid=?";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實際參數(shù)
        stat.setString(1, "數(shù)碼產(chǎn)品");
        stat.setInt(2, 1);
// 5執(zhí)行SQL語句
        int line = stat.executeUpdate();
        System.out.println("更新記錄數(shù):" + line);
        // 6釋放資源
        stat.close();
        conn.close();
}
刪除操作
public void demo03() throws Exception {
        // 1注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對象
        String sql = "delete from sort where sid=?";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實際參數(shù)
        stat.setInt(1, 1);
// 5執(zhí)行SQL語句
        int line = stat.executeUpdate();
        System.out.println("刪除記錄數(shù):" + line);
        // 6釋放資源
        stat.close();
        conn.close();
}
預(yù)處理對象executeQuery方法

通過預(yù)處理對象的executeQuery方法,完成記錄的select語句的執(zhí)行。操作格式統(tǒng)一如下:

注冊驅(qū)動

獲取連接

獲取預(yù)處理對象

SQL語句占位符設(shè)置實際參數(shù)

執(zhí)行SQL語句

處理結(jié)果集(遍歷結(jié)果集合)

釋放資源

查詢操作
public void demo04() throws Exception {
        // 1注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對象
        String sql = "select * from sort";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實際參數(shù)
    // 5執(zhí)行SQL語句
        ResultSet rs = stat.executeQuery();
        // 6處理結(jié)果集(遍歷結(jié)果集合)
        while( rs.next() ){
            //獲取當(dāng)前行的分類ID
            String sid = rs.getString("sid");//方法參數(shù)為數(shù)據(jù)庫表中的列名
            //獲取當(dāng)前行的分類名稱
            String sname = rs.getString("sname");
            //顯示數(shù)據(jù)
            System.out.println(sid+"-----"+sname);
        }
        // 7釋放資源
        rs.close();
        stat.close();
        conn.close();
}
public void demo05() throws Exception {
        // 1注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對象
        String sql = "select * from sort where sname=?";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實際參數(shù)
        stat.setString(1, "奢侈品");
// 5執(zhí)行SQL語句
        ResultSet rs = stat.executeQuery();
        // 6處理結(jié)果集(遍歷結(jié)果集合)
        while( rs.next() ){
            //獲取當(dāng)前行的分類ID
            String sid = rs.getString("sid");//方法參數(shù)為數(shù)據(jù)庫表中的列名
            //獲取當(dāng)前行的分類名稱
            String sname = rs.getString("sname");
            //顯示數(shù)據(jù)
            System.out.println(sid+"-----"+sname);
        }
        // 7釋放資源
        rs.close();
        stat.close();
        conn.close();
}
JDBC工具類

“獲得數(shù)據(jù)庫連接”操作,將在以后的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。提供獲取連接對象的方法,從而達(dá)到代碼的重復(fù)利用。
該工具類提供方法:public static Connection getConn ()。代碼如下:

/*
 * JDBC工具類
 */
public class JDBCUtils {
    public static final  String DRIVERNAME = "com.mysql.jdbc.Driver";
    public static final  String URL = "jdbc:mysql://localhost:3306/mydb";
    public static final  String USER = "root";
    public static final  String PASSWORD = "root";

    static {
        try {
            Class.forName(DRIVERNAME);
        } catch (ClassNotFoundException e) {
            System.out.println("數(shù)據(jù)庫驅(qū)動注冊失敗!");
        }
    }
    //提供獲取連接的方法
    public static Connection getConn() throws Exception {
        // 2. 獲得連接
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        // 返回連接
        return conn;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/69254.html

相關(guān)文章

  • Java數(shù)據(jù)庫開發(fā)-Mysql連接

    摘要:是訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范。提供了一種基準(zhǔn)據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。代碼如下工具類數(shù)據(jù)庫驅(qū)動注冊失敗提供獲取連接的方法獲得連接返回連接 本文為大家介紹 Java 如何使用JDBC 連接 MySQL 數(shù)據(jù)庫。 JDBC概述 JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java A...

    kun_jian 評論0 收藏0
  • Python 中的 MySQL 數(shù)據(jù)庫連接

    摘要:說多了都是淚,我之前排查內(nèi)存泄漏的問題,超高并發(fā)的程序跑了個月后就崩潰。以前寫中間件的時候,就總是把用戶當(dāng),要盡量考慮各種情況避免內(nèi)存泄漏。 從 Java 到 Python 本文為我和同事的共同研究成果 當(dāng)跨語言的時候,有些東西在一門語言中很常見,但到了另一門語言中可能會很少見。 例如 C# 中,經(jīng)常會關(guān)注拆箱裝箱,但到了 Java 中卻發(fā)現(xiàn),根本沒人關(guān)注這個。 后來才知道,原來是因為...

    Paul_King 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<