๐API(Application Programming Interface)
- ์๋ฐ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ธฐ์ ๋ช ์ธ์: ์ธํฐํ์ด์ค๋ก ๊ตฌ์ฑ
- ๊ตฌํ์ฒด๋ ๊ฐ DB์ ์ฒด๊ฐ ๊ตฌ์ฑ(๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ)
java.sql ํจํค์ง -> JDBC API
java.sql ๋ฌธ์




docker run --name oracle-xe -d -p 1521:1521 -e ORACLE_PASSWORD=oracle gvenzl/oracle-xe:18
-d: ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
-p: ํฌํธ 1521
--name: ๋ช
์นญ ๋ฐ๊พธ๊ธฐ

์ปจํ
์ด๋ ๋ง๋ค์ด์ก๋ค ~~


์๋ ์ค์ฝง์ ์๋ค! ์ฐ์ตํ ๋๋ ์๋ ์ฐ๋๊ฑฐ๋ก ์ฌ์ฉํ๊ธฐ


๋ง๋ค์๋ study๊ณ์ ์ฐ๊ฒฐ


#study์์ ํ
์ด๋ธ ์ถ๊ฐ
--ํ
์ด๋ธ ์์ฑ
CREATE TABLE MEMBER (
USER_NO NUMBER(10) PRIMARY KEY,
USER_ID VARCHAR2(30) UNIQUE NOT NULL,
USER_PW VARCHAR2(65) NOT NULL,
USER_NM VARCHAR2(40) NOT NULL,
MOBILE VARCHAR2(15),
REG_DT DATE DEFAULT SYSDATE,
MOD_DT DATE
);
--์ํ์ค ๊ฐ์ฒด ๋ง๋ค๊ธฐ
CREATE SEQUENCE SEQ_MEMBER;



ojdbc11.jar -> ์์กด์ฑ์ ์ถ๊ฐํ๊ธฐ

Ojdbc11 ยป 23.4.0.24.05 ๋ฒ์
gradle(short)
implementation 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'
dependencies {
runtimeOnly 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05' //๋์ ๋ก๋ฉํํ
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
ํ๊ธ๊นจ์ง๋ ์ค๋ฅ ํด๊ฒฐ์ ์ํด

lombok๋ ์ถ๊ฐ

dependencies {
runtimeOnly 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'
implementation 'com.oracle.database.nls:orai18n:23.4.0.24.05'
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
DriverManager ํด๋์ค -> Connection
DataSource ์ธํฐํ์ด์ค -> Connection: ์ปค๋ฅ์
ํ(์ฐ๊ฒฐ ๊ฐ์ฒด ์ ์ฅ์)
1) java.sql.* ํจํค์ง ์ํฌํธ
2) JDBC ๋๋ผ์ด๋ฒ ๋ก๋ฉ
Class.forName(..) -> ojdbc11.jar3) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์์ ์ํ Connection๊ฐ์ฒด ์์ฑ
DriverManager : ์ ์์ ํ ๋๋ง๋ค Connection ๊ฐ์ฒด๋ฅผ ์์ฑ -> ํจ์จ์ฑX, ์ฑ๋ฅ X
ย ย ย Connection getConnection()
ย ย ย Connection getConnection(String url, String user, String password)
jdbc:oracle:this:@localhost:1521:XEDataSource ์ธํฐํ์ด์ค: ์ปค๋ฅ์
ํ์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ์ฒด๊ฐ ์๋ค.
ย ย ย ย ย ย ย (Tomcat JDBC, HikariCP)
Connection getConnection() - Connection๊ฐ์ฒด๊ฐ ๋ฐํ๊ฐ
4) ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ๊ธฐ ์ํ
๐ผ
Statement/PreparedStatement/CallableStatement ๊ฐ์ฒด ์์ฑ
5) ์ฟผ๋ฆฌ ์คํ
6) ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ ๊ฐ(int, ResultSet) ์ฌ์ฉ
7) ์ฌ์ฉ๋ ๊ฐ์ฒด(ResultSet, Statement/PreparedStatement/CallableStatement, Connection) ์ข ๋ฃ
1) JDBC ๋๋ผ์ด๋ฒ ๋ก๋ฉํ๊ธฐ

