国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java基礎之JDBC的數據庫連接與基本操作

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:GaryLea 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

一、JDBC概述

  • JDBC全稱(chēng)Java Database Connectivity,它是一個(gè)獨立于特定數據管理系統、通用的SQL數據庫存取和操作的公共接口,定義了用來(lái)訪(fǎng)問(wèn)數據庫的標準Java類(lèi)庫,使用這個(gè)類(lèi)庫可以以一種標準的方法、方便地訪(fǎng)問(wèn)數據庫資源
  • 通俗的來(lái)說(shuō),JDBC就是讓我們通過(guò)Java來(lái)連接任何提供了JDBC驅動(dòng)程序的數據庫系統,比如我有一個(gè)SQLServer數據和一個(gè)Mysql數據庫,我可以通過(guò)Java的JDBC來(lái)完成前面學(xué)習SQL中的所有操作,而無(wú)需在命令行來(lái)分別連接它們兩個(gè),就像這樣

 

二、JDBC操作數據庫、操作表步驟

我來(lái)總結一下JDBC操作數據庫與表的步驟,然后詳細來(lái)介紹它們

1.注冊驅動(dòng) (只做一次)

2.建立連接(Connection)

3.創(chuàng )建執行SQL的語(yǔ)句(Statement)

4.執行語(yǔ)句

5.處理執行結果(ResultSet)

6.釋放資源

看到這里是不是很熟悉,沒(méi)錯,就跟我們前面學(xué)習Mysql一樣,首先我來(lái)介紹一下JDBC的結構與數據庫的連接

三、JDBC體系結構與JDBC API

JDBC體系結構由下面兩部分組成:

  • 面向應用的API:Java API,抽象接口,供應用程序開(kāi)發(fā)人員使用(連接數據庫,執行SQL語(yǔ)句,獲得結果)。
  • 面向數據庫的API:Java Driver API,供開(kāi)發(fā)商開(kāi)發(fā)數據庫驅動(dòng)程序使用

JDBC API

  • JDBC API 是一系列的接口,它使得應用程序能夠進(jìn)行數據庫聯(lián)接,執行SQL語(yǔ)句,并且得到返回結果

 

四、注冊與加載驅動(dòng)

Driver接口

  • java.sql.Driver 接口是所有 JDBC 驅動(dòng)程序需要實(shí)現的接口。這個(gè)接口是提供給數據庫廠(chǎng)商使用的,不同數據庫廠(chǎng)商提供不同的實(shí)現
  • 在程序中不需要直接去訪(fǎng)問(wèn)實(shí)現了 Driver 接口的類(lèi),而是由驅動(dòng)程序管理器類(lèi)(java.sql.DriverManager)去調用這些Driver實(shí)現
  • Oracle的驅動(dòng):oracle.jdbc.driver.OracleDriver
  • mySql的驅動(dòng): com.mysql.jdbc.Driver

加載與注冊JDBC驅動(dòng)

前面我們說(shuō)了,JDBC就是通過(guò)一個(gè)接口和不同數據庫提供了JDBC的驅動(dòng)來(lái)完成數據的操作,因此,我們將驅動(dòng)加載到JDBC中,加載驅動(dòng)有兩種方式:

方式一:加載 JDBC 驅動(dòng)需調用 Class 類(lèi)的靜態(tài)方法 forName(),向其傳遞要加載的 JDBC 驅動(dòng)的類(lèi)名

Class.forName(“com.mysql.jdbc.Driver”);

方式二:DriverManager 類(lèi)是驅動(dòng)程序管理器類(lèi),負責管理驅動(dòng)程序

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

通常不用顯式調用 DriverManager 類(lèi)的 registerDriver() 方法來(lái)注冊驅動(dòng)程序類(lèi)的實(shí)例,因為 Driver 接口的驅動(dòng)程序類(lèi)都包含了靜態(tài)代碼塊,在這個(gè)靜態(tài)代碼塊中,會(huì )調用 DriverManager.registerDriver() 方法來(lái)注冊自身的一個(gè)實(shí)例

