- 자바 프로그래밍
- JDBC 프로그래밍(com.eomcs.jdbc)
- JDBC API와 Driver 개념
- JDBC 드라이버 로딩 원리
- select/insert/update/delete 프로그래밍
build.gradle
ㄴ build.gradle 스크립트 파일에 MariaDB, MySQL, Oracle, MSSQL 각각의 JDBC 드라이버를 추가
ㄴ gradle 재설정 해주기
ㄴ 프로젝트 Refresh 해주기
=>
ㄴ mysql-connector-j-8.0.33.jar 라이브러리가 추가되며 com.mysql 패키지 안의 jdbc 패키지 안에 Driver.class 가 추가됨
=>
ㄴ ojdbc11-21.7.0.0.jar 라이브러리가 추가되며 jdbc 패키지 안에 OracleDriver.class 가 추가됨
=>
ㄴ mariadb-java-client-3.1.2.jar 라이브러리가 추가되며 org.mariadb.jdbc 패키지 안에 Driver.class 가 추가됨
=>
이런식으로 확인하면 됨
JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩
jdbc_ex01_Exam0110.java
DBMS에 연결하기
=> MySQL에 연결을 대행하는 클래스를 사용한다.
=> 이 클래스는 JDBC API 규칙에 따라 작성되었다.
=> 이 클래스는 JDBC Driver 파일(*.jar)에 들어 있다.
=> 이 클래스를 사용하려면 먼저 이 JDBC Driver 파일을 다운로드 받아
프로젝트의 CLASSPATH에 등록해야 한다.
=> 절차
1) mvnrepository.com 또는 search.maven.org에서 mysql jdbc driver를 검색한다.
2) 라이브러리 정보를 build.gradle 파일에 설정한다.
3) gradle을 이용하여 eclipse 설정 파일을 갱신한다.
> gradle eclipse
4) 이클립스 프로젝트를 리프래시 한다.
- 프로젝트에 mariadb jdbc driver 라이브러리가 추가되었는지 확인한다.
JDBC 드라이버 등록
=> java.sql.Driver 규칙에 따라 정의된 클래스를 로딩한다.
=> Driver 구현체는 JDBC에 대한 정보를 제공한다.
=> 또한 DBMS에 연결작업을 수행한다.
=> Driver 구현체는 DriverManager가 관리한다.
=> 따라서 접속할 DBMS의 Driver 구현체를 생성하여 DriverManager에게 등록해야 한다.
DriverManager
=> java.sql.Driver 구현 객체를 관리하는 일을 한다.
=> DBMS 연결 요청이 들어오면 해당 DBMS의 Driver 구현체를 찾아 작업을 위임한다.
JDBC 드라이버 등록 방법1: 직접 Driver 구현 객체를 생성하고 직접 등록하기
=> java.sql.Driver 구현체를 생성하여 JDBC 드라이버 관리자에 등록한다.
=> MySQL JDBC 드라이버에는 com.mysql.jdbc.Driver 클래스가 이 구현체이다.
// JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Exam0110 {
public static void main(String[] args) {
try {
// 1) java.sql.Driver 구현체의 인스턴스를 생성한다.
java.sql.Driver mariadbDriver = new org.mariadb.jdbc.Driver();
java.sql.Driver oracleDriver = new oracle.jdbc.OracleDriver();
java.sql.Driver mssqlDriver = new com.microsoft.sqlserver.jdbc.SQLServerDriver();
java.sql.Driver mysqlDriver = new com.mysql.jdbc.Driver();
// 2) java.sql.Driver 구현체의 인스턴스를 드라이버 관리자에 등록한다.
DriverManager.registerDriver(mariadbDriver);
DriverManager.registerDriver(oracleDriver);
DriverManager.registerDriver(mssqlDriver);
DriverManager.registerDriver(mysqlDriver);
System.out.println("JDBC 드라이버 로딩 및 등록 완료!");
// DriverManager에 등록된 Driver 인스턴스를 확인해보자!
// => DriverManager.getDriver(jdbcUrl);
// => jdbcUrl
// jdbc:[DBMS]://서버주소:포트번호/데이터베이스명
java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
System.out.println(driver);
java.sql.Driver driver2 = DriverManager.getDriver("jdbc:oracle:thin://");
System.out.println(driver2);
java.sql.Driver driver3 = DriverManager.getDriver("jdbc:sqlserver://");
System.out.println(driver3);
java.sql.Driver driver4 = DriverManager.getDriver("jdbc:mysql://");
System.out.println(driver4);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ㄴ mariadb, oracle, mysql 을 주석을 해도 결과는 동일하게 출력됨
JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩
jdbc_ex01_Exam0111.java
// JDBC 드라이버 준비 - 드라이버 다운로드 및 로딩
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Exam0111 {
public static void main(String[] args) {
try {
java.sql.Driver mariadbDriver = new org.mariadb.jdbc.Driver();
DriverManager.registerDriver(mariadbDriver);
System.out.println("JDBC 드라이버 로딩 및 등록 완료!");
// 등록되지 않은 드라이버를 찾을 경우 예외 발생!
java.sql.Driver driver = DriverManager.getDriver("jdbc:db2://");
System.out.println(driver);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ㄴ 등록되지 않은 드라이버를 찾을 경우 예외 발생함
JDBC 드라이버 준비 - Driver 객체 생성 및 자동 등록
jdbc_ex01_Exam0120.java
JDBC 드라이버 등록 방법2: Driver 구현 객체 생성과 자동 등록
=> Driver 객체를 생성하면 자동으로 DriverManager에 등록된다.
=> 어떻게?
Driver 구현체가 로딩될 때 static 블록에서 인스턴스를 만들어 등록하기 때문이다.
// JDBC 드라이버 준비 - Driver 객체 생성 및 자동 등록
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Exam0120 {
public static void main(String[] args) throws Exception {
try {
// 1) Driver 구현체의 인스턴스 생성
// => Driver 구현체가 로딩될 때 인스턴스가 생성되기 때문에
// 굳이 다음과 같이 인스턴스를 생성할 필요가 없다.
new org.mariadb.jdbc.Driver();
// 2) DriverManager에 등록 안함!
// DriverManager에 자동으로 등록됐는지 확인해보자!
java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
System.out.println(driver);
// 해당 드라이버가 등록되지 않았으면 예외가 발생할 것이다.
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC 드라이버 준비 - 드라이버 클래스 로딩과 등록
jdbc_ex01_Exam0130.java
JDBC 드라이버 등록 방법3: Driver 구현 클래스 로딩과 자동 등록
=> java.sql.Driver 인터페이스를 구현한 클래스를 로딩하면
해당 클래스에서 자신을 자동으로 DriverManager에게 등록할 것이다.
org.mysql.jdbc.Driver 클래스의 소스를 확인해 보라!
static 블록에서 Driver 객체를 만들어 DriverManager에게 등록한다.
=> 이 방식의 장점은 소스 코드에 클래스를 지정하는 대신
클래스 이름을 지정하기 때문에 실행할 때 다른 클래스로 쉽게 바꿀 수 있다.
=> 따라서 특정한 Driver 구현체에 종속되지 않게 만들 수 있다.
JDBC 드라이버 등록 방법3: Driver 구현 클래스 로딩과 자동 등록
=> java.sql.Driver 인터페이스를 구현한 클래스를 로딩하면
해당 클래스에서 자신을 자동으로 DriverManager에게 등록할 것이다.
org.mariadb.jdbc.Driver 클래스의 소스를 확인해 보라!
static 블록에서 Driver 객체를 만들어 DriverManager에게 등록한다.
=> 이 방식의 장점은 소스 코드에 클래스를 지정하는 대신
클래스 이름을 지정하기 때문에 실행할 때 다른 클래스로 쉽게 바꿀 수 있다.
=> 따라서 특정한 Driver 구현체에 종속되지 않게 만들 수 있다.
// JDBC 드라이버 준비 - 드라이버 클래스 로딩과 등록
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0130 {
public static void main(String[] args) {
try {
Class.forName("org.mariadb.jdbc.Driver");
// DriverManager에 자동 등록된 것을 확인해보자!
java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
System.out.println(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDBC 드라이버 준비 - DriverManager가 Driver 구현체를 자동 로딩 II
jdbc_ex01_Exam0141.java
JDBC 드라이버 로딩 방법4: Driver 구현체 자동 로딩
=> DriverManager를 사용할 때,
JVM은 'service-provider loading' 절차에 따라
Driver 구현체를 자동으로 로딩한다.
2) java.sql.Driver 클래스의 서비스 제공자를 찾아 로딩한다.
=> jar 파일 안에 META-INF/services/java.sql.Driver 파일을 찾는다.
=> 이때 JVM은 'service-provider loading' 절차에 따라 이 파일에 등록된 클래스를 로딩한다.
=> jar 파일에 해당 정보가 있다면,
앞의 예제처럼 개발자가 따로 java.sql.Driver 구현체를 명시적으로 등록하지 않아도 된다.
=> mariadb JDBC 드라이버 jar 파일은 이 정보가 들어 있다.
따라서 java.sql.Driver를 구현한 클래스를 로딩하거나 생성할 필요가 없다.
// JDBC 드라이버 준비 - DriverManager가 Driver 구현체를 자동 로딩 II
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0141 {
public static void main(String[] args) {
// 현재 jdbc.drivers 에 등록된 클래스 이름이 없다.
System.out.printf("jdbc.drivers=%s\n", System.getProperty("jdbc.drivers"));
try {
// Driver 구현체를 명시적으로 로딩하지 않는다!
// DriverManager에 자동 등록된 것을 확인해보자!
java.sql.Driver driver = DriverManager.getDriver("jdbc:mariadb://");
System.out.println(driver);
// 그럼에도 MariaDB Driver를 찾을 수 있다!
// 왜?
// - JVM은 프로그램을 실행할 때
// 'service-provider loading' 절차에 따라
// .jar 파일에 있는 특정 클래스를 찾아 로딩하거나 객체를 자동으로 생성한다.
// - JDBC의 경우도 이 규칙을 따른다.
// DriverManager의 getDriver()를 호출할 때
// 'service-provider loading' 규칙에 따라 .jar 파일에서
// Driver 구현체를 찾아 자동으로 로딩한다.
// 이 프로젝트에 Oracle JDBC 드라이버와 MSSQL Server의 JDBC 드라이버도 있다.
// 이들 드라이버도 'service-provider loading' 규칙에 따라 만들어졌기 때문에
// 따로 Driver 구현체를 생성한다거나 등록한다거나 클래스를 로딩하는 일을 하지 않아도
// 드라이버를 찾을 수 있을 것이다.
java.sql.Driver driver2 = DriverManager.getDriver("jdbc:oracle:thin://");
System.out.println(driver2);
java.sql.Driver driver3 = DriverManager.getDriver("jdbc:sqlserver://");
System.out.println(driver3);
System.out.println("테스트!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
각각의 Driver 경로 확인해보기
JDBC 프로그래밍 - DBMS에 연결하기
jdbc_ex01_Exam0210.java
JVM에서 jdbc driver 파일(.jar/META-INF/services/java.sql.Driver 파일)을 뒤져서
java.sql.Driver 를 구현한 클래스를 알아내어 자동으로 로딩하기 때문에,
다음과 같이 명시적으로 로딩할 필요가 없다.
// Class.forName("org.mariadb.jdbc.Driver");
DBMS에 연결하기
=> Driver 객체를 직접 사용하여 DBMS에 연결하지 않고 대신 DriverManager를 통해 연결한다.
=> DriverManager에게 연결할 DBMS의 정보(jdbc URL)를 주면
해당 DBMS의 Driver 객체를 찾아 connect()를 호출한다.
jdbc url : DBMS 서버 정보.
예) jdbc:DBMS://서버주소:포트/데이터베이스명
(포트번호를 지정하지 않으면 mysql인 경우 3306번이 포트번호로 사용된다.)
username : DBMS 사용자 아이디
password : DBMS 사용자 암호
=> DriverManager는 등록된 java.sql.Driver 구현체 중에서
jdbc url에 지정된 DBMS의 Driver 객체를 찾는다.
예) MariaDB: org.mariadb.jdbc.Driver 클래스의 객체
=> DB 연결을 Driver 구현체에게 위임한다.
즉, Driver 객체의 connect()를 호출한다.
=> Driver 구현체(org.mariadb.jdbc.Driver 객체)는 DBMS와 연결한 후
소켓 정보를 갖고 있는 java.sql.Connection 구현체를 리턴한다.
// JDBC 프로그래밍 - DBMS에 연결하기
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0210 {
public static void main(String[] args) throws Exception {
java.sql.Connection con = null;
try {
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydb", // jdbcURL
"study", // username
"1111" // password
);
System.out.println("DBMS와 연결됨!");
// MariaDB의 Driver 구현체가 리턴한 Connection 객체는
// 어떤 클래스일까?
System.out.println(con.getClass().getName());
} finally {
// 자원해제
// => 파일과 마찬가지로 DBMS에 연결한 후 더이상 사용하지 않으면 연결을 해제해야 한다.
try {
con.close();
} catch (Exception e) {
// 연결 해제하다가 발생된 예외는 무시한다.
// 왜? 이런 오류는 애플리케이션에서 처리할 방법이 없다.
// 처리할 필요도 없다.
}
System.out.println("DBMS와 연결 해제됨!");
}
}
}
=>
JDBC 프로그래밍 - DBMS에 연결하기
jdbc_ex01_Exam0220.java
// JDBC 프로그래밍 - DBMS에 연결하기
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0220 {
public static void main(String[] args) throws Exception {
// try-with-resources 문법을 사용하면
// try 블록을 벗어날 때 close()가 자동 호출된다.
//
try (java.sql.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb", // jdbcURL
"study", // username
"1111" // password
);) {
System.out.println("DBMS와 연결됨!");
}
System.out.println("DBMS와 연결 해제됨!");
}
}
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : insert
jdbc_ex01_Exam0310.java
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : insert
package com.eomcs.jdbc.ex1;
public class Exam0310 {
public static void main(String[] args) throws Exception {
try (java.sql.Connection con = java.sql.DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
// java.sql.Statement 구현 객체를 얻는다.
// - SQL문을 DBMS의 형식에 따라 인코딩하여 서버에 전달하는 일을 하는 객체.
java.sql.Statement stmt = con.createStatement();) {
// MariaDB의 Connection 객체가 리턴하는 Statement 구현체의 클래스 이름은?
System.out.println(stmt.getClass().getName());
// Statement 객체 사용법:
//
// 1) INSERT/UPDATE/DELETE 등 DML 관련 SQL문 전송
// => executeUpdate()
// => 리턴값: 변경(insert/update/delete)된 데이터의 개수
//
// 2) SELECT 등 DQL 관련 SQL문 전송
// => executeQuery()
// => 리턴값: 서버에서 데이터를 가져오는 일을 할 객체
//
// 용어정리
// "DML(Data Manipulation Language)"
// => insert, update, delete 처럼 데이터를 조작하는 sql 명령을 말한다.
// "DQL(Data Query Language)"
// => select처럼 data를 조회하는 sql 명령을 말한다.
//
int count = stmt.executeUpdate(
"insert into x_board(title,contents) values('제목10','내용'),('제목11','내용')");
System.out.printf("%d 개 입력 성공!", count);
}
}
}
ㄴ x_board 가 존재하지 않으므로 테이블 생성해주기
=>
ㄴ x_board, x_board_file 테이블 생성
=>
ㄴ 데이터 입력
=>
그 후 Exam310.java 실행 시 아래와 같이 출력되며 데이터 입력됨
=>
ㄴ 데이터 추가됨을 확인
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
jdbc_ex01_Exam0320.java
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0320 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
// executeQuery()
// => DBMS 서버에 select 문을 보낸다.
// => 리턴 값: java.sql.ResultSet 구현 객체
//
// ResultSet?
// => 결과가 아니다! 서버에서 결과를 가져오는 일을 할 객체이다.
// => 즉 서버의 select 실행 결과를 가져올 때 사용하는 도구이다.
//
java.sql.ResultSet rs = stmt.executeQuery(
"select * from x_board order by board_id desc");
) {
System.out.println(rs.getClass().getName());
// ResultSet 객체를 사용하여
// select의 실행 결과 중에서 한 레코드(row)를 서버에서 가져온다.
//
boolean isReceived = rs.next(); // 가져왔으면 true, 가져올 게 없다면 false
// 용어정리
// "레코드(record)"
// => select를 실행한 후 생성된 결과이다.
//
if (isReceived) {
// 서버에서 한 개 가져온 결과를 출력한다.
System.out.printf("%s, %s, %s, %s, %s\n", //
rs.getString(1), // board_id
rs.getString(2), // title
rs.getString(3), // contents
rs.getString(4), // created_date
rs.getString(5)); // view_count
// getString(컬럼번호):
// => DBMS에 설정된 컬럼의 값을 문자열로 리턴한다.
// => select 문에 나열한 컬럼의 순서를 지정한다.
// 단 번호는 0부터가 아니라 1부터 지정한다.
// => select 문에 wildcard(*)를 사용했다면,
// 테이블을 정의할 때 선언한 컬럼의 순서이다.
} else {
System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
}
}
}
}
ㄴ ResultSet 이 결과가 아님을 알 수 있음 => 서버의 select 실행 결과를 가져올 때 사용하는 도구임
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : getXxx()
jdbc_ex01_Exam0321.java
getXxx(컬럼번호):
=> DBMS에 설정된 컬럼의 타입에 따라 값을 변환해서 받고 싶다면,
다음과 같이 해당 타입의 값을 리턴하는 getXxx()를 호출한다.
=> int, number: getInt()
=> char, varchar, text: getString()
=> date, time, datetime: getDate(), getTime()
=> float: getFloat()
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : getXxx()
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0321 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(//
"select * from x_board order by board_id desc");
) {
boolean isReceived = rs.next();
if (isReceived) {
System.out.printf("%d, %s, %s, %s, %s, %d\n",
rs.getInt(1), // board_id
rs.getString(2), // title
rs.getString(3), // contents
rs.getDate(4), // created_date
rs.getTime(4), // created_date
rs.getInt(5)); // view_count
} else {
System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
}
}
}
}
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
jdbc_ex01_Exam0330.java
getXxx(컬럼명):
=> 컬럼의 번호를 지정하는 방식은 소스 코드를 읽을 때 매우 불편하다.
=> 해당 번호가 어떤 컬럼을 가리키는지 알려면
select 문을 살펴봐야 하는 번거로움이 있다.
=> 그래서 실무에서는 가능한 번호 대신 컬럼의 이름을 사용한다.
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0330 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager
.getConnection("jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(//
"select * from x_board order by board_id desc");
) {
boolean isReceived = rs.next();
if (isReceived) {
System.out.printf("%d, %s, %s, %s, %d\n",
rs.getInt("board_id"),
rs.getString("title"),
rs.getString("contents"),
rs.getDate("created_date"),
rs.getInt("view_count"));
} else {
System.out.println("서버에서 한 개의 레코드를 가져오지 못했다!");
}
}
}
}
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
jdbc_ex01_Exam0340.java
반복문을 사용하면 서버에서 여러 개의 데이터를 가져올 수 있다.
- next()는 서버에서 레코드 1개를 가져온다.
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0340 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
java.sql.ResultSet rs = stmt.executeQuery(
"select * from x_board order by board_id desc");
) {
// 반복문을 사용하면 서버에서 여러 개의 데이터를 가져올 수 있다.
// - next()는 서버에서 레코드 1개를 가져온다.
while (rs.next()) {
System.out.printf("%d, %s, %s, %s, %d\n",
rs.getInt("board_id"),
rs.getString("title"),
rs.getString("contents"),
rs.getDate("created_date"),
rs.getInt("view_count"));
}
}
}
}
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
jdbc_ex01_Exam0341.java
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : select
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0341 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
java.sql.ResultSet rs = stmt.executeQuery("select * from x_board order by board_id desc");
) {
while (rs.next()) {
// 컬럼 타입에 상관없이 getString()으로 값을 꺼낼 수 있다.
System.out.printf("%s, %s, %s, %s, %s\n", //
rs.getString("board_id"), //
rs.getString("title"), //
rs.getString("contents"), //
rs.getString("created_date"), // 시간까지 꺼낸다.
rs.getString("view_count")); //
}
}
}
}
ㄴ 컬럼 타입에 상관없이 getString()으로 값을 꺼낼 수 있음
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : update
jdbc_ex01_Exam0350.java
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : update
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0350 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
) {
// executeUpdate()
// => DBMS 서버에 update 문을 보낸다.
// => 리턴 값: 변경된 레코드의 개수이다.
int count = stmt.executeUpdate(
"update x_board set"
+ " view_count = view_count + 1"
+ " where board_id = 4");
System.out.printf("%d 개 변경 성공!", count);
}
}
}
ㄴ executeUpdate() 를 이용하여 DBMS 서버에 update 문을 보냄
jdbc_ex01_Exam0350.java 를 실행하여 목록 확인
=>
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete
jdbc_ex01_Exam0360.java
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0360 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
) {
// executeUpdate()
// => DBMS 서버에 delete 문을 보낸다.
// => 리턴 값: 삭제된 레코드의 개수이다.
int count = stmt.executeUpdate(
"delete from x_board where board_id = 7");
System.out.printf("%d 개 삭제 성공!", count);
}
}
}
ㄴ executeUpdate() 를 이용하여 DBMS 서버에 delete 문을 보냄
=>
jdbc_ex01_Exam0360.java 한 번 더 실행 시 아래와 같이 출력됨
ㄴ 7번 데이터는 이미 삭제되었기 때문
=>
jdbc_ex01_Exam0350.java 를 실행하여 목록 확인
ㄴ 7 번 데이터가 삭제되어있음을 확인할 수 있음
JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete, FK 가 참조하는 데이터 지우기
jdbc_ex01_Exam0361.java
// JDBC 프로그래밍 - DBMS에 SQL문 보내기 : delete, FK 가 참조하는 데이터 지우기
package com.eomcs.jdbc.ex1;
import java.sql.DriverManager;
public class Exam0361 {
public static void main(String[] args) throws Exception {
try (
java.sql.Connection con = DriverManager.getConnection(
"jdbc:mariadb://localhost:3306/studydb?user=study&password=1111");
java.sql.Statement stmt = con.createStatement();
) {
// 부모 테이블의 데이터를 지우려면,
// 부모 테이블의 데이터를 참조하는 자식 테이블의 데이터를 먼저 지워야 한다.
//
// => 게시글을 참조하는 첨부 파일 데이터를 먼저 지운다.
int count = stmt.executeUpdate(
"delete from x_board_file where board_id = 1");
System.out.printf("x_board_file 테이블 : %d 개 삭제 성공!\n", count);
// => 부모 테이블의 데이터를 지운다.
int count2 = stmt.executeUpdate(
"delete from x_board where board_id = 1");
System.out.printf("x_board 테이블 : %d 개 삭제 성공!\n", count2);
}
}
}
=>
int count = stmt.executeUpdate(
"delete from x_board_file where board_id = 1");
System.out.printf("x_board_file 테이블 : %d 개 삭제 성공!\n", count);
ㄴ 해당 코드를 주석 처리하면 아래와 같이 예외 발생
=>
=>
다시 주석 풀고 실행
=>
ㄴ 부모 테이블의 데이터를 삭제하기 위해 자식 테이블의 데이터를 먼저 지운 후 부모 테이블의 데이터를 삭제
=>
ㄴ 자식 테이블에서 board_id = 1 인 데이터를 모두 삭제하면 부모 테이블의 board_id = 1 인 데이터도 삭제 가능
ㄴ x_board_file, x_board 테이블에서 board_id = 1 인 데이터가 모두 삭제됨