1. 程式人生 > 資料庫 >java day36 JDBC連線資料庫

java day36 JDBC連線資料庫

1、什麼是JDBC

1.1 什麼是JDBC

  • JDBC(Java Database Connectivity)Java連線資料庫規範(標準),可以使用java語言連線資料庫完成CRUD操作
  • JDBC API允許使用者訪問任何形式的表格資料,尤其是儲存在關係資料庫中的資料
  • 從根本上來說,JDBC 是一種規範,它提供了一套完整的介面,允許行動式訪問到底層資料庫,因此可以用 Java編寫不同型別的可執行檔案,例如:
    • Java 應用程式
    • Java Applets
    • Java Servlets
    • Java ServerPages(JSPs)
    • Enterprise JavaBeans (EJBs)
  • 所有這些不同的可執行檔案就可以使用 JDBC
    驅動程式來訪問資料庫,這樣可以方便的訪問資料。 JDBC 具有 ODBC 一樣的效能,允許 Java 程式包含與資料庫無關的程式碼。

1.2 JDBC架構

  • JDBC 的 API 支援兩層和三層處理模式進行資料庫訪問,但一般的 JDBC 架構由兩層處理模式組成:
    • JDBC API: 提供了應用程式對 JDBC 管理器的連線。
    • JDBC Driver API: 提供了 JDBC 管理器對驅動程式連線。
  • JDBC API 使用驅動程式管理器和資料庫特定的驅動程式來提供異構(heterogeneous)資料庫的透明連線。
  • JDBC 驅動程式管理器可確保正確的驅動程式來訪問每個資料來源。該驅動程式管理器能夠支援連線到多個異構資料庫的多個併發的驅動程式。

在這裡插入圖片描述

1.3 常用JDBC API

JDBC 是由多個介面和類進行功能實現。

型別許可權定名簡介
classjava.sql.DriverManager管理多個數據庫驅動類,提供了獲取資料庫連線的方法()
interfacejava.sql.Connection代表一個數據庫連線(當connection不是null時,表示已連線資料庫())
interfacejava.sql.Statement傳送SQL語句到資料庫工具 ()
interfacejava.sql.ResultSet儲存SQL查詢語句的結果資料(結果集)
classjava.sql.SQLException處理資料庫應用程式時所發生的異常

1.4 環境搭建

  1. 在專案下新建 lib 資料夾,用於存放 jar 檔案。
  2. 將 mysql 驅動複製到專案的 lib 資料夾中。
  3. 選中 lib 資料夾右鍵 Add as Libraay,點選 OK。

2、使用JDBC開發

2.1 載入驅動

使用 手動載入位元組碼檔案到 JVM 中。

Class.forName("com.mysql.jdbc.Driver");//載入驅動

2.1 獲取連線物件

  • 通過 DriverManager.getConnection(url,user,password) 獲取資料庫連線物件
    • URL:jdbc:mysql://localhost:3306/wzy
    • username:root
    • password:root
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/wzy?useUnicode=true&characterEncoding=utf8", "root","root");

2.1 獲取操作物件

//通過連線物件獲取操作物件
Statement statement = connection.createStatement();

2.1 執行sql語句

執行語句分兩種,

  • 一種是executeUpdate,用於執行DML語句。返回的資料是int型別的戶數,表示執行sql語句後,影響資料庫資料的數量
ResultSet resultSet = statement.executeQuery("select * from user where is_delete=1 or is_delete=0");
  • 另一種是executeQuery,用於執行DQL語句。返回的是一個數組集合,儲存著從資料庫返回的資料表。可用於後端資料處理
String sql = "insert into user (username,password,sex,hobbies,addrs,is_delete) values " +
                "('wss','123','男','吃飯','廣西',1)," +
                "('wss','123','男','聊天','廣西',1)";
        int i = statement.executeUpdate(sql);

2.1 處理結果

