1. 程式人生 > >JDBC進行簡單的增刪改查

JDBC進行簡單的增刪改查

通過JDBC進行簡單的增刪改查(以MySQL為例)

目錄

前言:什麼是JDBC

一、準備工作(一):MySQL安裝配置和基礎學習

二、準備工作(二):下載資料庫對應的jar包並匯入

三、JDBC基本操作

(1)定義記錄的類(可選)

(2)連線的獲取

(3)insert

(4)update

(5)select

(6)delete

四、測試

五、程式碼分析

六、思考問題

 

 

前言:什麼是JDBC

  維基百科的簡介:

  Java 資料庫連線,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法。JDBC也是Sun Microsystems的商標。它JDBC是面向關係型資料庫的。

  簡單地說,就是用於執行SQL語句的一類Java API,通過JDBC使得我們可以直接使用Java程式設計來對關係資料庫進行操作。通過封裝,可以使開發人員使用純Java API完成SQL的執行。

 

一、準備工作(一):MySQL安裝配置和基礎學習

  使用JDBC操作資料庫之前,首先你需要有一個數據庫。這裡提供了3個連結供讀者自學,如果曾有過SQL語言的使用經歷(包括在學校中的課堂學習),前兩個連結足以上手。

  1.安裝和配置:mysql安裝圖解 mysql圖文安裝教程(詳細說明)

  2.基本操作:21分鐘 MySQL 入門教程

  3.簡易命令查詢 :

一千行MySQL學習筆記

 

  建議邊看入門教程,邊練習,在練習insert、update、select、delete等基本操作的同時,將後面要用的表建好。

  下圖是我接下來用於演示的資料庫的表。

    

 

二、準備工作(二):下載資料庫對應的jar包並匯入

  使用JDBC需要在工程中匯入對應的jar包。資料庫與JDBC包的對應關係可以參考各種資料庫對應的jar包、驅動類名和URL格式。在Eclipse下的匯入方法:

  在工程的圖示上右擊,選擇”Properties”,在”Java Bulid Path”中選擇”Add External JARs…”,選擇下載並解壓後獲得的jar包。

        

  如果對MySQL進行操作,這時下面的import就不會報錯了:

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

  除此以外,還需要JDBC的包,直接import即可。

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

 

三、JDBC基本操作

  為了簡單起見,與資料庫相關的操作、命令、引數都被硬編碼了。有興趣的讀者可以對這些進行探索,降低資料與操作的耦合性。

  先看具體程式碼並實踐,本文第五部分對用到的API稍作了研究。

  下面的所有方法和資料成員都在public class JDBCOperation內部。

(1)定義記錄的類(可選)

  這樣做主要是為了便於操作和介面定義,是非必須的。

複製程式碼

static class Student {
        private String Id;
        private String Name;
        private String Sex;
        private String Age;

        Student(String Name, String Sex, String Age) {
            this.Id = null; //default
            this.Name = Name;
            this.Sex = Sex;
            this.Age = Age;
        }

        public String getId() {
            return Id;
        }

        public void setId(String Id) {
            this.Id = Id;
        }

        public String getName() {
            return Name;
        }

        public void setName(String Name) {
            this.Name = Name;
        }

        public String getSex() {
            return Sex;
        }

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

        public String getAge() {
            return Age;
        }

        public void setage(String Age) {
            this.Age = Age;
        }
}

複製程式碼

 

(2)連線的獲取

  在操作前必須先獲取與資料庫的連線。

  driver、url的格式同樣可以參考各種資料庫對應的jar包、驅動類名和URL格式

複製程式碼

