JDBC - คู่มือฉบับย่อ
JDBC คืออะไร?
JDBC ย่อมาจาก Java Database Connectivity ซึ่งเป็น Java API มาตรฐานสำหรับการเชื่อมต่อที่ไม่ขึ้นกับฐานข้อมูลระหว่างภาษาโปรแกรม Java และฐานข้อมูลที่หลากหลาย
ไลบรารี JDBC มี API สำหรับแต่ละงานที่มักเกี่ยวข้องกับการใช้ฐานข้อมูล:
การเชื่อมต่อกับฐานข้อมูล
การสร้างคำสั่ง SQL หรือ MySQL
การดำเนินการแบบสอบถาม SQL หรือ MySQL ในฐานข้อมูล
การดูและแก้ไขบันทึกผลลัพธ์
ข้อกำหนดเบื้องต้น:
คุณต้องมีความเข้าใจที่ดีในสองวิชาต่อไปนี้เพื่อเรียนรู้ JDBC:
การเขียนโปรแกรม Core JAVA
ฐานข้อมูล SQL หรือ MySQL
JDBC - การตั้งค่าสภาพแวดล้อม:
ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าต่อไปนี้แล้ว:
การติดตั้ง Core JAVA
การติดตั้งฐานข้อมูล SQL หรือ MySQL
นอกเหนือจากข้างต้นคุณต้องตั้งค่าฐานข้อมูลที่คุณจะใช้สำหรับโครงการของคุณ สมมติว่านี่คือ EMP และคุณได้สร้างบนโต๊ะพนักงานภายในฐานข้อมูลเดียวกัน
การสร้างแอปพลิเคชัน JDBC:
มีหกขั้นตอนที่เกี่ยวข้องในการสร้างแอปพลิเคชัน JDBC ซึ่งฉันจะสรุปในบทช่วยสอนนี้:
นำเข้าแพ็คเกจ:
สิ่งนี้ต้องการให้คุณรวมแพ็กเกจที่มีคลาส JDBC ที่จำเป็นสำหรับการเขียนโปรแกรมฐานข้อมูล ส่วนใหญ่การใช้ import java.sql. * จะเพียงพอดังนี้:
//STEP 1. Import required packages
import java.sql.*;
ลงทะเบียนไดรเวอร์ JDBC:
สิ่งนี้ต้องการให้คุณเริ่มต้นไดรเวอร์เพื่อให้คุณสามารถเปิดช่องทางการสื่อสารกับฐานข้อมูลได้ ต่อไปนี้เป็นข้อมูลโค้ดเพื่อให้บรรลุสิ่งนี้:
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
เปิดการเชื่อมต่อ:
จำเป็นต้องใช้เมธอด DriverManager.getConnection () เพื่อสร้างอ็อบเจ็กต์การเชื่อมต่อซึ่งแสดงถึงการเชื่อมต่อทางกายภาพกับฐานข้อมูลดังต่อไปนี้:
//STEP 3: Open a connection
// Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
ดำเนินการค้นหา:
สิ่งนี้ต้องใช้ออบเจ็กต์ประเภท Statement หรือ PreparedStatement สำหรับการสร้างและการส่งคำสั่ง SQL ไปยังฐานข้อมูลดังนี้:
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
หากมีคำสั่ง SQL UPDATE, INSERT หรือ DELETE จำเป็นต้องใช้ข้อมูลโค้ดต่อไปนี้:
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);
ดึงข้อมูลจากชุดผลลัพธ์:
ขั้นตอนนี้จำเป็นในกรณีที่คุณกำลังดึงข้อมูลจากฐานข้อมูล คุณสามารถใช้เมธอด ResultSet.getXXX () ที่เหมาะสมเพื่อดึงข้อมูลจากชุดผลลัพธ์ดังนี้:
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
ทำความสะอาดสิ่งแวดล้อม:
คุณควรปิดทรัพยากรฐานข้อมูลทั้งหมดอย่างชัดเจนเมื่อเทียบกับการเก็บรวบรวมขยะของ JVM ดังนี้:
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
โปรแกรม JDBC แรก:
จากขั้นตอนข้างต้นเราสามารถมีโค้ดตัวอย่างรวมต่อไปนี้ซึ่งเราสามารถใช้เป็นเทมเพลตในขณะที่เขียนโค้ด JDBC ของเรา:
โค้ดตัวอย่างนี้ถูกเขียนขึ้นตามสภาพแวดล้อมและการตั้งค่าฐานข้อมูลที่ทำในบทสิ่งแวดล้อม
//STEP 1. Import required packages
import java.sql.*;
public class FirstExample {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/EMP";
// Database credentials
static final String USER = "username";
static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
}//end FirstExample
ตอนนี้ให้เรารวบรวมตัวอย่างข้างต้นดังนี้:
C:\>javac FirstExample.java
C:\>
เมื่อคุณเรียกใช้ FirstExampleมันให้ผลลัพธ์ดังต่อไปนี้:
C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>
วิธี SQLException:
SQLException สามารถเกิดขึ้นได้ทั้งในไดรเวอร์และฐานข้อมูล เมื่อเกิดข้อยกเว้นดังกล่าวอ็อบเจ็กต์ประเภท SQLException จะถูกส่งต่อไปยังประโยค catch
อ็อบเจ็กต์ SQLException ที่ส่งผ่านมีวิธีการต่อไปนี้สำหรับการดึงข้อมูลเพิ่มเติมเกี่ยวกับข้อยกเว้น:
วิธี | คำอธิบาย |
---|---|
getErrorCode () | รับหมายเลขข้อผิดพลาดที่เกี่ยวข้องกับข้อยกเว้น |
getMessage () | รับข้อความแสดงข้อผิดพลาดของไดรเวอร์ JDBC สำหรับข้อผิดพลาดที่จัดการโดยไดรเวอร์หรือรับหมายเลขข้อผิดพลาด Oracle และข้อความสำหรับข้อผิดพลาดฐานข้อมูล |
getSQLState () | รับสตริง XOPEN SQLstate สำหรับข้อผิดพลาดไดรเวอร์ JDBC จะไม่มีการส่งคืนข้อมูลที่เป็นประโยชน์จากวิธีนี้ สำหรับข้อผิดพลาดของฐานข้อมูลรหัส XOPEN SQLstate ห้าหลักจะถูกส่งกลับ วิธีนี้สามารถคืนค่าว่าง |
getNextException () | รับอ็อบเจ็กต์ Exception ถัดไปในห่วงโซ่ข้อยกเว้น |
printStackTrace () | พิมพ์ข้อยกเว้นปัจจุบันหรือที่สามารถโยนได้และส่งกลับไปยังสตรีมข้อผิดพลาดมาตรฐาน |
printStackTrace (PrintStream s) | พิมพ์สิ่งที่สามารถโยนได้นี้และการติดตามย้อนกลับไปยังสตรีมการพิมพ์ที่คุณระบุ |
printStackTrace (PrintWriter w) | พิมพ์สิ่งที่สามารถโยนได้นี้และการติดตามย้อนกลับไปยังตัวเขียนงานพิมพ์ที่คุณระบุ |
ด้วยการใช้ข้อมูลที่มีอยู่จากอ็อบเจ็กต์ Exception คุณสามารถตรวจจับข้อยกเว้นและดำเนินการต่อโปรแกรมของคุณได้อย่างเหมาะสม นี่คือรูปแบบทั่วไปของ try block:
try {
// Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
// Your exception handling code goes between these
// curly braces, similar to the exception clause
// in a PL/SQL block.
}
finally {
// Your must-always-be-executed code goes between these
// curly braces. Like closing database connection.
}
JDBC - ประเภทข้อมูล:
ตารางต่อไปนี้สรุปชนิดข้อมูล JDBC ดีฟอลต์ที่ชนิดข้อมูล Java ถูกแปลงเมื่อคุณเรียกเมธอด setXXX () ของอ็อบเจ็กต์ PreparedStatement หรือ CallableStatement หรือเมธอด ResultSet.updateXXX ()
SQL | JDBC / Java | setXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | updateString |
CHAR | java.lang.String | setString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString |
นิดหน่อย | บูลีน | setBoolean | updateBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | ไบต์ | setByte | updateByte |
SMALLINT | สั้น | setShort | updateShort |
จำนวนเต็ม | int | setInt | updateInt |
ใหญ่ | ยาว | setLong | updateLong |
จริง | ลอย | setFloat | updateFloat |
ลอย | ลอย | setFloat | updateFloat |
สองเท่า | สองเท่า | setDouble | updateDouble |
ตัวแปร | ไบต์ [] | setBytes | updateBytes |
ไบนารี่ | ไบต์ [] | setBytes | updateBytes |
วันที่ | java.sql.Date | setDate | updateDate |
เวลา | java.sql.Time | ตั้งเวลา | updateTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
หยด | java.sql.Blob | setBlob | updateBlob |
ARRAY | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
โครงสร้าง | java.sql.Struct | SetStruct | updateStruct |
JDBC 3.0 ได้ปรับปรุงการสนับสนุนสำหรับชนิดข้อมูล BLOB, CLOB, ARRAY และ REF ขณะนี้อ็อบเจ็กต์ ResultSet มีเมธอด updateBLOB (), updateCLOB (), updateArray () และ updateRef () ที่ช่วยให้คุณสามารถจัดการข้อมูลที่เกี่ยวข้องบนเซิร์ฟเวอร์ได้โดยตรง
เมธอด setXXX () และ updateXXX () ช่วยให้คุณสามารถแปลงชนิด Java ที่ระบุเป็นชนิดข้อมูล JDBC เฉพาะ เมธอด setObject () และ updateObject () ช่วยให้คุณสามารถแมป Java เกือบทุกประเภทกับชนิดข้อมูล JDBC
อ็อบเจ็กต์ ResultSet จัดเตรียมเมธอด getXXX () ที่สอดคล้องกันสำหรับข้อมูลแต่ละชนิดเพื่อดึงค่าคอลัมน์ แต่ละวิธีสามารถใช้ได้กับชื่อคอลัมน์หรือตามตำแหน่งลำดับ
SQL | JDBC / Java | setXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
CHAR | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
นิดหน่อย | บูลีน | setBoolean | getBoolean |
NUMERIC | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | ไบต์ | setByte | getByte |
SMALLINT | สั้น | setShort | getShort |
จำนวนเต็ม | int | setInt | getInt |
ใหญ่ | ยาว | setLong | getLong |
จริง | ลอย | setFloat | getFloat |
ลอย | ลอย | setFloat | getFloat |
สองเท่า | สองเท่า | setDouble | getDouble |
ตัวแปร | ไบต์ [] | setBytes | getBytes |
ไบนารี่ | ไบต์ [] | setBytes | getBytes |
วันที่ | java.sql.Date | setDate | getDate |
เวลา | java.sql.Time | ตั้งเวลา | getTime |
TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
หยด | java.sql.Blob | setBlob | getBlob |
ARRAY | java.sql.Array | setARRAY | getARRAY |
REF | java.sql.Ref | SetRef | getRef |
โครงสร้าง | java.sql.Struct | SetStruct | getStruct |
JDBC - การประมวลผลแบทช์:
การประมวลผลแบบกลุ่มช่วยให้คุณสามารถจัดกลุ่มคำสั่ง SQL ที่เกี่ยวข้องเป็นชุดและส่งด้วยการเรียกไปยังฐานข้อมูลด้วยการเรียกเพียงครั้งเดียว
เมื่อคุณส่งคำสั่ง SQL หลายคำสั่งไปยังฐานข้อมูลพร้อมกันคุณจะลดจำนวนค่าใช้จ่ายในการสื่อสารซึ่งจะช่วยเพิ่มประสิทธิภาพ
ไม่จำเป็นต้องใช้ไดรเวอร์ JDBC เพื่อรองรับคุณลักษณะนี้ คุณควรใช้เมธอดDatabaseMetaData.supportsBatchUpdates ()เพื่อตรวจสอบว่าฐานข้อมูลเป้าหมายรองรับการประมวลผลการอัพเดตแบตช์หรือไม่ วิธีนี้จะคืนค่าเป็นจริงหากไดรเวอร์ JDBC ของคุณรองรับคุณสมบัตินี้
addBatch()วิธีการของStatement, PreparedStatementและCallableStatementใช้เพื่อเพิ่มแต่ละคำสั่งลงในชุดงาน executeBatch() ใช้เพื่อเริ่มการดำเนินการของคำสั่งทั้งหมดที่จัดกลุ่มเข้าด้วยกัน
executeBatch() ส่งคืนอาร์เรย์ของจำนวนเต็มและแต่ละองค์ประกอบของอาร์เรย์แสดงจำนวนการอัปเดตสำหรับคำสั่งอัพเดตตามลำดับ
เช่นเดียวกับที่คุณสามารถเพิ่มคำสั่งลงในแบตช์สำหรับการประมวลผลคุณสามารถลบออกได้ด้วยไฟล์ clearBatch()วิธี. วิธีนี้จะลบคำสั่งทั้งหมดที่คุณเพิ่มด้วยเมธอด addBatch () อย่างไรก็ตามคุณไม่สามารถเลือกคำสั่งที่จะลบออกได้
JDBC - ข้อมูลการสตรีม:
วัตถุ PreparedStatement มีความสามารถในการใช้อินพุตและเอาต์พุตสตรีมเพื่อจัดหาข้อมูลพารามิเตอร์ สิ่งนี้ช่วยให้คุณสามารถวางไฟล์ทั้งหมดลงในคอลัมน์ฐานข้อมูลที่สามารถเก็บค่าขนาดใหญ่เช่นชนิดข้อมูล CLOB และ BLOB
มีวิธีการต่อไปนี้ที่สามารถใช้ในการสตรีมข้อมูล:
setAsciiStream(): วิธีนี้ใช้เพื่อจัดหาค่า ASCII ขนาดใหญ่
setCharacterStream(): วิธีนี้ใช้เพื่อจัดหาค่า UNICODE ขนาดใหญ่
setBinaryStream(): วิธีนี้ใช้เพื่อจัดหาค่าไบนารีขนาดใหญ่
เมธอด setXXXStream () ต้องการพารามิเตอร์เพิ่มเติมขนาดไฟล์นอกเหนือจากตัวยึดพารามิเตอร์ พารามิเตอร์นี้แจ้งไดรเวอร์ว่าควรส่งข้อมูลไปยังฐานข้อมูลโดยใช้สตรีมเท่าใด
สำหรับรายละเอียดเกี่ยวกับแนวคิดเหล่านี้คุณต้องอ่านบทช่วยสอนทั้งหมด