java๋ก JDBC์ฐ๋ํ๋ ๊ธฐ์
(SQL๋ฌธ์ ์๋ฐ๋ก ๋ง๋ ์์คํ ์ ํตํด ์คํํ ์ ์๋๋ก ๋ง๋ค์ด์ง ์๋ฐ์ ๊ธฐ์ )
[ JDBC api ์ฌ์ฉ ์ ์ฒ๋ฆฌ ์์ ]
-
jdbc๋๋ผ์ด๋ฒ๋ฅผ ์ ์กฐ์ฌ ํํ์ด์ง์์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.
- C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib ํด๋์ ์๋ ojdbc.jarํ์ผ
-
JVM์ด ์ธ์ํ ์ ์๋ ์์น์ ์ฐ๊ฒฐ
- ์ดํด๋ฆฝ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ(Application)
โ ์์ ์ค์ธ ํ๋ก์ ํธ ์ ํ
โก ํ๋ก์ ํธ์์ ๋จ์ถ๋ฉ๋ด ์ ํ -> [Build path] - [Configure Build parth] - [library]
โข ๋ํ์์์์ ์ธ ๋ฒ์งธ ํ์ธ [Librariesํญ ์ ํ] ( ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ, API๋ฅผ ์ธ์์ํฌ ๋๋ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก ๋ฃ๋๋ค.)
โฃ [Add External jar...] ์ ํํ๊ณ 1๋ฒ์์น์ ์๋ ojdbc6.jarํ์ผ์ ๋ฑ๋ก
[ JDBC api ์ฌ์ฉํ๊ธฐ ]
-
jdbc๋๋ผ์ด๋ฒ๋ฅผ ์ ์กฐ์ฌ ํํ์ด์ง์์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.
-
์ค๋ผํด ๋๋ผ์ด๋ฒ ๋ก๋ฉ : JVM์์ ๋๋ผ์ด๋ฒ ๋ด์ api๋ฅผ ์ ๊ทผํด์ ์ฌ์ฉํ ์ ์๋๋ก Classํด๋์ค์ forName๋ฉ์๋๋ฅผ ์ด์ฉํด์ ํต์ฌํด๋์๋ฅผ ๋ก๋ฉํ๋ ์์
[๋ฌธ๋ฒ]
Class.forName("DBMS๋๋ผ์ด๋ฒ์ ํต์ฌํด๋์ค๋ช ") -------------------------โํจํค์ง๋ช ๊น์ง ๋ช ์
-
์ค๋ผํด: oracle.jdbc.driver.OracleDriver
-
MySQL : com.mysql.jdbc.Driver
-
-
-
DBMS์ ์ฐ๊ฒฐํ๊ธฐ
-
DriverManagerํด๋์ค์
getConnection๋ฉ์๋๋ฅผ ํตํด ์์-
static๋ฉ์๋์ด๋ฏ๋ก ํด๋์ค์ด๋ฆ์ผ๋ก ์ก์ธ์ค
-
throws SQLExceptionํ๊ณ ์๊ณ , SQLException์ RuntimeException์ ํ์๊ฐ ์๋๋ฏ๋ก
try~catch๋ฅผ ์ด์ฉํด์ exception์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค. -
๋งค๊ฐ๋ณ์
url : DBMS๋ด๋ถ์์ ์ธ์ํ ์ฐ๊ฒฐ๋ฌธ์์ด (์ด๋ค DBMS๋ฅผ ์ฐ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.)
โ [์ค๋ผํด]
jdbc:oracle:thin:@70.12.115.50:1521:xe
- jdbc:oracle:thin: ์ค๋ผํด์์ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ
- @70.12.115.50: DBMS๊ฐ ์ค์น;๋์ด ์๋ PC์ ip
- 1521 : port
- xe : ์๋น์ค๋ช
ex) jdbc:oracle:thin:@127.0.0.1:1521:xe => localhost์ ๋์ผ - ๋ก์ปฌ์ ์ฐ๊ฒฐ
[mysql]
jdbc:mysql://ip:port/๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช (port - 3306)
user : ์ ์๊ณ์
password : ์ ์ํ ๊ณ์ ์ ํจ์ค์๋
- ๋ฆฌํดํ์
- ์ฐ๊ฒฐ์ ๋ณด๋ฅผ java.sql.Connectionํ์ ์ผ๋ก ๋ฆฌํด DriverManager์getConnection๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด DBMS์ ์ฐ๊ฒฐ ํ ์ฐ๊ฒฐ์ ๋ณด๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ ๋ฆฌํดํ๋ค.
- ์ฐ๊ฒฐ๊ฐ์ฒด์ ํ์ ์ java.sql.Connection์ด์ง๋ง ์ด๋ค DBMS๋ฅผ ์ ์ํ๋์ ๋ฐ๋ผ Cpnnection์ ํ์ ๊ฐ์ฒด๊ฐ ๋ฆฌํด๋๋ค.
- ๋ด๋ถ์์๋ ์ ์๋ DBMSํ์ฌ์์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Connection์ด๋ฆฌํด๋๋๋ก ๋คํ์ฑ์ด ์ ์ฉ๋์ด ์๋ค.
- ์ฌ์ฉ๋ฐฉ๋ฒ
Connection con = DriverManager.getConnection(url,user,password)
=> ์ด๋ค DBMS๋ฅผ ์ฐ๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ฆฌ์ปจ๋๋ Connection๊ฐ์ฒด๋ฅผ con์ด๋ผ๋ ์ฐธ์กฐ๋ณ์๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋๋ก ํ ๋น
-
-
-
SQL์ ์คํํ๋ ์ญํ ์ ๋ด๋นํ๋ Statement๊ฐ์ฒด ์์ฑ
statement: ์ ์ SQL์ ์คํ (๋ณด์์ ์ทจ์ฝ - SQLInjection์ ์ทจ์ฝ) โ ์์preparedStatement: ๋์ SQL์ ์คํ (์ํ์ด์ฝ๋ฉ์ ์ ํฉ)โ โ ์์
CallableStatement: ๊ฐ DBMS์ ํนํ๋ SQL์ ์คํ ex.์ค๋ผํด : PL-SQL- Statement๊ฐ์ฒด๋ฅผ ์ด์ฉ Connection ๊ฐ์ฒด์ ์๋ createStatement๋ฉ์๋๋ฅผ ํตํด ์์ฑ Connection ์ ๋ณด๋ฅผ ์ ์งํด์ผ ํ๋ค.
Statement stmt = con.createStatement(); -------- โ> java.sql.Statemetํ์ ์ด์ง๋ง ๋๋ผ์ด๋ฒํ์ผ์ ํฌํจ๋ Statement ๊ฐ์ฒด๊ฐ ๋ฆฌํด.
- PreparedStatement๊ฐ์ฒด๋ฅผ ์ด์ฉ
-
SQL์คํ
- Statement ์ด์ฉ
โ executeUpdate : insert, updeate, delete๋ฌธ์ ์คํ
int ๊ฒฐ๊ณผ๊ฐ = stmt.executeUpdate(sql๋ฌธ) --------- ----- โ> sql๋ฌธ ์คํ ๊ฒฐ๊ณผ โ>insert, delete, update
๋ช ๊ฐ์ row๊ฐ ๋ณ๊ฒฝ๋๋์ง ๋ฆฌํด
- PreparedStatement ์ด์ฉ => ๋์ SQL๋ฌธ์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์
-
sql์ด ์คํ๋๋ ๊ณผ์ ์ (๋ฐ๋ณตํด์ ์คํ๋จ)
- ์ฟผ๋ฆฌ๋ฌธ์ ์ฝ๊ณ ๋ถ์
- ์ปดํ์ผ
- ์คํ
-
statement๋์์ ๋จ๊ณ๋ฅผ ๋ชจ๋ ๋ฐ๋ณตํด์ ์คํํ๊ณ ์์ ํ์ง๋ง, PreparedStatement๋ ํ ๋ฒ ์คํํ๊ณ ์บ์๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์บ์๋ฉ๋ชจ๋ฆฌ์์ ์ฝ์ด์ ์์ ํจ. (ํ๋ฒ๋ง ์คํ๋จ)
-
PreparedStatement์ sql๋ฌธ์ ์คํํ๋ ๋ฐฉ์์ sql๋ฌธ์ ๋ฏธ๋ฆฌ ํ์ฑํ ํ, ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉํด์ ์์ ํด์ผ ํ๋ ๊ฐ๋ค๋ง ๋์ค์ ์ฐ๊ฒฐํด์ ์ธ์์ํค๊ณ ์คํํ๋ค.
โ sql๋ฌธ์ ์์ฑํ ๋ ์ธ๋ถ์์ ์ ๋ ฅ๋ฐ์์ ์ฒ๋ฆฌํด์ผํ๋ ๋ถ๋ถ์ ?๋ก ์ ์ํ๋ค.
โก sql๋ฌธ์ ๋ฏธ๋ฆฌ ํ์ฑํด์ผ ํ๋ฏ๋ก ์คํํ ๋ sql์ ์ ๋ฌํ์ง ์๊ณ PreparedStatement๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ sql๋ฌธ์ ์ ๋ฌํ๋ค.
preparedStatement ptmt = con.prepareStatement(sql๋ฌธ)
โข?์ ๊ฐ์ ์ ํ PreparedStatement ๊ฐ์ฒด์ ์ ์๋์ด ์๋ setXXXX๋ฉ์๋๋ฅผ ์ด์ฉ ResultSet๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ฉ์๋๋ฅผ ๊ตฌ์ฑ
setXXXX(index, ๊ฐ) ------- ----- -- ์ปฌ๋ผํ์ ?์์ โ> ์ปฌ๋ผ์ ์ค์ ํ ๊ฐ 1๋ถํฐ์์
์ค๋ผํด ํ์ ๊ณผ ๋งค์นญ๋๋ setXXXX ๋ฉ์๋
-
char, varchar2 -> setString(1,"XXXX")
-
number, integer -> setInt (1,0000)
-
์์์ ์ด ์๋ number -> setDouble(1, 0.0)
-
date -> setDate(1, java.sql.Date๊ฐ์ฒด)
โฃ ์คํ๋ฉ์๋ ํธ์ถ
-
insert, delete, update
int result = ptmt.executeUpdate();
-
select
ResultSet rs = ptmt.executeQuery();
-
-
๊ฒฐ๊ณผ๊ฐ ์ฒ๋ฆฌ
- insert, delete, update๋ชจ๋ ๋์ผ
- int๋ก ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅ
- select
โ select๋ฌธ์ ์คํ๊ฒฐ๊ณผ๋ก ๋ฐํ๋๋ ResultSet์ ์ฐธ์กฐํ ์ ์๋๋ก ์ ์ํ๋ค.
ResultSet rs = stmt.excuteQuery("sql๋ฌธ");
โก ResultSet์์์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด์ ์ฒ๋ฆฌ (ํ๋ฒ์ ํ๋์ฉ ๋ฐ์ ๋ชป์ฝ์ผ๋๊น.) ์ฒ์ ๋ฐํ๋๋ ResultSet์์ Cursor๊ฐ ๋ ์ฝ๋์ ์์นํ์ง ์์ผ๋ฏ๋ก Cursor๋ฅผ ResultSet์์ ๋ ์ฝ๋์ ์์นํ ์ ์๋๋ก ๋ด๋ถ ๋ฉ์๋๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํ๋ค.
while(rs.next()){ ----------> ๋ค์ ๋ ์ฝ๋๋ก Cursor๋ฅผ ์ด๋ํ๊ณ ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋ฉด true๋ฅผ ๋ฆฌํดํ๊ณ ๋ ์ฝ๋๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด false๋ฅผ ๋ฆฌํดํ๋ค. }
โข ๋ ์ฝ๋์ ๊ฐ์ ์ฝ๋ ์์
-
ํ ๋ฒ์ ํ๋์ ์ปฌ๋ผ๋ง ์ฝ์ ์ ์๋ค.
-
ResultSet๋ด๋ถ์์ ์ ๊ณต๋๋ getXXXX๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค. (๋๋ถ๋ถ XXXX๋ ๋ฐ์ดํฐ ํ์ ์ด ๋ ๊ฒ์)
- rs.getXXXX(1) --------- > ๋ฐ์ดํฐํ์ , ํ ์ด๋ธ์ ์กด์ฌํ๋ ์ปฌ๋ผ์ ์๋์์๊ฐ ์๋๋ผ ์กฐํ๋ ์ปฌ๋ผ์ ์์(indext๊ฐ 1๋ถํฐ ์์)
-
์ค๋ผํด(DBMS)์ ํ์ ๊ณผ ๋งค์นญ๋๋ ์๋ฐ์ ํ์ ์ผ๋ก ๋ฉ์๋๋ช ์ด ๊ตฌ์ฑ๋จ.
-
varchar2 of char๋ก ์ ์๋ ์ปฌ๋ผ๊ฐ : getString(์ปฌ๋ผ์ ์์ or ์ปฌ๋ผ๋ช )
-
์์์ ์๋ number or integer : getInt(์ปฌ๋ผ์์์ or ์ปฌ๋ผ๋ช )
-
์์์ ์ด ์๋ number : getDouble(์ปฌ๋ผ์์์ or ์ปฌ๋ผ๋ช )
-
๋ ์ง๋ฐ์ดํฐ : getDate(์ปฌ๋ผ์์์ or ์ปฌ๋ผ๋ช )
while(rs.next()){ ----------> ์กฐํ๋ ํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋์ ๋ฐ๋ณต ์์ ํ๊ฒ ๋ค๋ ๋ง. sysout(rs.getString(1)) -> ์กฐํ๋ ๋ ์ฝ๋์ ์ฒซ ๋ฒ์งธ ์ปฌ๋ผ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ๋ง. sysout(rs.getString("ename")) -> ์กฐํ๋ ๋ ์ฝ๋์ ์ปฌ๋ผ๋ช ์ด ename์ธ ์ปฌ๋ผ์ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ๋ง. }
-
-
์์ ๋ฐ๋ฉ
- ์์์ ๋ฐ๋ฉํ์ง ์์ผ๋ฉด ๊ณ์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋์ด ์๋ ์ํ. ResultSet, Statement, Connection๋ชจ๋ ๋ฐ๋ฉํด์ผ ํ๋ค. close๋ฉ์๋๋ฅผ ์ด์ฉํด ์์ํด์ . ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ถํฐ ํด์ ํด์ผ ํ๋ค.
-
๋๋ผ์ด๋ฒํ์ผ์ JVM์ด ์ธ์ํ ์ ์๋์์น์ ์ฐ๊ฒฐ
-
๋๋ผ์ด๋ฒ ๋ก๋ฉ (ํด๋์ค๋ค์ ๋ก๋ฉ)
- ๋ด๊ฐ new๋ก ์์ฑํ ์ ์๋ค. ์๋ํ๋ฉด ๋ด๋ถ ์คํ์ํ์ธํ ์ ์์ผ๋๊น (lock ๊ฑธ๋ ค์์) ์ธ๋ถ์์ ๊ฐ๊ณ ์จ jar ํ์ผ = ์ธ๋ถ์์ ๊ฐ๊ณ ์จ API.
-
DBMS์ฐ๊ฒฐ
-
SQL์ ์คํํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ์์ฑ
-
SQL ์คํ