mysql-connector 다운로드
다운로드 링크
jar파일 추가
JDBC 의 경우 대부분의 API 가 인터페이스이다.
Connection, Statement, ResultSet, PreparedStatement
대부분의 JDBC 프로그램에서는 위의 API 들에서 제공되는 메서드를 호출해야 한다.
Connection : createStatement(), getMetaData()
Statement : executeQuery(), executeUpdate()
ResultSet : next(), getXXX()
이 API 들의 객체를 생성하기 위해서는 이 API 들을 상속하여 구현하고 있는 자식 클래스가 필요한데 그 자식 클래스들을 JDBC 드라이버가 제공한다. JDBC 드라이버라는 것은 JDBC 에서 인터페이스로 설계되어 있는 API들의 자식 클래스들을 제공하는 프로그램이라고 할 수 있다.
Java 프로그램에서 DB 서버를 접속하여 데이터를 처리하는 기능을 구현하고자 할 때 사용되는 Java 기술
JDBC 기술의 구성 |
---|
JDBC API (java.sql, javax.sql) -> 공통적(모든 DB 서버에 대해) |
JDBC Driver -> DB 서버마다 달라진다 |
주요 JDBC API
인터페이스 |
---|
Connection, Statement, PreparedStatement, ResultSet, DatabaseMetaData, ResultSetMetaData |
클래스 |
---|
DriverManager, Date, Time, Timestamp |
ex)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) {
Connection connection = null;
try {
// JDBC 드라이버 클래스 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 데이터베이스 연결 설정
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "username";
String password = "password";
connection = DriverManager.getConnection(url, username, password);
// SQL 쿼리 실행
Statement statement = connection.createStatement();
String sql = "SELECT * FROM employees";
ResultSet resultSet = statement.executeQuery(sql);
// 결과 집합 처리
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double salary = resultSet.getDouble("salary");
System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {// 리소스 정리
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Class.forName("com.mysql.cj.jdbc.Driver");
각 DB마다 고유의 드라이버 이름이 있다.
String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=UTC";
String username = "username";
String password = "password";
connection = DriverManager.getConnection(url, username, password);
*jdbc url
jdbc:mysql://[hostname][:port]/dbname[?param1=value1][¶m2=value2]...
Statement statement = conn.createStatement();
ResultSet resultSet = statement .excuteQuery("SELECT * FROM employees");
executeQuery()
SELECT 쿼리를 실행할 때 사용된다. executeQuery() 메서드는 ResultSet 객체를 반환한다. 이 ResultSet 객체에는 쿼리 결과 집합이 포함되며, SQL 쿼리의 실행 결과가 빈 결과 집합인 경우 ResultSet 객체가 생성되지만 데이터가 없으므로 next() 메서드 호출 시에 false를 반환한다. 이것은 ResultSet가 비어 있다는 것을 나타낸다.
executeUpdate()
SELECT가 아닌 INSERT, UPDATE, DELETE 등의 데이터 변경 쿼리를 실행할 때 사용된다. executeUpdate() 메서드는 실행된 쿼리로 영향을 받은 레코드 수(int)를 반환한다.
쿼리 | RETURN값 |
---|---|
INSERT | 1 |
DELETE | 삭제된 행의 갯수 |
UPDATE | 수정된 행의 갯수 |
DDL | 0 |
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
double salary = resultSet.getDouble("salary");
System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
}
ResultSet은 Query의 실행 결과를 담는 객체로서 최초에는 결과 집합에서 0번째 줄을 가리키고 있다. 때문에 다음 줄을 가리키기 위해서는 next() 메서드를 수행한다.
resultSet.close();
statement.close();
connection.close();
ResultSet resultSet = statement.executeQuery("SELECT id, name, age FROM employees");
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
//또는 아래와 같이 인덱스를 사용할 수 있다.
int id = resultSet.getInt(1); // 첫 번째 컬럼의 데이터 (id)
String name = resultSet.getString(2); // 두 번째 컬럼의 데이터 (name)
int age = resultSet.getInt(3); // 세 번째 컬럼의 데이터 (age)
}
x는 사용할 수 있다, x는 최적을 의미
데이터베이스에서 테이블을 생성하려면 SQL CREATE TABLE 문을 사용해야 한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateTableExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(rl, username, password);
Statement statement = connection.createStatement()) {
String createTableSQL = "CREATE TABLE employees ("
+ "id INT AUTO_INCREMENT PRIMARY KEY,"
+ "first_name VARCHAR(255) NOT NULL,"
+ "last_name VARCHAR(255) NOT NULL,"
+ "age INT)";
statement.executeUpdate(createTableSQL);
System.out.println("Table 'employees' created successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
테이블을 삭제하려면 SQL DROP TABLE 문을 사용한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DropTableExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
String dropTableSQL = "DROP TABLE employees";
statement.executeUpdate(dropTableSQL);
System.out.println("Table 'employees' dropped successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
INSERT 문은 데이터베이스 테이블에 새로운 레코드를 삽입하기 위해 사용된다.
INSERT INTO 테이블명 (열1, 열2, ...) VALUES (값1, 값2, ...);
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class InsertDataExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb";
String username = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
String insertSql = "INSERT INTO employees (first_name, last_name, age) VALUES (?, ?, ?)";
// PreparedStatement를 사용하여 SQL 인젝션을 방지합니다.
PreparedStatement preparedStatement = connection.prepareStatement(insertSql);
// 삽입할 데이터 값 지정
preparedStatement.setString(1, "John");
preparedStatement.setString(2, "Doe");
preparedStatement.setInt(3, 30);
// SQL 문 실행
preparedStatement.executeUpdate();
System.out.println("데이터 삽입 완료.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
SQL 쿼리를 미리 컴파일하여 재사용 가능한 형태로 저장하는 방법
String sql = "SQL 쿼리 문장";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "값1");
preparedStatement.setInt(2, 42);
// SQL 실행
int result = preparedStatement.executeUpdate();
DELETE문은 데이터베이스 테이블에서 특정 레코드를 삭제할 때 사용된다. DELETE 문은 테이블의 특정 조건을 만족하는 행을 삭제한다.
DELETE FROM 테이블명 WHERE 조건;
UPDATE 문은 데이터베이스 테이블에서 특정 레코드의 값을 수정할 때 사용된다. UPDATE 문은 테이블의 특정 조건을 만족하는 행의 값을 업데이트한다.
UPDATE 테이블명 SET 열1 = 값1, 열2 = 값2,... WHERE 조건;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteAndUpdateExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydb"; // 데이터베이스 URL
String username = "username"; // 사용자 이름
String password = "password"; // 암호
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
// DELETE 문
String deleteSql = "DELETE FROM employees WHERE employee_id = 101";
int rowsDeleted = statement.executeUpdate(deleteSql);
if (rowsDeleted > 0) {
System.out.println(rowsDeleted + " 행이 삭제되었습니다.");
} else {
System.out.println("삭제할 행을 찾을 수 없습니다.");
}
// UPDATE 문
String updateSql = "UPDATE employees SET age = 31 WHERE employee_id = 102";
int rowsUpdated = statement.executeUpdate(updateSql);
if (rowsUpdated > 0) {
System.out.println(rowsUpdated + " 행이 업데이트되었습니다.");
} else {
System.out.println("업데이트할 행을 찾을 수 없습니다.");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}