JDBC
Java Database Connectivity
ธระยทธ ทองเครอ
Java Database
2
แนะน ำ JDBCJDBC คอ ชดค ำสงมำตรฐำน (Library หรอ API) ส ำหรบท ำงำนกบฐำนขอมล
JDBC ก ำหนดใหมค ำสงส ำหรบจดกำรฐำนขอมล สรำงฐำนขอมล ดงขอมล เพม ลบ และแกไข
JDBC อยใน package ชอ java.sql (อยใน Java Standard Edition)
3
JDBC DriverJDBC Driver คอ ชดค ำสงทผผลตซอฟทแวรฐำนขอมล implement ตำมขอก ำหนด
ในของ JDBC เพอสนบสนนกำรเชอมตอกบฐำนขอมลของตนเอง
JDBC Driver จะอยในรปแบบของไฟลทบบอดในนำมสกล .jar เพอใหนกพฒนำน ำไปเกบไวในแอปพลเคชน หรออำงองถง
4
JDBC
API
ฐำนขอมล
JDBC
Driver
Java
Application
สถำปตยกรรม JDBC
5
JDBC
API
Oracle
MS SQL
MySQL
Oracle
Driver
MS SQL
Driver
MySQL
Driver
Ne
tw
or
k
Java
Application
JDBC DriverMySQL
https://dev.mysql.com/downloads/connector/j/
Oraclehttp://www.oracle.com/technetwork/database/features/jdbc/
Microsoft SQL Serverhttps://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx
6
ใช Maven ชวยโหลด JDBC Driver
7
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion><groupId>com.teejung</groupId><artifactId>firstmaven</artifactId><packaging>war</packaging><version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version>
</dependency>
</dependencies>
</project>
แทก dependency ใชครอบชอ 1 Library
ไฟล pom.xml
กำรเพม JDBC Driver ในโปรเจค Dynamic Webโฟลเดอรทใชเกบ Library (ไฟล .jar) ส ำหรบโปรเจค จะอยใน
WebContent/WEB-INF/lib เมอโหลด JDBC Driver ของ MySql แลว สำมำรถลำกวำง .jar ในโฟลเดอรนไดเลย
เพอใหโปรเจครจก
8
ขนตอนกำรเขยนค ำสงตดตอฐำนขอมล1. โหลด JDBC Driver
2. ก ำหนด URL ส ำหรบตดตอกบฐำนขอมล
3. เชอมตอกบฐำนขอมล
4. เตรยมค ำสง SQL ทจะประมวลผล
5. สงค ำสง SQL ไปยงฐำนขอมล
6. อำนผลลพธทฐำนขอมลสงกลบ
7. ปดกำรเชอมตอ
9
1. โหลด JDBC Driverคลำสหลกส ำหรบ JDBC Driver จะอยใน package ทแตกตำงกนไปขนอยกบผผลต
ฐำนขอมล โดยใชเมธอด Class.forName( ) ดงน
Class.forName("ชอ package และคลาส JDBC Driver");
กำรโหลดจะตองดก Exception ชอ ClassNotFoundException เสมอ
10
try {// 1. โหลด JDBC DriverClass.forName("com.mysql.cj.jdbc.Driver");...
} catch (ClassNotFoundException e) {System.err.println("Error loading driver: " + e);
}
ชอคลำส JDBC Driver ของฐำนขอมลตำงๆMySQL
Class.forName("com.mysql.cj.jdbc.Driver");
OracleClass.forName("oracle.jdbc.driver.OracleDriver");
Microsoft SQL ServerClass.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
11
2. ก ำหนด URL ส ำหรบตดตอกบฐำนขอมล
URL ส ำหรบตดตอกบฐำนขอมล เปน String ซงมรปแบบดงน
String dbURL = "jdbc:mysql://localhost/blueshop?characterEncoding=utf-8";
12
ชอ Protocol ชอ domain หรอ ipของ database server
ชอฐำนขอมล ชดอกขระทใช
3. เชอมตอกบฐำนขอมลประกำศ object ของคลำส Connection ส ำหรบเกบกำรเชอมตอ เรยกเมธอด getConnection( ) จำกคลำส DriverManager ซงมอำรกวเมนตดงน
13
String dbURL = "jdbc:mysql://localhost/blueshop?characterEncoding=utf-8";
Connection con = DriverManager.getConnection(dbURL,"root","1234");
URL ฐำนขอมล
username เขำฐำนขอมล
password เขำฐำนขอมล
4. เตรยมค ำสง SQL ทจะประมวลผล
ประกำศตวแปร PreparedStatement และเรยกเมธอด prepareStatement( ) ของ Connection Object โดยสงรปแบบค ำสง SQL ไปดวย
หลงจำกนนก ำหนดคำใหกบ ? ในรปแบบ SQL ดวยเมธอด setXxx( )
14
Connection con = DriverManager.getConnection(dbURL,"root","1234");
PreparedStatement pStatement = con.prepareStatement("SELECT * FROM product WHERE pid = ? or pname LIKE ?");
pStatement.setInt(1, 3);
pStatement.setString(2, "g%");
argument แรก แทนล ำดบของ ? ในประโยค SQL
argument ทสอง แทนคำทตองกำรน ำไปแทนในประโยค SQL
กำรใชเมธอดก ำหนดคำใหกบ ?- ใช setInt( ) เมอฟลดในฐำนขอมลเปนตวเลข- ใช setString( ) เมอฟลดในฐำนขอมลเปนชดอกขระ
5. สงค ำสง SQL ไปยงฐำนขอมล เรยกเมธอด executeQuery() จำก PreparedStatement Object
ประกำศตวแปรของคลำส ResultSet เพอรบคำผลลพธ
15
Object ส ำหรบเกบผลลพธทฐำนขอมล
สงกลบ
ResultSet resultSet = pStatement.executeQuery();
6. อำนผลลพธทฐำนขอมลสงกลบผลลพธทไดจำกฐำนขอมลจะถกเกบลง ResultSet Objectสำมำรถโหลดขอมลทละแถวดวยเมธอด next( ) เขำถงขอมลในแตละคอลมนดวยเมธอด getXxxx( )
16
while (resultSet.next()) {
int pid = resultSet.getInt("pid");
String pname = resultSet.getString("pname");
String pdetail = resultSet.getString("pdetail");
int price = resultSet.getInt("price");
System.out.println(pid + "," + pname + "," + pdetail + "," + price);
}
ระบชอคอลมน
ดงขอมลออกมำเปน Integerดงขอมลออกมำเปน String
7. ปดกำรเชอมตอ เรยกเมธอด close() จำก Connection Object เพอหยดกำรเชอมตอกบฐำนขอมล
กำรปด Connection ควรท ำทกครง เพอเพมประสทธภำพกำรท ำงำนกบฐำนขอมล
17
// 1. โหลดคลาส JDBC DriverClass.forName("com.mysql.cj.jdbc.Driver");
// 2. ก าหนด URL ส าหรบตดตอกบฐานขอมลString dbURL = "jdbc:mysql://localhost/blueshop?characterEncoding=utf-8";
// 3. สราง ConnectionConnection con = DriverManager.getConnection(dbURL, "root", "1234");
. . . . .
// 7. ปดการเชอมตอcon.close();
18
import java.sql.*;public class JDBCStep {
private static Connection con; // ประกาศตวแปรส าหรบใชตดตอฐานขอมลpublic static void main(String[] args) {
try {// 1. โหลด JDBC DriverClass.forName("com.mysql.cj.jdbc.Driver");
// 2. ก าหนด URL ส าหรบตดตอกบฐานขอมลString dbURL = "jdbc:mysql://localhost/blueshop?characterEncoding=utf-8";
// 3. เชอมตอกบฐานขอมลcon = DriverManager.getConnection(dbURL, "root", "1234");
// 4. เตรยมค าส ง SQL ทจะประมวลผลPreparedStatement pStatement = con.prepareStatement("SELECT * FROM product WHERE pid = ? or pname LIKE ?"); pStatement.setInt(1, 3);pStatement.setString(2, "g%");
// 5. สงค าส ง SQL ไปยงฐานขอมลResultSet resultSet = pStatement.executeQuery();
// 6. อานผลลพธท ฐานขอมลสงกลบwhile (resultSet.next()) {
int pid = resultSet.getInt("pid"); String pname = resultSet.getString("pname");String pdetail = resultSet.getString("pdetail");int price = resultSet.getInt("price");System.out.println(pid + "," + pname + "," + pdetail + "," + price);
}// 7. ปดการเชอมตอcon.close();
} catch (ClassNotFoundException e) {System.err.println("Error loading driver: " + e);
} catch (SQLException e) {System.err.println("Error database connection: " + e);
}}}
กจกรรมโหลดไฟล blueshop.sql จำกเวบไซตของคอรส
สรำงฐำนขอมลใหม ชอ "blueshop" import ไฟลเขำฐำนขอมล
สรำงคลำส JDBCStep ในโฟลเดอร java แลวน ำโคดจำกไฟล "JDBCStep.txt" จำกเวบไซตของคอรสมำวำง และทดสอบรน สงเกตผลลพธ
สรำงคลำส JDBCStep2 โดยใหแสดงขอมลจำกตำรำง member ออกทำง console เลยนแบบโคดจำก JDBCStep
19
ฐำนขอมล blueshop
20
*โหลดไฟล blueshop.sql เพอใชน ำเขำขอมลจำกหนำเวบ
username (PK)passwordnameaddressmobileemail
member ord_id (PK)username (FK)ord_datestatus
orders
tid (PK)ord_id (FK)pid (FK)quantity
item
pid (PK)pnamepdetailprice
product
ขอมลในแตละตำรำง
21
username password name address mobile emailsomsak 1899 สมศกด สรเสถยร 174 ถ.มตรภำพ จ.ขอนแกน [email protected] aafff1 บำรม บญหลำย 123 ถ.วภำวดรงสต กรงเทพฯ 08-9446-9955 [email protected] m345 เมธำสทธ สอนสง 98/9 ถ.ศรจนทร จ.ขอนแกน 08-4456-9877 [email protected]
pid pname pdetail price1 Centrum วตำมนรวมจำก A ถง Zinc 3502 Caltrate บ ำรงกระดก เสรมวตำมนด 7603 Ester-C วตำมนซ 500 mg ไมกดกระเพำะ 5004 Glucosamine บ ำรงขอตอ ปองกนขอเสอม 1200
ord_id username ord_date status1 baramee 16/7/2013 23:25 wait2 metasit 12/2/2013 23:25 pay3 baramee 27/12/2013 23:26 send4 metasit 11/12/2013 23:27 pay
tid ord_id pid quantity1 1 2 22 1 3 53 1 4 14 2 1 25 2 3 46 2 4 37 3 2 38 3 4 59 4 1 510 4 3 1
ตาราง member
ตาราง product
ตาราง orders
ตาราง item
กจกรรมสรำงฐำนขอมลใหมดวยโปรแกรม MySQL Workbench เพอเกบขอมลอำจำรย ใช
ชอตำรำง teacher มคอลมน ดงน tid INT เปน auto_increment (เชคท AI) tname Varchar(50) status Enum มคำเปน "s" หรอ "m" เทำนนหลงจำกนนเพมขอมลลงไปอยำงนอย 3 แถว
สรำงคลำสจำวำ ดงขอมลจำกตำรำง teacher ทงหมด และน ำมำแสดงท console
ใหเชคขอมลในคอลมน status และแสดงผลดงน• ถำเปน s แสดงวำ "โสด"• ถำเปน m แสดงวำ "แตงงำน"
22
กำร Insert/Update/Delete กำรใชค ำสง SQL ประเภทดงขอมล จะใชเมธอด executeQuery( ) แตกำรใชค ำสง SQL ทเปนกำร
Insert/Update/Delete จะใชเมธอด executeUpdate( )
23
PreparedStatement pStatement = con.prepareStatement("SELECT * FROM product WHERE pid = ?");
pStatement.setInt(1, 3);
ResultSet resultSet = pStatement.executeQuery( ); String ทอยในรปค ำสง SQL ประเภทดงขอมล
Object ส ำหรบเกบผลลพธทฐำนขอมลสงกลบ
กำรใชค ำสงดงขอมล
กำรใชค ำสงเพม/ลบ/แกไขขอมล
PreparedStatement pStatement = con.prepareStatement("UPDATE product SET price=? WHERE pid=?");
pStatement.setInt(1, 3000);
pStatement.setInt(2, 3);
int row = pStatement.executeUpdate( );
เกบจ ำนวนแถวทมผลกระทบ
String ทอยในรปค ำสง SQL ประเภท Insert/Update/Delete
กจกรรมสรำงตำรำงเพอจดเกบขอมลพนกงำนอยำงนอย 4 คน ขอมลประกอบดวย
รหสพนกงำน, ชอ-สกล, วนเดอนปเกด, เพศ (f-ชำย, m-หญง), แผนก, ต ำแหนง และเงนเดอน
สรำงคลำสจำวำ เพอตดตอกบฐำนขอมล โดยใหดงขอมลพนกงำนทมเงนเดอนอยในชวง 15,000 ถง 20,000 บำท เรยงตำมเงนเดอนจำกมำกไปนอย แสดงบน console
24
กจกรรมจำกกจกรรมทผำนมำ จงแทรกค ำสง HTML แทก <table> ระหวำงดงขอมล
จำกฐำนขอมล แลวน ำผลลพธไปวำงบนไฟลใหม บนทกเปน "test.html" และทดสอบเปดเพอดผลลพธบน Browser
25