程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解經過JDBC停止復雜的增刪改查(以MySQL為例)

詳解經過JDBC停止復雜的增刪改查(以MySQL為例)

編輯:關於JAVA

詳解經過JDBC停止復雜的增刪改查(以MySQL為例)。本站提示廣大學習愛好者:(詳解經過JDBC停止復雜的增刪改查(以MySQL為例))文章只能為提供參考,不一定能成為您想要的結果。以下是詳解經過JDBC停止復雜的增刪改查(以MySQL為例)正文


前言:什麼是JDBC

Java 數據庫銜接,(Java Database Connectivity,簡稱JDBC)是Java言語中用來標准客戶端順序如何來訪問數據庫的使用順序接口,提供了諸如查詢和更新數據庫中數據的辦法。JDBC也是Sun Microsystems的商標。它JDBC是面向關系型數據庫的。

復雜地說,就是用於執行SQL語句的一類Java API,經過JDBC使得我們可以直接運用Java編程來對關系數據庫停止操作。經過封裝,可以使開發人員運用純Java API完成SQL的執行。

一、預備任務(一):MySQL裝置配置和根底學習

運用JDBC操作數據庫之前,首先你需求有一個數據庫。這裡提供了3個鏈接供讀者自學,假如曾有過SQL言語的運用閱歷(包括在學校中的課堂學習),前兩個鏈接足以上手。

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)銜接的獲取

在操作前必需先獲取與數據庫的銜接。

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類。

Connection

java.sql

接口 Connection

一切超級接口:Wrapper

--------------------------------------------------------------------------------

public interface Connectionextends Wrapper

與特定數據庫的銜接(會話)。在銜接上下文中執行 SQL 語句並前往後果。

Connection 對象的數據庫可以提供描繪其表、所支持的 SQL 語法、存儲進程、此銜接功用等等的信息。此信息是運用 getMetaData 辦法取得的。

PreparedStatemnt

java.sql

接口 PreparedStatement

一切超級接口:Statement, Wrapper一切已知子接口: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一切已知子接口:CachedRowSet, FilteredRowSet, JdbcRowSet, JoinRowSet,RowSet,SyncResolver, WebRowSet

--------------------------------------------------------------------------------

public interface ResultSetextends Wrapper

表示數據庫後果集的數據表,通常經過執行查詢數據庫的語句生成。  

六、考慮問題

1.每次SQL操作都需求樹立和封閉銜接,這勢必會耗費少量的資源開支,如何防止?

剖析:可以采用銜接池,對銜接停止一致維護,不用每次都樹立和封閉。現實上這是很多對JDBC停止封裝的工具所采用的。

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

剖析:在執行SQL語句時,數據庫會嘗試停止轉換。依據我的實驗,假如用內容為純字母的String對象傳入tinyint的age屬性時,會被轉化成0。詳細轉化規則應該和數據庫有關。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved