2023.05.28 - [국비 지원/JDBC] - [JDBC] JDBC와 데이터베이스 연결하기
[JDBC] JDBC와 데이터베이스 연결하기
JDBC(Java DataBase Connectivity) 자바에서 데이터베이스와 연결하여 데이터를 다룰 수 있게 해주는 것을 말한다. 그래서 우리는 자바에서 데이터베이스의 데이터를 다루고 싶다면 JDBC 드라이버가 필요
myblog1128.tistory.com
이전 글을 통해서 JDBC와 데이터베이스를 연결하는 것을 정리했다. Statement 객체를 생성해서
SQL 명령문을 실행했었는데 이는 주로 변경되지 않는 정적 SQL문을 실행할 때 사용했다.
PreparedStatement
오늘은 동적으로 SQL문을 처리할 수 있는 PreparedStatement를 알아보도록 하자.
PreparedStatement는 매개변수화된 SQL문을 사용할 수 있기 때문에 편리성과 보안성에서 더 뛰어나다.
그래서 Statement보다는 PreparedStatement를 주로 사용한다.
Statement를 사용할 때에는 아래와 같이 사용했던 것을 기억할 것이다.
String insertSQL = """
INSERT INTO member
(id, name, age, addr)
VALUES
(6, "이지훈", 18, "광주")""";
PreparedStatement를 사용한다면 아래의 코드와 같이 ?를 사용해 매개변수화된 SQL문을
통해 좀 더 편리하게 SQL문을 실행할 수 있게 된다.
String insertSQL = """
INSERT INTO member
(id, name, age, addr)
VALUES
(?, ?, ?, ?)""";
PreparedStatement를 사용한 아래의 전체 코드를 보도록 하자.
1) 데이터 추가하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String insertSQL = """
INSERT INTO member(id, name, age, addr)
VALUES(?, ?, ?, ?);
""";
PreparedStatement pstmt = conn.prepareStatement(insertSQL);
pstmt.setInt(1, 7);
pstmt.setString(2, "한여름");
pstmt.setInt(3, 20);
pstmt.setString(4, "전주");
int insertCount = pstmt.executeUpdate();
System.out.println(insertCount + "개의 행을 추가했습니다.");
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}
Connection의 PrepareStatement() 메소드로부터 PreparedStatement 객체를 얻을 수 있다.
그러고나서 ?에 들어갈 값을 지정해줘야 하는데 ?는 순서에 따라 1번부터 번호가 부여된다.
값의 타입에 따라 setString(), setInt()와 같이 메소드를 선택한 후에 첫 번째에는 ?를 지정해주고
두 번째에는 값을 지정해주면 된다. 이전글에서 언급했듯이 첫 번째에서 ?를 지정할 때에는 컬럼 이름이 아니라
컬럼 순번으로 지정해야함을 기억하자. 이렇게 만들어진 코드를 실행시켜보면 아래와 같이 콘솔에 출력된다.

또한 데이터베이스에도 id가 7번인 한여름이 추가된 것을 확인할 수 있다.

2) 데이터 삭제하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String deleteSQL = """
DELETE FROM member
WHERE id=?;
""";
PreparedStatement pstmt = conn.prepareStatement(deleteSQL);
pstmt.setInt(1, 7);
int deleteCount = pstmt.executeUpdate();
System.out.println(deleteCount + "개의 행을 삭제했습니다.");
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}

첫 번째 컬럼인 id의 값이 7에 해당하는 한여름의 데이터 삭제된 것을 볼 수 있다.

3) 데이터 읽기
만약 SELECT 문에 연산식 또는 함수 호출이 포함된다면 컬럼 이름 대신에 컬럼 순번으로 읽어야 한다.
예를 들자면 age - 1 연산식이 사용되면 컬럼 순번으로만 읽을 수 있다.
왜냐하면 age - 1은 컬럼 이름이 아니기 때문이다.
하지만 (age - 1) AS age와 같이 별칭을 정해준다면 컬럼 이름도 사용할 수 있다.
먼저 getter, setter, toString() 메소드가 있는 클래스를 만들어주도록 하겠다.
이때까지 이 메소드들을 직접 입력하거나 이클립스 Source 기능을 이용해서 만들었다.
이번엔 @Data 어노테이션 이용해서 이 메소드들을 자동으로 생성시키는 lombok을 이용해보도록 하자.
1. lombok 설치
https://projectlombok.org/download
Download
projectlombok.org
제일 먼저 위의 사이트에서 lombok을 설치하도록 하자.
2. cmd 창에서 입력

=> java -jar lombok이 저장된 경로
위의 명령어를 입력하면 아래의 lombok 창이 뜬다.
3. 이클립스나 STS 경로 찾아주기

4. 프로젝트 Build Path 설정해주기

해당 프로젝트에서 우클릭을 하면 Build Path를 설정해줄 수 있다.
5. lombok 사용 가능

에러가 발생하지 않는 것을 확인할 수 있다.
다시 코드를 보자.
◎ getter, setter, toString 메소드 클래스
import lombok.Data;
@Data
public class Model {
private int id;
private String name;
private int age;
private String addr;
}
◎ 1개의 데이터 행만 가져올 경우 - if(rs.next())
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String selectSQL = """
SELECT id, name, age, addr
FROM member
WHERE id = ?
""";
PreparedStatement pstmt = conn.prepareStatement(selectSQL);
pstmt.setInt(1, 2);
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
Model model = new Model();
model.setId(rs.getInt("id")); // 컬럼 이름 이용
model.setName(rs.getString("name"));
model.setAge(rs.getInt(3)); // 컬럼 순번 이용
model.setAddr(rs.getString(4));
System.out.println(model);
}else {
System.out.println("해당 ID가 존재하지 않습니다.");
}
rs.close();
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}
첫 번째 컬럼 순번인 id의 값이 2인 코린이에 대해서 아래와 같이 출력되는 것을 볼 수 있다.

만약에 pstmt.setInt(1, 10);과 같이 존재하지 않는 id를 출력하려고 하면 아래와 같이 출력된다.

◎ 여러 개의 데이터 행을 가져올 경우 - while(rs.next())
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String selectSQL = """
SELECT id, name, age, addr
FROM member
WHERE addr = ?
""";
PreparedStatement pstmt = conn.prepareStatement(selectSQL);
pstmt.setString(1, "서울");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Model model = new Model();
model.setId(rs.getInt("id")); // 컬럼 이름 이용
model.setName(rs.getString("name"));
model.setAge(rs.getInt(3)); // 컬럼 순번 이용
model.setAddr(rs.getString(4));
System.out.println(model);
}
rs.close();
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}
addr이 서울에 해당하는 모든 데이터가 출력되는 것을 볼 수 있다.

4) 데이터 수정하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String updateSQL = """
UPDATE member SET addr = "부산"
WHERE id = ?;
""";
PreparedStatement pstmt = conn.prepareStatement(updateSQL);
pstmt.setInt(1, 6);
int updateCount = pstmt.executeUpdate();
System.out.println(updateCount + "개의 행을 수정했습니다.");
rs.close();
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}

id가 6인 이지훈의 addr이 광주에서 부산으로 바뀐 것을 볼 수 있다.