五、建立連接(Connection)

  • 當我們注冊并加載驅動(dòng)后,就可以連接數據庫了,方法和前面我們學(xué)習Mysql一樣,首先需要輸入賬號,密碼等信息
  • 在JDBC中,我們需要調用DriverManager 類(lèi)的 getConnection() 方法建立到數據庫的連接
  • user,password可以用“屬性名=屬性值”方式告訴數據庫;
  • 在JDBC中連接數據庫需要一個(gè)特殊的屬性,JDBC URL,它用于連接我們需要操作的數據庫
  • JDBC URL的標準由三部分組成,各部分間用冒號分隔。
jdbc:子協(xié)議:子名稱(chēng)
協(xié)議:JDBC URL中的協(xié)議總是jdbc 
子協(xié)議:子協(xié)議用于標識一個(gè)數據庫驅動(dòng)程序
子名稱(chēng):一種標識數據庫的方法。子名稱(chēng)可以依不同的子協(xié)議而變化,用子名稱(chēng)的目的是為了定位數據庫提供足夠的信息。包含主機名(對應服務(wù)端的ip地址),端口號,數據庫名

下面我來(lái)列舉幾個(gè)常見(jiàn)的JDBC URL,大家使用的時(shí)候直接復制就好

// 對于 Oracle 數據庫連接,采用如下形式: 
jdbc:oracle:thin:@localhost:1521:DatabaseName
// 對于 SQLServer 數據庫連接,采用如下形式:
jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
// 對于 MYSQL 數據庫連接,采用如下形式:   
jdbc:mysql://localhost:3306/DatabaseName
// 插入中文的時(shí)候,這個(gè)url要寫(xiě)成這個(gè)
jdbc:mysql://localhost:3306/數據庫名稱(chēng)?useUnicode=true&characterEncoding=UTF-8

小伙伴們注意一下,當我們使用Java向數據庫中插入一個(gè)數據時(shí),如果是中文,首先數據庫和表的編碼是utf8,其次就是我們要在URL中聲明一下編碼是UTF-8,不然插入數據是?,如果你們遇到這個(gè)問(wèn)題,那就忽略它

好了,下面是連接數據庫的示例代碼,這里我操作的是Mysql數據庫

package com.company;
// 導入依賴(lài)包
import org.junit.Test;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class Demo1 {
/*
*獲取connect的三種方式
*  */
    public static void main(String[] args) {
        System.out.println("JDBC Test...");
    }
	
	// 使用Driver來(lái)實(shí)現數據庫連接
    @Test
    public void test1() throws SQLException {
		// 
        Driver driver=new com.mysql.jdbc.Driver();
        Properties p1 = new Properties();
        p1.setProperty("user", "root");
        p1.setProperty("password", "mysql123");
        Connection connect = driver.connect("jdbc:mysql://localhost:3306/myemployees", p1);
        System.out.println("connect = " + connect);

    }
	
	// 使用DriverManager來(lái)實(shí)現數據庫連接
    @Test
    public void test2() throws SQLException {
        com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
        Properties p1 = new Properties();
        p1.setProperty("user", "root");
        p1.setProperty("password", "mysql123");
        DriverManager.registerDriver(driver);
        Connection connection = DriverManager.getConnection
                ("jdbc:mysql://localhost:3306/myemployees", p1);

        System.out.println("connection = " + connection);

    }
	// 將賬號密碼抽出到配置文件中,并使用IO流讀取配置文件的方式連接數據庫
    @Test
    public void test3() throws Exception {
        Properties p = new Properties();

        FileInputStream fis = new FileInputStream("p.properties");
        p.load(fis);
        fis.close();
        Class.forName(p.getProperty("driverClass"));
        Connection connection = DriverManager.getConnection(p.getProperty("url"),
                p.getProperty("user"), p.getProperty("password"));
        System.out.println("connection = " + connection);

    }
}

properties文件內容

url=jdbc:mysql://localhost:3306/myemployees
user=root
password=mysql123
driverClass=com.mysql.jdbc.Driver

六、使用PreparedStatement

介紹完注冊驅動(dòng)與數據庫的連接,接下來(lái)就是操作SQL了,在JDBC中,操作SQL需要使用Connection 對象的 preparedStatement() 方法獲取 PreparedStatement 對象