private static Connection getConn() {
    String driver = "com.mysql.jdbc.Driver";
    String url = "jdbc:mysql://localhost:3306/samp_db";
    String username = "root";
    String password = "";
    Connection conn = null;
    try {
        Class.forName(driver); //classLoader,載入對應驅動
        conn = (Connection) DriverManager.getConnection(url, username, password);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}

複製程式碼

 

(3)insert

複製程式碼

private static int insert(Student student) {
    Connection conn = getConn();
    int i = 0;
    String sql = "insert into students (Name,Sex,Age) values(?,?,?)";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        pstmt.setString(1, student.getName());
        pstmt.setString(2, student.getSex());
        pstmt.setString(3, student.getAge());
        i = pstmt.executeUpdate();
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}

複製程式碼

 

(4)update

複製程式碼

private static int update(Student student) {
    Connection conn = getConn();
    int i = 0;
    String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        i = pstmt.executeUpdate();
        System.out.println("resutl: " + i);
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}

複製程式碼

 

(5)select

  以select * from XXX為例。

複製程式碼

private static Integer getAll() {
    Connection conn = getConn();
    String sql = "select * from students";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement)conn.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        int col = rs.getMetaData().getColumnCount();
        System.out.println("============================");
        while (rs.next()) {
            for (int i = 1; i <= col; i++) {
                System.out.print(rs.getString(i) + "\t");
                if ((i == 2) && (rs.getString(i).length() < 8)) {
                    System.out.print("\t");
                }
             }
            System.out.println("");
        }
            System.out.println("============================");
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

複製程式碼

 

(6)delete

複製程式碼

private static int delete(String name) {
    Connection conn = getConn();
    int i = 0;
    String sql = "delete from students where Name='" + name + "'";
    PreparedStatement pstmt;
    try {
        pstmt = (PreparedStatement) conn.prepareStatement(sql);
        i = pstmt.executeUpdate();
        System.out.println("resutl: " + i);
        pstmt.close();
        conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return i;
}

複製程式碼

 

四、測試

  在測試前,需要在系統中開啟對應資料庫的服務。MySQL在Windows下的啟動命令為

net start mysql

 

  測試程式碼

複製程式碼

public static void main(String args[]) {
    JDBCOperation.getAll();
    JDBCOperation.insert(new Student("Achilles", "Male", "14"));
    JDBCOperation.getAll();
    JDBCOperation.update(new Student("Bean", "", "7"));
    JDBCOperation.delete("Achilles");
    JDBCOperation.getAll();
}

複製程式碼

 

  Eclipse中的輸出

複製程式碼

============================
1    Ender        male    8    
2    Bean        male    6    
3    Petra        fema    9    
4    Peter        male    9    
5    _Graff        male    40    
6    GOD        fema    255    
============================
============================
1    Ender        male    8    
2    Bean        male    6    
3    Petra        fema    9    
4    Peter        male    9    
5    _Graff        male    40    
6    GOD        fema    255    
7    Achilles    Male    14    
============================
resutl: 1
resutl: 1
============================
1    Ender        male    8    
2    Bean        male    7    
3    Petra        fema    9    
4    Peter        male    9    
5    _Graff        male    40    
6    GOD        fema    255    
============================

複製程式碼

 

五、程式碼分析

  在上述對資料庫進行增刪改查的過程中,可以發現其共性部分,即通用的流程:

  (1)建立Connection物件、SQL查詢命令字串;

  (2)對Connection物件傳入SQL查詢命令,獲得PreparedStatement物件;

  (3)對PreparedStatement物件執行executeUpdate()或executeQurey()獲得結果;

  (4)先後關閉PreparedStatement物件和Connection物件。

  可見,使用JDBC時,最常打交道的是Connection、PreparedStatement這兩個類,以及select中的ResultSet類。查閱Java API手冊可以瞭解其具體的意義和方法。

  下面引用的Java API的資料出自http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/index.html

  

  Connection

java.sql 
介面 Connection

所有超級介面:

Wrapper


public interface Connectionextends Wrapper

 

與特定資料庫的連線(會話)。在連線上下文中執行 SQL 語句並返回結果。

Connection 物件的資料庫能夠提供描述其表、所支援的 SQL 語法、儲存過程、此連線功能等等的資訊。此資訊是使用 getMetaData 方法獲得的。

 

  PreparedStatemnt

java.sql 
介面 PreparedStatement

所有超級介面:

StatementWrapper

所有已知子介面:

CallableStatement


public interface PreparedStatementextends Statement

表示預編譯的 SQL 語句的物件。

SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。

 

常用方法

 boolean  execute()

          在此 PreparedStatement 物件中執行 SQL 語句,該語句可以是任何種類的 SQL 語句。

 ResultSet  executeQuery()

          在此 PreparedStatement 物件中執行 SQL 查詢,並返回該查詢生成的 ResultSet 物件。

 int  executeUpdate()

          在此 PreparedStatement 物件中執行 SQL 語句,該語句必須是一個 SQL 資料操作語言(Data Manipulation Language,DML)語句,比如 INSERT、UPDATE 或 DELETE 語句;或者是無返回內容的 SQL 語句,比如 DDL 語句。

  

  ResultSet

  

java.sql 
介面 ResultSet

所有超級介面:

Wrapper

所有已知子介面:

CachedRowSetFilteredRowSetJdbcRowSetJoinRowSetRowSetSyncResolverWebRowSet


public interface ResultSetextends Wrapper

表示資料庫結果集的資料表,通常通過執行查詢資料庫的語句生成。

  

六、思考問題

1.每次SQL操作都需要建立和關閉連線,這勢必會消耗大量的資源開銷,如何避免?

分析:可以採用連線池,對連線進行統一維護,不必每次都建立和關閉。事實上這是很多對JDBC進行封裝的工具所採用的。

 

2.Java程式碼中,傳入的資料格式與資料庫定義不同怎麼辦?如把Java的String物件賦值給資料庫的tinyint屬性。

分析:在執行SQL語句時,資料庫會嘗試進行轉換。根據我的實驗,如果用內容為純字母的String物件傳入tinyint的age屬性時,會被轉化成0。具體轉化規則應該和資料庫有關。