//建立一個泛型為User的ArrayList物件
        List<User> list = new ArrayList<>();
        User user;

        while (resultSet.next()){

            //根據欄位名獲取資料庫對應的資料
            //使用此方法的前提是,需要知道資料庫表的欄位
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String sex = resultSet.getString("sex");
            String hobbies = resultSet.getString("hobbies");
            String addrs = resultSet.getString("addrs");

            /*
            //根據欄位的索引獲取資料,索引從1開始
            //當不知道資料庫的欄位時,可以使用此種方法
            int id = resultSet.getInt(1);
            String username = resultSet.getString(2);
            String password = resultSet.getString(3);
            String sex = resultSet.getString(4);
            String hobbies = resultSet.getString(5);
            String addrs = resultSet.getString(6);
            */

            user = new User(id,username,password,sex,hobbies,addrs);
            list.add(user);
        }

2.1 關閉資源

遵循原則,釋放所使用到的資源物件。

statement.close();
conn.close();

2.1 綜合案例

  1. 向資料庫中插入資料
  2. 查詢wzy資料庫中,user表裡的資料

package com.qf.wzy.entity;

/**
 * @Author wzy
 * @Date 0007 2021-01-07 16:00
 * @Version 1.0
 *
 * 實體類
 * 用於接收來自資料庫的各種引數,構建成一份資料模板
 */
public class User {
     private Integer id;
     private String username;
     private String password;
     private String sex;
     private String hobbies;
     private String addrs;


    public User() {
    }

    public User(Integer id, String username, String password, String sex, String hobbies, String addrs) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.sex = sex;
        this.hobbies = hobbies;
        this.addrs = addrs;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getHobbies() {
        return hobbies;
    }

    public void setHobbies(String hobbies) {
        this.hobbies = hobbies;
    }

    public String getAddrs() {
        return addrs;
    }

    public void setAddrs(String addrs) {
        this.addrs = addrs;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", hobbies='" + hobbies + '\'' +
                ", addrs='" + addrs + '\'' +
                '}';
    }
}

package com.qf.wzy.utils;

import java.io.IOException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @Author wzy
 * @Date 0007 2021-01-07 17:18
 * @Version 1.0
 *
 * 封裝常用到的各種工具類方法
 */
public class DButils {
    private static String className=null;
    private static String url=null;
    private static String username=null;
    private static String password=null;

