[Oracle] JDBC
in Tech-Stack on Oracle DBMS
Contents
JDBC
Java DataBase Connection
์๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๋ํ๋ ์์ ์ ๋งํ๋ค.
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ workspace์ lib ํด๋๋ฅผ ์์ฑํ ํ ๊ด๋ฆฌํ๋ฉด ๋๋ค.
- lib : ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋
- bin : ์คํ ํ์ผ์ ๊ด๋ฆฌํ๋ ํด๋
- src : ์ฝ๋ ํ์ผ์ ๊ด๋ฆฌํ๋ ํด๋
๋๋ผ์ด๋ฒ๋ฅผ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํ ํ ๋น๋ ํจ์ค์ ์ถ๊ฐํด์ผ ํ๋ค. (๋๋ผ์ด๋ฒ ํด๋์ค๊ฐ ์ ์์ ์ผ๋ก ๋ก๋ฉ๋๋์ง ํ์ธํ๊ธฐ)
์ฐ๊ฒฐ ๋ฐฉ๋ฒ
๋ค์์ ํ์์ผ๋ก ์ฐ๊ฒฐํ๋ค.
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
System.out.println("๋๋ผ์ด๋ฒ ๋ก๋ฉ ์ฑ๊ณต");
conn = DriverManager.getConnection(url, id, pwd);
System.out.println("์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์ฑ๊ณต!");
} catch (ClassNotFoundException e) {
// ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ๋์ง ์์ ์ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
- Connection interface๋ฅผ ์์ฑ
- ๋๋ผ์ด๋ฒ ๋ก๋ฉ
- ์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ํ ํ Connection ๊ฐ์ฒด์ ๋์
DriverManager.getConnection()์ ๋งค๊ฐ๋ณ์๋ก url์ ์ ์ํ ๊ณ์ ์ id, ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ฌํ๋ค.
Query ์คํ
Java์ DB๊ฐ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์์ผ๋ฉด ๋ค์์ ๊ฐ์ฒด๋ฅผ ํตํด Query๋ฅผ ์คํํ ์ ์๋ค.
1. Statement
์ฌ์ฉ์์ ๊ฐ์ ์ด ์์ด Query๋ฅผ ์คํํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
import java.sql.Statement;
...
Statement stmt = null; // ์ฟผ๋ฆฌ ์ ์ก ๊ฒฐ๊ณผ ๊ฐ์ ธ์ค๊ธฐ
stmt = conn.createStatement();
// insert into "INFO" values (101, 'ํ๊ธธ๋', 'AB');
String name = "'ํ๊ธธ๋'";
String bloodType = "'AB'";
String sql = "insert into \"INFO\" values (101, " + name + ", '1444-01-01', " + bloodType + ")";
์คํํ sql์ String ๋ณ์๋ก ๋ถ๋ฆฌํด์ ๋ง๋ค์ด ๋๋๋ค.
stmt.executeUpdate(sql): insert, delete์ ๊ฐ์ ๋ช ๋ น์ ์คํํ ๊ฒฝ์ฐ ์ฌ์ฉint result = stmt.executeUpdate(sql);update๋ ํ์ ๊ฐ์๋ฅผ ๋ฐํํ๋ค.
stmt.executeQuery(sql): select ๋ช ๋ น์ ์คํํ ๊ฒฝ์ฐ ์ฌ์ฉimport java.sql.ResultSet; ... ResultSet rs = null; String sql = "select \"NUMBER\", \"NAME\" as \"NICKNAME\", \"BLOOD_TYPE\" from \"INFO\""; rs = stmt.executeQuery(sql); // ์ฟผ๋ฆฌ ์ ์ก! while (rs.next()) { System.out.print(rs.getLong(1) + ","); System.out.println(rs.getString("NICKNAME") + ", "); System.out.println(rs.getString(3)); }ResultSet์ผ๋ก select ๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋๋ค.ResultSet์ ์ถ๋ ฅํ ๋๋ index๋ก ์ ๊ทผ๋ ๊ฐ๋ฅํ๋ฉฐ column๋ช ์ผ๋ก๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.(get์๋ฃํ()์ ํ์)
2. PreparedStatement
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๊ฒฝ์ฐ Statement๋ฅผ ์ฌ์ฉํ๋ฉด SQL Injection์ด ๋ฐ์ํ ์ํ์ด ์๋ค.
- SQL Injection : ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ๋ณด์์์ ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ, ์์์ SQL๋ฌธ์ ์ฃผ์ ํ๊ณ ์คํ๋๊ฒ ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋น์ ์์ ์ธ ๋์์ ํ๋๋ก ์กฐ์ํ๋ ํ์
import java.sql.PreparedStatement;
...
PreparedStatement pstmt = null;
String name = "ํ๊ธธ๋";
String bloodType = "AB";
String sqlD = "delete from \"INFO\" where \"NAME\" = ? and \"BLOOD_TYPE\" = ?";
pstmt = conn.prepareStatement(sqlD);
pstmt.setString(1, name);
pstmt.setString(2, bloodType);
int result = pstmt.executeUpdate();
- SQL ์ฟผ๋ฆฌ ํ
ํ๋ฆฟ์ ์์ฑํ
PreparedStatement๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. - SQL๋ฌธ String ์๋ฃํ ์์ฑ
- ์ฌ์ฉ์์๊ฒ ์
๋ ฅ๋ฐ์ ์๋ฆฌ๋
?๋ฅผ ๋ฃ๋๋ค.
- ์ฌ์ฉ์์๊ฒ ์
๋ ฅ๋ฐ์ ์๋ฆฌ๋
prepareStatement(sql)๋ฅผ ํตํด ํด๋น SQL๋ฌธ์ ํ ํ๋ฆฟ์ ์ค๋นํ๋ค.- ์ฌ์ฉ์์๊ฒ ๊ฐ์ ์
๋ ฅ๋ฐ์
?๋ฅผ ์ฑ์๋ฃ๋๋ค.pstmt.setString(index, value)๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ๋ฃ์?์ ์ธ๋ฑ์ค์ ์ ๋ ฅ๋ฐ์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ค.- ์ธ๋ฑ์ค๋ 1๋ถํฐ ์์ํ๋ค.
- SQL ๋ฌธ์ด ์ ์์ ์ผ๋ก ์คํ๋๋ฉด update๋ ํ์ ๊ธธ์ด๋ select๋ ํ์ ๋ฐํํ๋ค.