PreparedStatement 接口是 Statement 的子接口,它表示一條預編譯過(guò)的 SQL 語(yǔ)句

PreparedStatement 對象所代表的 SQL 語(yǔ)句中的參數用問(wèn)號(?)來(lái)表示,調用 PreparedStatement 對象的 setXxx() 方法來(lái)設置這些參數. setXxx() 方法有兩個(gè)參數,第一個(gè)參數是要設置的 SQL 語(yǔ)句中的參數的索引(從 1 開(kāi)始),第二個(gè)是設置的 SQL 語(yǔ)句中的參數的值

在操作SQL前還要說(shuō)明一下數據類(lèi)型,我們知道SQL與Java的數據類(lèi)型命名是不一樣的,所以我們在編碼時(shí)要注意

使用PreparedStatementSQL的操作步驟

1.調用連接對象的prepareStatement方法,創(chuàng )建PreparedStatement對象

2.完成預編譯的SQL語(yǔ)句

3.對SQL語(yǔ)句中的占位符進(jìn)行賦值

4.提交SQL語(yǔ)句

5.釋放資源

接下來(lái)就是操作SQL增刪改查的示例代碼(為了方便操作,我將數據庫連接抽出到了JDBCUtils類(lèi)中)

// 使用PreparedStatement來(lái)完成數據的增刪改查操作
package com.company.jdbc;

import org.junit.Test;

import java.io.FileInputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/*
 對數據庫進(jìn)行增,刪,改,查的操作
 */
public class CRUDDemo {

    /*
        添加一條數據

        CREATE TABLE student(
        sid INT,
        sname VARCHAR(20),
        sage INT
        )
     */
    @Test
    public void test() throws SQLException {
        //1.獲取數據庫連接對象
        Connection connection = JDBCUtils.getConnection();
        //2.預編譯
        // ? : 占位符(只能是設置數據的地方可以寫(xiě)成占位符)
        String sql = "insert into student(sid,sname,sage) values(?,?,?)";
        PreparedStatement ps = connection.prepareStatement(sql);
        //3.給占位符賦值
        /*
        setInt(int parameterIndex, int x)
        parameterIndex : 參數索引(第幾個(gè)占位符)
        x : 數據
         */
        ps.setInt(1,100);
        //數據設置成中文可不可以取決于表的編碼集
        ps.setString(2,"longge");
        ps.setInt(3,20);
        //4.執行sql
        //返回值 : 有幾條數據受到影響
        int result = ps.executeUpdate();//增,刪,改的語(yǔ)句使用該方法
        System.out.println("有"+result+"條數據受到影響");
        //5.關(guān)資源
        JDBCUtils.close(ps,connection);
    }

    /*
        改
     */
    @Test
    public void test2() throws SQLException {
        //1.獲取數據庫連接對象
        Connection connection = JDBCUtils.getConnection();
        //2.預編譯
        String sql = "update student set sid=? where sid=?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //3.給占位符賦值
        ps.setInt(1,10);
        ps.setInt(2,100);
        //4.執行sql語(yǔ)句
        int result = ps.executeUpdate();
        System.out.println("有"+result+"條數據受到影響");
        //5.關(guān)閉資源
        JDBCUtils.close(ps,connection);
    }

    /*
        刪除數據
     */
    @Test
    public void test3() throws SQLException {
        //1.獲取數據庫連接對象
        Connection connection = JDBCUtils.getConnection();
        //2.預編譯
        String sql = "delete from student where sid=?";
        PreparedStatement ps = connection.prepareStatement(sql);
        //3.給占位符賦值
        ps.setInt(1,10);
        //4.執行sql語(yǔ)句
        int i = ps.executeUpdate();
        System.out.println("有"+i+"條數據受到影響");
        //5.關(guān)閉資源
        JDBCUtils.close(ps,connection);
    }

    /*
        查詢(xún)數據
     */
    @Test
    public void test4() throws Exception {
        List<Student> students = getStudent();
        for (Student s : students) {
            System.out.println(s);
        }

    }