    static {
        Properties properties = new Properties();
        try {
            properties.load(DButils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
            className = properties.getProperty("className");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //封裝連線物件的方法
    public static Connection getConnection(){
        //定義連線物件
        Connection connection=null;

        //通過DriverManger獲取連線物件
        try {
            //載入驅動
            Class.forName(className);
            //呼叫DriverManager的getConnection獲取連線物件
            connection = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //返回連線物件
        return connection;
    }



    public static void closeAll(AutoCloseable ... closeables){
        for (AutoCloseable closeable:closeables) {
            if (closeable!=null){
                try {
                    closeable.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

package com.qf.wzy.dao;

import com.qf.wzy.entity.User;

/**
 * @Author wzy
 * @Date 0007 2021-01-07 17:50
 * @Version 1.0
 *
 * 介面,用於資料訪問層的類繼承
 */
public interface IUserDao {
    //新增使用者
    void addUser(User user);

    //檢視使用者名稱是否存在
    int checkUsername(String username);

}

package com.qf.wzy.dao.impl;

import com.qf.wzy.dao.IUserDao;
import com.qf.wzy.entity.User;
import com.qf.wzy.utils.DButils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @Author wzy
 * @Date 0007 2021-01-07 17:51
 * @Version 1.0
 *
 * 資料訪問層
 * 封裝操作資料庫的方法,並返回操作結果給業務訪問層處理
 */
public class UserDaoImpl implements IUserDao {
    @Override
    public void addUser(User user) {
    }

    @Override
    public int checkUsername(String username) {
        Connection connection=null;
        PreparedStatement ps=null;
        ResultSet resultSet=null;

        int count=0;

        try {
            connection = DButils.getConnection();
            //通過預處理處理sql語句,並返回預處理物件,?代表佔位符
            //此刻預處理的原因是防止sql注入攻擊
            ps = connection.prepareStatement("select count(*) from user where username=?");
            //對佔位符進行復制,第一個引數是佔位符的索引(從1開始),第二個引數是賦予佔位符的值
            ps.setString(1,username);
            resultSet = ps.executeQuery();
            if (resultSet.next()){
                //獲取查詢到呃
                count=resultSet.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally {
            DButils.closeAll(connection,ps,resultSet);
        }
        return count;
    }
}

package com.qf.wzy.jdbc;

import com.qf.wzy.entity.User;
import com.qf.wzy.utils.DButils;
import org.junit.Test;
import sun.security.pkcs11.Secmod;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author wzy
 * @Date 0007 2021-01-07 15:37
 * @Version 1.0
 *
 *
 */
public class Demo01 {


    /**
     * 插入資料
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        //載入資料庫連線驅動
        Connection connection = DButils.getConnection();
        //通過連線物件獲取操作物件
        Statement statement = connection.createStatement();

        //通過操作物件執行sql語句,並返回列印結果集
        String sql = "insert into user (username,password,sex,hobbies,addrs,is_delete) values " +
                "('wss','123','男','吃飯','廣西',1)," +
                "('wss','123','男','聊天','廣西',1)";

        int i = statement.executeUpdate(sql);
        if (i!=0){
            System.out.println("新增成功, "+i+" 條資料被新增!");
        }else {
            System.out.println("新增失敗, 0 條資料被新增!");
        }

        //關閉資源
        /*connection.close();
        statement.close();*/

        DButils.closeAll(connection,statement);
    }


    /**
     * 查詢資料
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        //呼叫DButils類封裝的getConnection方法獲取連線物件
        Connection connection = DButils.getConnection();

        //獲取操作物件
        Statement statement = connection.createStatement();
        ResultSet resultSet = statement.executeQuery("select * from user where is_delete=1 or is_delete=0");

        //建立一個泛型為User的ArrayList物件
        List<User> list = new ArrayList<>();
        User user;

        while (resultSet.next()){

            //根據欄位名獲取資料庫對應的資料
            //使用此方法的前提是,需要知道資料庫表的欄位
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String sex = resultSet.getString("sex");
            String hobbies = resultSet.getString("hobbies");
            String addrs = resultSet.getString("addrs");

            /*
            //根據欄位的索引獲取資料,索引從1開始
            //當不知道資料庫的欄位時,可以使用此種方法
            int id = resultSet.getInt(1);
            String username = resultSet.getString(2);
            String password = resultSet.getString(3);
            String sex = resultSet.getString(4);
            String hobbies = resultSet.getString(5);
            String addrs = resultSet.getString(6);
            */

            user = new User(id,username,password,sex,hobbies,addrs);
            list.add(user);
        }
        //關閉資源
        DButils.closeAll(statement,connection,resultSet);

        if (list.size()>0){
            //遍歷list輸出查詢資料
            for (User u:list) {
                System.out.println(u);
            }
            System.out.println("查詢完畢,共有 " +list.size()+" 條資料" );
        }

        else {
            System.out.println("查詢失敗");
        }
    }

    /**
     * 更新資料
     * @throws SQLException
     */
    @Test
    public void test4() throws SQLException {
        Connection connection = DButils.getConnection();
        Statement statement = connection.createStatement();
        String update_sql = "update user set password='123456' where is_delete=0";
        int i = statement.executeUpdate(update_sql);

        if (i!=0){
            System.out.println("更新成功, "+i+" 條資料被更新!");
        }
        else {
            System.out.println("查無符合資料,更新失敗!");
        }
        //關閉資源
        DButils.closeAll(connection,statement);
    }

    /**
     * 刪除資料
     */
    @Test
    public void test3() throws Exception {
        Connection connection = DButils.getConnection();
        Statement statement = connection.createStatement();

        String delete_sql = "delete from user where username='wss'";
        int i = statement.executeUpdate(delete_sql);
        if (i!=0){
            System.out.println("刪除成功, "+i+" 條資料被刪除!");
        }
        else {
            System.out.println("查無符合資料,刪除失敗!");
        }

        //關閉資源
        DButils.closeAll(connection,statement);
    }
}

資料庫連線配置

  1. className:資料庫驅動名稱
  2. url:資料庫地址
  3. username:資料庫賬戶名
  4. password:資料庫密碼
className=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/wzy?characterEncoding=utf8
username=root
password=root