經過JDBC進行簡單的增刪改查(以MySQL爲例) 21分鐘 MySQL 入門教程 一千行MySQL學習筆記 各類數據庫對應的jar包、驅動類名和URL格式 各類數據庫對應的jar包、驅動類名和URL

目錄html

前言:什麼是JDBCjava

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

2、準備工做(二):下載數據庫對應的jar包並導入git

3、JDBC基本操做sql

(1)定義記錄的類(可選)數據庫

(2)鏈接的獲取編程

(3)insertapi

(4)updateoracle

(5)selectapp

(6)delete

4、測試

5、代碼分析

6、思考問題

 

 

前言:什麼是JDBC

  維基百科的簡介:

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

  簡單地說,就是用於執行SQL語句的一類Java API,經過JDBC使得咱們能夠直接使用Java編程來對關係數據庫進行操做。經過封裝,可使開發人員使用純Java API完成SQL的執行。

 

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

  使用JDBC操做數據庫以前,首先你須要有一個數據庫。這裏提供了3個連接供讀者自學,若是曾有過SQL語言的使用經歷(包括在學校中的課堂學習),前兩個連接足以上手。

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

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

  3.簡易命令查詢 :一千行MySQL學習筆記

 

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

  下圖是我接下來用於演示的數據庫的表。

    

 

2、準備工做(二):下載數據庫對應的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;

 

3、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;
}
 

 

4、測試

  在測試前,須要在系統中打開對應數據庫的服務。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    
============================
 

 

5、代碼分析

  在上述對數據庫進行增刪改查的過程當中,能夠發現其共性部分,即通用的流程:

  (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

表示數據庫結果集的數據表,一般經過執行查詢數據庫的語句生成。

  

6、思考問題

1.每次SQL操做都須要創建和關閉鏈接,這勢必會消耗大量的資源開銷,如何避免?

分析:能夠採用鏈接池,對鏈接進行統一維護,沒必要每次都創建和關閉。事實上這是不少對JDBC進行封裝的工具所採用的。

 

2.Java代碼中,傳入的數據格式與數據庫定義不一樣怎麼辦?如把Java的String對象賦值給數據庫的tinyint屬性。

分析:在執行SQL語句時,數據庫會嘗試進行轉換。根據個人實驗,若是用內容爲純字母的String對象傳入tinyint的age屬性時,會被轉化成0。具體轉化規則應該和數據庫有關。

相關文章
相關標籤/搜索