'국비 지원 > JDBC' 카테고리의 다른 글
[JDBC] 간단한 게시판 구현해보기 (0) | 2023.06.11 |
---|---|
[JDBC] 트랜잭션 (0) | 2023.06.05 |
[JDBC] JDBC와 데이터베이스 연결하기 (0) | 2023.05.28 |
2023.05.28 - [국비 지원/JDBC] - [JDBC] JDBC와 데이터베이스 연결하기
[JDBC] JDBC와 데이터베이스 연결하기
JDBC(Java DataBase Connectivity) 자바에서 데이터베이스와 연결하여 데이터를 다룰 수 있게 해주는 것을 말한다. 그래서 우리는 자바에서 데이터베이스의 데이터를 다루고 싶다면 JDBC 드라이버가 필요
myblog1128.tistory.com
이전 글을 통해서 JDBC와 데이터베이스를 연결하는 것을 정리했다. Statement 객체를 생성해서
SQL 명령문을 실행했었는데 이는 주로 변경되지 않는 정적 SQL문을 실행할 때 사용했다.
PreparedStatement
오늘은 동적으로 SQL문을 처리할 수 있는 PreparedStatement를 알아보도록 하자.
PreparedStatement는 매개변수화된 SQL문을 사용할 수 있기 때문에 편리성과 보안성에서 더 뛰어나다.
그래서 Statement보다는 PreparedStatement를 주로 사용한다.
Statement를 사용할 때에는 아래와 같이 사용했던 것을 기억할 것이다.
String insertSQL = """
INSERT INTO member
(id, name, age, addr)
VALUES
(6, "이지훈", 18, "광주")""";
PreparedStatement를 사용한다면 아래의 코드와 같이 ?를 사용해 매개변수화된 SQL문을
통해 좀 더 편리하게 SQL문을 실행할 수 있게 된다.
String insertSQL = """
INSERT INTO member
(id, name, age, addr)
VALUES
(?, ?, ?, ?)""";
PreparedStatement를 사용한 아래의 전체 코드를 보도록 하자.
1) 데이터 추가하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String insertSQL = """
INSERT INTO member(id, name, age, addr)
VALUES(?, ?, ?, ?);
""";
PreparedStatement pstmt = conn.prepareStatement(insertSQL);
pstmt.setInt(1, 7);
pstmt.setString(2, "한여름");
pstmt.setInt(3, 20);
pstmt.setString(4, "전주");
int insertCount = pstmt.executeUpdate();
System.out.println(insertCount + "개의 행을 추가했습니다.");
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}
Connection의 PrepareStatement() 메소드로부터 PreparedStatement 객체를 얻을 수 있다.
그러고나서 ?에 들어갈 값을 지정해줘야 하는데 ?는 순서에 따라 1번부터 번호가 부여된다.
값의 타입에 따라 setString(), setInt()와 같이 메소드를 선택한 후에 첫 번째에는 ?를 지정해주고
두 번째에는 값을 지정해주면 된다. 이전글에서 언급했듯이 첫 번째에서 ?를 지정할 때에는 컬럼 이름이 아니라
컬럼 순번으로 지정해야함을 기억하자. 이렇게 만들어진 코드를 실행시켜보면 아래와 같이 콘솔에 출력된다.

또한 데이터베이스에도 id가 7번인 한여름이 추가된 것을 확인할 수 있다.

2) 데이터 삭제하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String deleteSQL = """
DELETE FROM member
WHERE id=?;
""";
PreparedStatement pstmt = conn.prepareStatement(deleteSQL);
pstmt.setInt(1, 7);
int deleteCount = pstmt.executeUpdate();
System.out.println(deleteCount + "개의 행을 삭제했습니다.");
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}

첫 번째 컬럼인 id의 값이 7에 해당하는 한여름의 데이터 삭제된 것을 볼 수 있다.

3) 데이터 읽기
만약 SELECT 문에 연산식 또는 함수 호출이 포함된다면 컬럼 이름 대신에 컬럼 순번으로 읽어야 한다.
예를 들자면 age - 1 연산식이 사용되면 컬럼 순번으로만 읽을 수 있다.
왜냐하면 age - 1은 컬럼 이름이 아니기 때문이다.
하지만 (age - 1) AS age와 같이 별칭을 정해준다면 컬럼 이름도 사용할 수 있다.
먼저 getter, setter, toString() 메소드가 있는 클래스를 만들어주도록 하겠다.
이때까지 이 메소드들을 직접 입력하거나 이클립스 Source 기능을 이용해서 만들었다.
이번엔 @Data 어노테이션 이용해서 이 메소드들을 자동으로 생성시키는 lombok을 이용해보도록 하자.
1. lombok 설치
https://projectlombok.org/download
Download
projectlombok.org
제일 먼저 위의 사이트에서 lombok을 설치하도록 하자.
2. cmd 창에서 입력