    public List<Student> getStudent() throws Exception {
        //1.獲取數據庫連接對象
        Connection connection = JDBCUtils.getConnection();
        //2.預編譯
        PreparedStatement ps = connection.prepareStatement("select sid,sname,sage from student");
        //3.執行sql語(yǔ)句
        ResultSet resultSet = ps.executeQuery();//查詢(xún)語(yǔ)必須執行此方法

        List<Student> list =  new ArrayList<>();
        //4.遍歷ResultSet
        while(resultSet.next()){//是否有數據
            /*
                getInt(String columnLabel) :根據字段名獲取對應的數據
                getInt(int columnIndex) : 根據列的索引獲取對應的數據
             */
            int sid = resultSet.getInt("sid");
            String sname = resultSet.getString("sname");
            int sage = resultSet.getInt("sage");

            //System.out.println(sid + " " + sname + " " + sage);
            list.add(new Student(sid,sname,sage));
        }
        //5.關(guān)閉資源
        JDBCUtils.close(ps,connection,resultSet);

        return list;
    }

}

JDBCUtils連接數據庫的工具類(lèi)

//JDBCUtils類(lèi),專(zhuān)門(mén)實(shí)現數據庫的連接與資源釋放操作
package com.company.jdbc;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    static{
        FileInputStream fis = null;
        try {
            //1.獲取數據庫連接對象
            //通過(guò)Properties讀取內容
            //1.創(chuàng  )建Properties對象
            Properties p = new Properties();
            //2.加載流
            fis = new FileInputStream("jdbc.properties");
            p.load(fis);
            driverClass = p.getProperty("driverClass");
            url = p.getProperty("url");
            username = p.getProperty("username");
            password = p.getProperty("password");
        }catch (Exception e){
            //終止程序的運行
            e.printStackTrace();
            //將編譯時(shí)異常轉換成運行時(shí)異常
            throw new RuntimeException("xxxxxxxx");
        }finally {
            if (fis != null){
                //3.關(guān)資源
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /*
        獲取連接對象
     */
    public static Connection getConnection(){
        try {
            Class.forName(driverClass);
            //獲取數據庫連接對象
            Connection connection = DriverManager.getConnection(url, username, password);
            return connection;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("獲取連接失敗");
        }
    }

    /*
        關(guān)閉資源
     */
    public static void close(PreparedStatement ps, Connection connection) {
        if (ps != null){
            try {
                ps.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        if (connection != null){
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    public static void close(PreparedStatement ps, Connection connection, ResultSet resultSet) {
        close(ps,connection);
        if (resultSet != null){
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

七、關(guān)于ResultSet的說(shuō)明

在前面對數據的增刪改查操作中,查詢(xún)操作比較復雜一些,因為我們要接收數據庫返回的結果,因此我們要了解一下ResultSet 接口,它由數據庫廠(chǎng)商實(shí)現

查詢(xún)需要調用Prepared Statement 的 executeQuery() 方法,查詢(xún)結果是一個(gè) ResultSet 對象

ResultSet 對象維護了一個(gè)指向當前數據行的游標,初始的時(shí)候,游標在第一行之前,可以通過(guò) ResultSet 對象的 next() 方法移動(dòng)到下一行,具體方法可以自定百度

ResultSet:代表結果集,其封裝了使用 JDBC 進(jìn)行查詢(xún)的結果. 調用 PreparedStatement 對象的 executeQuery() 可以得到結果集.ResultSet 返回的實(shí)際上就是一張數據表. 有一個(gè)指針指向數據表的第一條記錄的前面

 

八、總結

本章主要介紹了JDBC以及JDBC如何連接數據庫,實(shí)現數據的增刪改查操作,下一章是JDBC的擴展知識—>我們自己實(shí)現的那個(gè)連接數據庫的工具類(lèi)畢竟不是那么嚴謹,下一章就是介紹一個(gè)框架,以后連接數據庫就不用這么麻煩了.

到此這篇關(guān)于Java基礎之JDBC的數據庫連接與基本操作的文章就介紹到這了,更多相關(guān)JDBC的數據庫連接與基本操作內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

五月综合激情婷婷六月色窝| 免费天堂无码成人AV电影| 亚洲AV成人无码网站天堂网| 双乳奶水饱满少妇呻吟免费看| 国产高清不卡无码视频| 一区二区三区午夜无码视频|