Java JDBC: เชื่อมต่อ MySQL และ Query
Dependency (Maven/Gradle)
mysql
mysql-connector-j
8.0.33
ตัวอย่างตาราง demo87
CREATE TABLE demo87 (name VARCHAR(20), age INT);
INSERT INTO demo87 VALUES ('John',21), ('David',23), ('Bob',22);
Java Code: TableValuesDemo.java
import java.sql.*;
import java.util.*;
public class TableValuesDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/sampledatabase";
String user = "root";
String password = "123456";
String sql = "SELECT * FROM demo87";
try (Connection con = DriverManager.getConnection(url, user, password);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
Map<String, Integer> map = new HashMap<>();
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
map.put(name, age);
}
System.out.println(map);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ผลลัพธ์
{Bob=22, John=21, David=23}
คำอธิบายโค้ดสำคัญ
| Class/Method | หน้าที่ |
| DriverManager.getConnection() | สร้าง Connection ไป MySQL |
| con.createStatement() | สร้าง Statement สำหรับ Execute Query |
| stmt.executeQuery(sql) | รัน SELECT คืน ResultSet |
| rs.next() | เลื่อน Cursor ไปแถวถัดไป (true/false) |
| rs.getString("col") | อ่านค่า String จากคอลัมน์ |
| rs.getInt("col") | อ่านค่า Integer จากคอลัมน์ |
Best Practices (Modern Java)
- Try-with-resources: ปิด Connection, Statement, ResultSet อัตโนมัติ (Java 7+)
- PreparedStatement: ใช้แทน Statement สำหรับ Query ที่มี Parameter
- Connection Pool: ใช้ HikariCP (Spring Boot Default) แทนสร้าง Connection ใหม่ทุกครั้ง
- Column Index vs Name:
rs.getString(1) เร็วกว่า rs.getString("name") แต่ชื่ออ่านง่ายกว่า
PreparedStatement Version
String sql = "SELECT name, age FROM demo87 WHERE age > ?";
try (PreparedStatement ps = con.prepareStatement(sql)) {
ps.setInt(1, 20);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getString("name") + " - " + rs.getInt("age"));
}
}
}
Common Errors
| Error | แก้ไข |
| ClassNotFoundException: com.mysql.jdbc.Driver | Driver Class เก่า ใช้ com.mysql.cj.jdbc.Driver (MySQL 8.0+) |
| Communications link failure | MySQL Down, Wrong Host/Port, Firewall |
| Access denied | User/Password ผิด, Host ไม่ Match (localhost vs %) |
| No suitable driver | Jar ไม่อยู่ใน Classpath |