=> java -jar lombok이 저장된 경로
위의 명령어를 입력하면 아래의 lombok 창이 뜬다.
3. 이클립스나 STS 경로 찾아주기

4. 프로젝트 Build Path 설정해주기

해당 프로젝트에서 우클릭을 하면 Build Path를 설정해줄 수 있다.
5. lombok 사용 가능

에러가 발생하지 않는 것을 확인할 수 있다.
다시 코드를 보자.
◎ getter, setter, toString 메소드 클래스
import lombok.Data;
@Data
public class Model {
private int id;
private String name;
private int age;
private String addr;
}
◎ 1개의 데이터 행만 가져올 경우 - if(rs.next())
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String selectSQL = """
SELECT id, name, age, addr
FROM member
WHERE id = ?
""";
PreparedStatement pstmt = conn.prepareStatement(selectSQL);
pstmt.setInt(1, 2);
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
Model model = new Model();
model.setId(rs.getInt("id")); // 컬럼 이름 이용
model.setName(rs.getString("name"));
model.setAge(rs.getInt(3)); // 컬럼 순번 이용
model.setAddr(rs.getString(4));
System.out.println(model);
}else {
System.out.println("해당 ID가 존재하지 않습니다.");
}
rs.close();
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}
첫 번째 컬럼 순번인 id의 값이 2인 코린이에 대해서 아래와 같이 출력되는 것을 볼 수 있다.

만약에 pstmt.setInt(1, 10);과 같이 존재하지 않는 id를 출력하려고 하면 아래와 같이 출력된다.

◎ 여러 개의 데이터 행을 가져올 경우 - while(rs.next())
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String selectSQL = """
SELECT id, name, age, addr
FROM member
WHERE addr = ?
""";
PreparedStatement pstmt = conn.prepareStatement(selectSQL);
pstmt.setString(1, "서울");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Model model = new Model();
model.setId(rs.getInt("id")); // 컬럼 이름 이용
model.setName(rs.getString("name"));
model.setAge(rs.getInt(3)); // 컬럼 순번 이용
model.setAddr(rs.getString(4));
System.out.println(model);
}
rs.close();
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}
addr이 서울에 해당하는 모든 데이터가 출력되는 것을 볼 수 있다.

4) 데이터 수정하기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo {
private static final String JDBC_DRIVER = "org.mariadb.jdbc.Driver";
private static final String JDBC_URL = "jdbc:mariadb://localhost/practice";
private static final String USER = "root";
private static final String PASSWORD = "mariadb";
public static void main(String[] args) {
Connection conn = null;
try{
Class.forName(JDBC_DRIVER);
System.out.println("드라이버 로드 성공");
conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
System.out.println("데이터베이스 연결 성공");
String updateSQL = """
UPDATE member SET addr = "부산"
WHERE id = ?;
""";
PreparedStatement pstmt = conn.prepareStatement(updateSQL);
pstmt.setInt(1, 6);
int updateCount = pstmt.executeUpdate();
System.out.println(updateCount + "개의 행을 수정했습니다.");
rs.close();
pstmt.close();
conn.close();
}catch(SQLException se) {
se.printStackTrace();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
}catch(SQLException se) {
}
}
}
}
}

id가 6인 이지훈의 addr이 광주에서 부산으로 바뀐 것을 볼 수 있다.

'국비 지원 > JDBC' 카테고리의 다른 글
[JDBC] 간단한 게시판 구현해보기 (0) | 2023.06.11 |
---|---|
[JDBC] 트랜잭션 (0) | 2023.06.05 |
[JDBC] JDBC와 데이터베이스 연결하기 (0) | 2023.05.28 |