JAVAWEB學習總結,DAY4(JDBC1)

身在山中不為仙發表於2020-09-25

JDBC

概念:Java Data Base Connectivity(Java資料庫連線):是java訪問資料庫的標準規範
作用:JDBC是用於執行SQL語句的Java API(Java語言通過JDBC可以運算元據庫)

擴充套件:專案裡建立檔案,
lib資料夾作用是存放驅動包檔案
bean資料夾作用是存放封裝類,封裝資料
utils資料夾作用是存放工具類,一般在工具類類名後面加上Utils
檔名.properties檔案是存放配置

Ø 首先:匯入資料庫驅動包
在modules建立一個資料夾:lib
把jar包拷貝貼上到lib資料夾
在jar包上右鍵–>Add as Library—[設定在為在當前Module裡使用,起一名稱],確定

四個核心物件
1.DriverManager:用於註冊驅動
2.Connection: 表示與資料庫建立的連線
3.Statement: 執行SQL語句的物件
4.ResultSet: 結果集或一張虛擬表

DriverManager 驅動管理器
註冊驅動(優化了載入驅動類)
獲得連線
Connection 連線物件, 操作都是基於這個連線的
建立執行sql語句物件Statement
Statement 執行SQL語句物件
excuteQuery(String sql) 執行查詢
excuteUpdate(String sql) 執行增刪改
ResultSet 結果集物件
next() 呼叫一次, 游標向下移動一行, 返回boolean型別
get型別(String 列名); 根據列名獲得資料
使用步驟:(重要)
1.註冊驅動
2.獲取連線
3.建立預編譯SQL語句物件
4.設定引數,執行SQL語句
5.釋放資源

1.註冊驅動
概述:我們java程式需要通過資料庫驅動才能連線到資料庫,因此需要註冊驅動MySQL的驅動的入口類是:com.mysql.jdbc.Driver

DriverManager 類用於註冊驅動,
方法:static void registerDriver(Driver driver);向DriverManager 註冊給定驅動程式

使用:DriverManager.registerDriver(驅動物件);傳入對應引數即可

註冊驅動語句

Class.forName(“com.mysql.jdbc.Driver”); // 後期可以將"com.mysql.jdbc.Driver"字串寫在文
件中.

2.獲取連線
DriverManager 類用於連線
方法:static Connection getConnection(String url, String user, String password);連線到給定資料庫URL,並返回連線

引數說明:

  1. String url: 連線資料庫的URL,用於說明連線資料庫的位置

  2. String user:資料庫的賬號

  3. String password: 資料庫的密碼

       URL地址格式:協議名:子協議://伺服器名或IP地址:埠號/資料庫名?引數=引數值
       MySQL寫法:jdbc:mysql://localhost:3306/day24
       本地伺服器 簡寫:jdbc:mysql:///day24
    

使用:DriverManager.getConnertion(url,user,password); 傳入對應引數即可

獲取連線語句

          // 連線到MySQL
         // url: 連線資料庫的URL
         // user: 資料庫的賬號
         // password: 資料庫的密碼
          String url="jdbc:mysql://localhost:3306/day24 ";
          String uesrname="root";
          String password="root";
         Connection conn = DriverManager.getConnection(url,uesrname,password);

3.建立預編譯SQL物件 和 4.建立引數,執行SQL語句
獲取Statement 物件介紹
在 Connection 介面中 獲取 Statement 物件

//建立執行sql語句物件
Statement statement=connection.createStatement();

statement 介面

方法:
ResultSet executeQuery(String sql);只能執行MySQL查詢(select)語句,返回結果的集合
int executeUpdate(String sql); 執行的DML((新增)INSERT、(更新)UPDATE、(刪除DELETE)語句,返回受影響的行數

注意:在MySQL中,只要不是查詢就是修改。 executeUpdate:用於執行增刪改 executeQuery:用於 執行查詢

preparedStatement 是statement 子介面
概述:預編譯物件

特點:效能要高,會把SQL語句先編譯,格式固定好,SQL語句中的引數會發生變化,過濾掉使用者輸入的關鍵字(or)

用法:通過connection 物件建立
方法:prepareStatement(String sql); 表示預編譯的sql語句,如果sql語句有引數通過?來佔位

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

setxxx(int i, Obj obj);(xxx是型別 int、String、Long) i指的就是問號的索引(指第幾個問號,從1開始)

ResultSet 介面
概述:是select語句執行查詢的結果集物件,裡邊封裝了查詢的所有結果資料。相當於是一張二維表。如果想要獲取ResultSet裡的資料,就需要對這個物件進行迴圈遍歷:得到其中每一行的每一個欄位的資料。

ResultSet既然用於封裝執行結果的,所以該物件提供的都是用於獲取資料的get方法:
• 獲取任意型別的資料
• getObject(int index)
• getObject(string columnName)

• 獲取指定型別的資料,例如:
• getString(int index)
• getString(String columnName)

l ResultSet還提供了對結果集進行滾動的方法:
• next():移動到下一行
• Previous():移動到前一行
• absolute(int row):移動到指定行 [row從1開始計算]
• beforeFirst():移動resultSet的最前面。
• afterLast() :移動到resultSet的最後面。

建立預編譯語句


String sql="select * from user where username=? and password=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//設定引數,執行sql語句
prepareStatement.setString(1,root);//給第一個?賦值,給使用者名稱賦值
prepareStatement.setString(2,root);//給第二個?賦值,給密碼賦值

ResultSet resultSet=prepareStatement.executeQuery();

User user=null;
while(resultSet.next()){
     user=new User();
     user.setId(resultSet.getInt("id"));
     user.setUsername(resultSet.getString("username"));
     user.setPassword(resultSet.getString("password"));
     user.setNickname(resultSet.getString("nickname"));
}

5.釋放資源

釋放資源(先建立的後關閉)

if(resultSet !=null){
     resultSet.close();
}
if(statement !=null){
     statement.close();
}
if(connection !=null){
     connection.close();
}

案例:

package com.lin.jdbcAn;

import com.lin.utils.JdbcUtils;
import com.mysql.jdbc.Driver;

import java.sql.*;

public class JdbcAnLi {
    public static void main(String[] args) throws Exception {
        //呼叫方法註冊驅動,獲得連線
        Connection connection = JdbcUtils.getConnection();
        //建立執行SQL語句物件
        Statement statement = connection.createStatement();
        //執行sql語句,處理結果
        String select="select * from student";
        ResultSet resultSet = statement.executeQuery(select);
        while (resultSet.next()){
            System.out.println(resultSet.getObject("id"));
        }
        //釋放資源
        JdbcUtils.release(connection,statement,null);
    }
}
//靜態方法類,註冊驅動,獲得連線、釋放資源
package com.lin.utils;

import com.mysql.jdbc.Driver;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JdbcUtils {
    public static String driver;
    public static String url;
    public static String username;
    public static String password;

    static {
        try {
            //讀取db.properties
            InputStream is = JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties");
            //建立properties物件
            Properties properties=new Properties();
            //關聯流
            properties.load(is);
            //獲得配置檔案的內容,根據鍵找值
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            //註冊驅動
            Class.forName(driver);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //獲得連線
    public static Connection getConnection() throws Exception {

        //獲得連線
        Connection connection = DriverManager.getConnection(url, username, password);
        return connection;
    }
     //釋放資源
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        if(resultSet!=null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (statement!=null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection!=null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}