天天看點

Java學習路線-40:Java資料庫程式設計基礎操作第36 章 : Java資料庫程式設計基礎操作第37 章 : Statement資料庫操作接口第38 章 : PreparedStatement資料庫操作

第36 章 : Java資料庫程式設計基礎操作

156 JDBC簡介

JDBC 屬于一種服務,所有服務都必須按照指定的流程進行操作

Java Database Connectivity

開發包 java.sql

核心組成 DriverManager

接口 Connection、Statement、PreparedStatement、ResultSet

四種連接配接方式:

JDBC-ODBC 橋連接配接 JDK支援,性能較差

JDBC 一般隻連接配接本地服務

JDBC網絡連接配接 連接配接網絡資料庫

JDBC協定連接配接

157 連接配接MySQL資料庫

需要配置驅動程式路徑

通過反射機制加載資料庫驅動程式類

整個JDBC設計實作的就是一個工廠類

pom.xml

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.18</version>
</dependency>      
import java.sql.Connection;
import java.sql.DriverManager;

class Demo {
    // MySQL < 8.0
    // static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    // static final String DB_URL = "jdbc:mysql://localhost:3306/data";

    // MySQL >= 8.0
    private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://localhost:3306/data?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";


    public static void main(String[] args) throws Exception {
        // 注冊 JDBC 驅動
        Class.forName(JDBC_DRIVER);

        // 打開連結
        Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);

        // 關閉連結
        conn.close();

    }

}      

參考:

https://www.runoob.com/java/java-mysql-connect.html

第37 章 : Statement資料庫操作接口

158 Statement接口簡介

Statement 資料操作

門面設計模式

Connection - 建立 -> Statement - 操作 -> SQl資料庫      

常用操作

// 資料更新 insert update delete 傳回影響行數
int executeUpdate(String sql)

// 資料查詢 select 傳回查詢結果
ResultSet executeQuery(String sql)      

159 Statement實作資料更新

建立學生表

create table student(
    id int not null PRIMARY key auto_increment,
    name varchar(20),
    age int
)      
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

class Demo {

    // MySQL >= 8.0
    private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://localhost:3306/data?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";


    public static void main(String[] args) throws Exception {
        // 注冊 JDBC 驅動
        Class.forName(JDBC_DRIVER);

        // 打開連結
        Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);

        // 執行SQL語句
        Statement statement = conn.createStatement();
        String sql = "insert into student(name, age) values('Tom', 23)";
        int count = statement.executeUpdate(sql);
        System.out.println("insert count: " + count);
        // insert count: 1
        
        // 關閉連結
        conn.close();

    }

}      

160 Statement實作資料查詢

避免

SELECT *

查詢,跟上具體要傳回的字段名稱

select查詢結果過大也會對程式造成影響,注意加limit限制

// 查詢資料
String sql = "select name, age from student";
ResultSet result = statement.executeQuery(sql);

while (result.next()){
    String name = result.getString("name");
    int age  = result.getInt("age");
    System.out.println(String.format("%s %s", name, age));
    // Tom 23
}      

第38 章 : PreparedStatement資料庫操作

161 Statement問題分析

Statement問題:

1、不能很好描述日期形式

2、SQL拼湊,造成編寫與維護困難

3、對敏感字元資料不能合理拼湊

162 PreparedStatement接口簡介

資料和SQL語句分離, 問号? 作為占位符

// 資料更新
int executeUpdate()

// 資料查詢
ResultSet executeQuery()      

更新資料

String sql = "update student set age = ? where id = ? ";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setInt(1, 16);
statement.setInt(2, 1);

int count = statement.executeUpdate();
System.out.println("update count: " + count);
// 1      

163 使用PreparedStatement實作資料查詢操作

-- 查詢全部資料
select name, age from student

-- 根據id查詢資料
select name, age from student where id = ?

-- 分頁查詢
select name, age from student limit ?

-- 統計查詢
select count(*) from student