๐ผ๋๋ผ์ด๋ฒ ๋ก๋ฉ
2) Connection ๊ฐ์ฒด ์์ฑํ๊ธฐ



3) ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ซ๊ธฐ

Connection ์ธํฐํ์ด์ค์๋ ์ฐ๊ฒฐ ์ข
๋ฃ๋ฅผ ์ํ AutoCloseable์ ์์๋ฐ๊ณ ์๋ค.
์์ ์๋ํด์ ์ ๊ธฐ์ค์ ๋ถํฉํ๋ค.
try with resource๋ฌธ -> ์์ ์๋ํด์


Connection
ย ย ย Statement createStatement();

1) ๐ResultSet executeQuery(String sql)

2) ๐int executeUpdate(String sql)

db์ ์
๋ก๋ ์ ๋์๋น

3) close()
๐ป์ ์ฒด test ์ฝ๋
package exam01;
import org.junit.jupiter.api.Test;
import java.sql.*;
import java.time.LocalDateTime;
public class Ex01 {
@Test
void test1(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
String url = "jdbc:oracle:thin:@localhost:1521:XE";//๊ฐ์ ์์น์ ์์ผ๋ฉด localhost
//ํ์ฌ ๊ฐ์ ์๋ฒ์ ์กด์ฌํ๋๊น localhost, ๊ธฐ๋ณธํฌํธ 1521, ์ฐ์ต์ฉ ๊ณ์ ์ฌ์ฉ์ EE
//๋ค๋ฅธ ์๋ฒ์ ์์ผ๋ฉด ip์ฃผ์๋ ๋๋ฉ์ธ ์ฃผ์ ์
๋ ฅ ex)3.100.2.111
String user = "STUDY";
//์ฐ์ต์ฉ ๊ณ์ ์ SCOTT
String password = "oracle"; // SCOTT์ tiger
// try{
// Connection conn = DriverManager.getConnection(url, user, password);
// //db์ ์ฐ๊ฒฐํ ์ ์๋ ํต์ฌ์ ์ธ ๋ฉ์๋์ด๋ค.
// System.out.println(conn);//์ ์ํ์ธ
// }catch (SQLException e){
// e.printStackTrace();
// }
try(Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()){//Statement ๊ฐ์ฒด๋ก sql๋ฌธ ์คํ ํ ์์๋ค.
String sql = "INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM, MOBILE) VALUES (SEQ_MEMBER.NEXTVAL, 'USER01', '123456', '์ฌ์ฉ์01', '01000000000')";
int cnt = stmt.executeUpdate(sql);
System.out.println(cnt);
}catch (SQLException e){
e.printStackTrace();
}
}
@Test
void test2(){
try {
// ์ค๋ผํด ๋๋ผ์ด๋ฒ ๋์ ๋ก๋ฉ
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String user = "STUDY";
String password = "oracle";
try(Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement()) {
String keyword = "์ฌ์ฉ์";
//ํค์๋๊ฐ ํฌํจ๋์๋์ง ์๋์๋์ง๋ก ํ๋จ
String sql = "SELECT * FROM MEMBER WHERE USER_NM LIKE '%"+keyword+"%'";
//String sql = "SELECT * FROM MEMBER";
ResultSet rs = stmt.executeQuery(sql);
//์กฐํ ๊ฒฐ๊ณผ ์ฌ๊ธฐ์ ํํ์ฉ ์ฐพ์์ ๊ฐ์ ธ์ด
while (rs.next()){
long userNo = rs.getLong("USER_NO"); //์ปฌ๋ผ๋ช
์ง์ ๋ช
์ํด์ผ ์์๊ฐ ๋ฐ๋์ด๋ ๋ฌธ์ ๊ฐ ์๊ฒ ๋๋ค.
String userId = rs.getString("USER_ID");
String userPw = rs.getString("USER_PW");
String userNm = rs.getString("USER_NM");
String mobile = rs.getString("MOBILE");
//๋ ์ง์ ์๊ฐ ๊ฐ์ ธ์ค๊ธฐ
LocalDateTime regDt = rs.getTimestamp("REG_DT").toLocalDateTime();
System.out.printf("USER_NO: %d, USER_ID: %s, USER_PW: %s, USER_NM: %s, MOBILE: %s%n, REG_DT: %s%n", userNo, userId, userPw, userNm, mobile, regDt);
}
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
๋ณด์์ ์ธ ์ธก๋ฉด์ด๋ ์ฑ๋ฅ์ ๋ฐ์ก์๋ PreparedStatement ์ฌ์ฉํ๋๊ฒ์ด ๋ ์ข๋ค!

1) ๋์ ์ธ ์ฟผ๋ฆฌ์ ์ฌ์ฉ
2) ํ๋์ ๊ฐ์ฒด๋ก ์ฌ๋ฌ ๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ผ๋ฉฐ, ๋์ผํ ์ฟผ๋ฆฌ๋ฌธ์ ํน์ ๊ฐ๋ง ๋ฐ๊พธ์ด์ ์ฌ๋ฌ ๋ฒ ์คํํด์ผ ํ ๋, ๋งค๊ฐ๋ณ์๊ฐ ๋ง์์ ์ฟผ๋ฆฌ๋ฌธ์ ์ ๋ฆฌํด์ผ ํ ๋ ์ ์ฉ
? ํ๋ผ๋ฏธํฐ๋ก ๋ฏธ๋ฆฌ ์ ์, ๊ฐ์ set์๋กํ ๋ฉ์๋๋ก ์ง์ Connection
ย ย ย PreparedStatement prepareStatement(String sql);
?๋ก ๊ธฐ์
set ์๋ฃํ(int ?์ ์์น๋ฒํธ, ๊ฐ);
๐ResultSet executeQuery() : SELECT
๐int executeUpdate(): INSERT, UPDATE, DELETE
-> statement์ ์ฐจ์ด์ ์ ๋งค๊ฐ๋ณ์์ sql์ ๋ค์ด๊ฐ์ง์๋๋ค. prepareStatement(String sql)์์ ๋ฏธ๋ฆฌ ์ค๋นํ๊ธฐ๋๋ฌธ
package exam01;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.sql.*;
import java.time.LocalDateTime;
public class Ex02 {
private String url = "jdbc:oracle:thin:@localhost:1521:XE";
private String user = "STUDY";
private String password = "oracle";
@BeforeAll //๋ชจ๋ ํ
์คํธ ๋ฉ์๋ ํธ์ถ ์ ์ ๋จ ํ๋ฒ์คํ - ๊ณตํต ์ด๊ธฐํ
static void init(){ //๊ณตํต ์ด๊ธฐํ ํ๋ฒ ์คํ
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
@Test
void test1(){
String keyword = "์ฌ์ฉ์";
String sql = "SELECT * FROM MEMBER WHERE USER_NM LIKE ?"; //๋ณ์๊ฐ ๊ต์ฒด ๋ ๋ถ๋ถ์ ?๋ก ์์ฑ
// ๋ด๋ถ์ ์ผ๋ก ๋ณด์์ ์ผ๋ก ์ทจ์ฝํ ๋ถ๋ถ์ ์ ์ธํ๊ณ ๊ฐ์ ๋ฃ์ด์ค
//์กฐํ
try(Connection conn = DriverManager.getConnection(url,user,password);
PreparedStatement pstmt = conn.prepareStatement(sql)){
//๋ฌผ์ํ์ ์์น๋ 1๊ฐ๋ฐ์ ์๋ค ํ์ฌ๋ ํ๋๋ฐ์์์ผ๋...
pstmt.setString(1,"%"+keyword+"%");
// ํ์นธ์ฉ ์ปค์์ด๋ํ๋ฉด์ ๋ฐ์ดํฐ ์กฐํ
ResultSet rs = pstmt.executeQuery();
while (rs.next()){
long userNo = rs.getLong("USER_NO");
String userId = rs.getString("USER_ID");
String userPw = rs.getString("USER_PW");
String userNm = rs.getString("USER_NM");
String mobile = rs.getString("MOBILE");
LocalDateTime regDt = rs.getTimestamp("REG_DT").toLocalDateTime();
System.out.printf("USER_NO: %d, USER_ID: %s, USER_PW: %s, USER_NM: %s, MOBILE: %s%n, REG_DT: %s%n", userNo, userId, userPw, userNm, mobile, regDt);
}
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}




Connection
ย ย ย PreparedStatement prepareStatement(String sql, String[] columnNames);
-> columnsNames: ์ฆ๊ฐ๋ฒํธ ๊ธฐ๋ณธํค๋ฅผ ๋ช
์
ResultSet getGeneratedKeys()๋ฅผ ํตํด์ ๊ธฐ๋ณธํค ์กฐํ

์ฌ์ฉ์ 04

#STUDY ์คํฌ๋ฆฝํธ
CREATE OR REPLACE PROCEDURE REGISTER_MEMBER(
P_USER_ID VARCHAR2,
P_USER_PW VARCHAR2,
P_USER_NM VARCHAR2,
P_MOBILE VARCHAR2
)
IS
BEGIN
INSERT INTO MEMBER (USER_NO, USER_ID, USER_PW, USER_NM,MOBILE)
VALUES(SEQ_MEMBER.NEXTVAL, P_USER_ID, P_USER_PW,P_USER_NM, P_MOBILE);
END REGISTER_MEMBER;
SELECT * FROM USER_ERRORS;

CallableStatement
1) ํ๋ก์์ ์คํ์ ์ฌ์ฉ

boolean next(): ๋ค์ ํ์ผ๋ก ์ด๋, ๋ค์ ํ์ด ์์ผ๋ฉด true, ์์ผ๋ฉด false
์๋ฃํ get์๋ฃํ(int ์ปฌ๋ผ ์์๋ฒํธ);
์๋ฃํ get์๋ฃํ(String ์ปฌ๋ผ๋ช
);
String getString(): ๋ฌธ์ํ ๋ฐ์ดํฐ(CHAR, VARCHAR2, CLOB..)
int getInt() long getLong(): ์ ์ํ ๋ฐ์ดํฐ
float getFloat() double getDouble(): ์ค์ํ ๋ฐ์ดํฐ
java.sql.Time: ์๊ฐ - getTime()
java.sql.Date: ๋ ์ง - getDate()
java.sql.Timestamp: ๋ ์ง + ์๊ฐ - getTimestamp()


๊ฐ๊ณตํ๊ธฐ ํธํ java Timeํจํค์ง ์ด์ฉ



๐ฝtest2 ์คํ๊ฒฐ๊ณผ

๐ธ๊ฒ์ ๊ธฐ๋ฅ ์ถ๊ฐ

test2์คํ์ ์ฌ์ฉ์01 ์กฐํ ์ฑ๊ณต

Tomcat JDBC
์์กด์ฑ: tomcat-jdbc

gracle(short) ์์กด์ฑ ์ถ๊ฐ
dependencies {
runtimeOnly 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05'
implementation 'com.oracle.database.nls:orai18n:23.4.0.24.05'
compileOnly 'org.projectlombok:lombok:1.18.32'
annotationProcessor 'org.projectlombok:lombok:1.18.32'
implementation 'org.apache.tomcat:tomcat-jdbc:10.1.24'
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}



HikariCP

Gradle short ์์กด์ฑ ์ถ๊ฐ

