成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

kun_jian / 2557人閱讀

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

本文為大家介紹 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)建更高級(jí)的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。

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

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

JDBC原理

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

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

JDBC開發(fā)步驟

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

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

獲得連接

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

執(zhí)行sql語句

處理結(jié)果

釋放資源

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

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

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

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

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

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

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

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

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

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

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

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

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

常用方法有以下三種:

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í)行平臺(tái):Statement stmt = con.createStatement();
結(jié)果處理

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

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

常用方法有以下幾種:

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

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

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

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

釋放資源

與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;

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

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

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

預(yù)處理對(duì)象

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

String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement預(yù)處理對(duì)象代碼:
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í)際參數(shù)
void setXxx(int index,Xxxxx)將指定參數(shù)設(shè)置為給定Java的xx值。在將此值發(fā)送到數(shù)據(jù)庫時(shí),驅(qū)動(dòng)程序?qū)⑺D(zhuǎn)換成一個(gè) SQL Xxx類型值。
{% endnote %}

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

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

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

獲取連接

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

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

執(zhí)行SQL語句

釋放資源

插入操作(insert)

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

public void demo01() throws Exception {
        // 1注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對(duì)象
        String sql = "insert into sort(sname) values(?)";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實(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注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對(duì)象中
        String sql = "update sort set sname=? where sid=?";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實(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注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對(duì)象
        String sql = "delete from sort where sid=?";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實(shí)際參數(shù)
        stat.setInt(1, 1);
// 5執(zhí)行SQL語句
        int line = stat.executeUpdate();
        System.out.println("刪除記錄數(shù):" + line);
        // 6釋放資源
        stat.close();
        conn.close();
}
預(yù)處理對(duì)象executeQuery方法

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

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

獲取連接

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

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

執(zhí)行SQL語句

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

釋放資源

查詢操作
public void demo04() throws Exception {
        // 1注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對(duì)象
        String sql = "select * from sort";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實(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注冊(cè)驅(qū)動(dòng)
        Class.forName("com.mysql.jdbc.Driver");
        // 2獲取連接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
        // 3獲得預(yù)處理對(duì)象
        String sql = "select * from sort where sname=?";
        PreparedStatement stat = conn.prepareStatement(sql);
        // 4 SQL語句占位符設(shè)置實(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。提供獲取連接對(duì)象的方法,從而達(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ū)動(dòng)注冊(cè)失敗!");
        }
    }
    //提供獲取連接的方法
    public static Connection getConn() throws Exception {
        // 2. 獲得連接
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        // 返回連接
        return conn;
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/17721.html

相關(guān)文章

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

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

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

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

    Paul_King 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<