๐ปPreparedStatement
- ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ SQL ๋ฌธ์ ์คํํ๋ค. (SQL Injection์ ๋ฐฉ์งํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค)
- ๊ธฐ๋ฅ์ด ๋ ํฅ์๋ ๊ฐ๋ํ์ด๋ค.
- Statement ์์ ๋งค๊ฐ ๋ณ์ ์ฒ๋ฆฌ๋ฅผ ํนํํ๋ค.
- ์์ ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ด ๋๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ์๋์ผ๋ก ์ ํจ์ฑ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
Statement ์ PrearedStatement ๋น๊ต
Statement๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ์ SQL์ ๋ค๋ฃจ๊ธฐ ํธํ๊ณ ,
PreparedStatement๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๋์ SQL์ ๋ค๋ฃจ๊ธฐ ํธํ๋ค.
์ ์ SQL๊ณผ ๋์ SQL
์ ์ SQL
๋ฏธ๋ฆฌ ์์ฑ๋ ๊ณ ์ ๋ SQL ๋ฌธ์ฅ์ ์๋ฏธํ๋ค.
String sql = "insert into tblAddress (seq, name, age, gender, address, regdate) values (seqAddress.nextVal, '์ด์์ ', 25, 'm', '์์ธ์ ๊ฐ๋จ๊ตฌ', default)";
sql = String.format("insert into tblAddress (seq, name, age, gender, address, regdate) values "+ "(seqAddress.nextVal, '%s', %s, '%s', '%s', default)", name, age, gender, address);
๋์ SQL
์คํ ์๊ฐ์ ์์ฑ๋๊ณ ์คํ๋๋ SQL ๋ฌธ์ฅ์ ์๋ฏธํ๋ค.
'?'์ ์ค๋ผํด ๋ณ์๋ก์ ์ํฉ์ ๋ฐ๋ผ ๊ฐ์ด ๋ณํ๋ค๊ณ ์ธ์ํ๋ค.
PreparedStatement๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋๋ ๋งค๊ฐ๋ณ์๋ฅผ ์๋์ผ๋ก ์ ํจ์ฑ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ธ๋ฐ '?'๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ํํ๋ค.
sql = String.format("insert into tblAddress (seq, name, age, gender, address, regdate) values (seqAddress.nextVal, ?, ?, ?, ?, default)", name, age, gender, address);
์๋ฅผ ๋ค์ด) ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์ ๋ฐ์ ๋, ๊ฝ๋ฐ์ดํ(')๊ฐ ๋ค์ด๊ฐ์์ผ๋ฉด ์ฝ์ ๋์ง์์, ์ด์ค์ผ์ดํ์์ผ์ ์ฝ์ ํด์ผํ๋ค.
String address = "๋ก์๋ง์'s";
address = address.replace("'", "''");
ํ์ง๋ง ๋์ SQL๋ฌธ์ผ๋ก ์์ฑํ๋ฉด, ์ด์ค์ผ์ดํ ์ฝ๋๋ฅผ ์์ฑํ ํ์์์ด ๊ทธ๋๋ก ์ฝ์ ํ ์ ์๋๋ก ๋์์ค๋ค.
๐ปPreparedStatement ์์
์ฌ์ฉ์์๊ฒ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ฐ์ผ๋ก insert
๋งค๊ฐ๋ณ์ ์ ๋ ฅ๋ฐ๊ธฐ
์ฌ์ฉ์์๊ฒ ๊ฐ์ ์ ๋ ฅ๋ฐ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ด๋ฆ, ๋์ด, ์ฑ๋ณ, ์ฃผ์ ๋ณ์์ ๊ฐ์ ์ ์ฅํ๋ค.
String name = "์ ์งฑ์";
String age = "2";
String gender = "f";
String address = "๋ก์๋ง์'s";
๋์ SQL ์์ฑํ๊ธฐ
String sql = "insert into tblAddress (seq, name, age, gender, address, regdate) values "
+ "(seqAddress.nextVal, ?, ?, ?, ?, default)";
PreparedStatement ๊ฐ์ฒด ์ด๊ธฐํ
์์ฑํ ๋๋ถํฐ sql๋ฌธ์ ๋งค๊ฐ๋ณ์๋ก ํ์๋กํ๋ค.
pstat = conn.prepareStatement(sql);
pstat.setXXX()
์์ฑ๋ PreparedStatement ๊ฐ์ฒด๋ฅผ ๋ด๊ณ ์๋ ๋ณ์ pstat๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ์ ๊ฒธํ๋ค.
pstat.setXXX()์ผ๋ก ๋ฌธ์์ด์ SQL ๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ธ๋ฉํ๋ ์ญํ ์ ํ๋ค.
setString(int parameterIndex, String x)
parameterIndex๋ ๋ฌผ์ํ(?)์ ์์น๋ฅผ ๋ํ๋ด๋ ์ธ๋ฑ์ค์ด๋ค. ์ฒซ ๋ฒ์งธ ๋ฌผ์ํ๋ 1๋ถํฐ ์์ํ๋ค.
x๋ SQL ๋ฌธ์ ๋ฐ์ธ๋ฉํ ๋ฌธ์์ด์ด๋ค.
pstat.setString(1, name);
pstat.setString(2, age);
pstat.setString(3, gender);
pstat.setString(4, address);
๊ฒฐ๊ณผ๊ฐ ์ ์ฅ
sql๋ฌธ ์คํ์ด ์ ๋๋ก ๋์๋์ง executeUpdate() ๋ฉ์๋๋ก ์ ๋ฐ์ดํธ๋ ํ์ ์๋ฅผ ๋ฐํ๋ฐ๋๋ค.
int result = pstat.executeUpdate();
์ ์ฒด ์ฝ๋
private static void m2() {
String name = "์ ์งฑ์";
String age = "2";
String gender = "f";
String address = "๋ก์๋ง์'s";
Connection conn = null;
PreparedStatement pstat = null;
try {
conn = DBUtil.open();
if (!conn.isClosed()) {
String sql = "insert into tblAddress (seq, name, age, gender, address, regdate) values "
+ "(seqAddress.nextVal, ?, ?, ?, ?, default)";
pstat = conn.prepareStatement(sql);
pstat.setString(1, name);
pstat.setString(2, age);
pstat.setString(3, gender);
pstat.setString(4, address);
int result = pstat.executeUpdate();
if (result == 1) {
System.out.println("์ฝ์
์ฑ๊ณต");
} else {
System.out.println("์ฝ์
์คํจ");
}
pstat.close();
conn.close();
} else {
System.out.println("DB ์ ์ ์คํจ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
๐ปCallableStatement
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ ์ ์ฅ ํ๋ก์์ ๋ฅผ ํธ์ถํ๋ค.
- ๊ธฐ๋ฅ์ด ๋ ํฅ์๋ ๊ฐ๋ํ์ด๋ค.
- ํ๋ก์์ ํธ์ถ ์ ์ฉ์ด๋ค.
- ์ธ์๊ฐ๊ณผ ๋ฐํ๊ฐ์ ๊ณ ๋ คํด์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ค์ฏ ๊ฐ์ง๊ฐ ์๋ค.
- 1. ์ธ์๊ฐ๊ณผ ๋ฐํ๊ฐ์ด ์๋ ํ๋ก์์
- 2. ์ธ์๊ฐ์ด ์๊ณ ๋ฐํ๊ฐ์ด ์๋ ํ๋ก์์
- 3. ์ธ์๊ฐ์ด ์๊ณ ๋ฐํ๊ฐ์ด ๋จ๋ ๋ฐํ๊ฐ์ธ ํ๋ก์์
- 4. ์ธ์๊ฐ์ด ์๊ณ ๋ฐํ๊ฐ์ด ๋ค์ค๋ฐํ๊ฐ์ธ ํ๋ก์์
- 5. ์ปค์๋ฅผ ๋ฐํํ๋ ํ๋ก์์
๐ปCallableStatement ์์
1. ์ธ์๊ฐ(X), ๋ฐํ๊ฐ(X) ํ๋ก์์ ํธ์ถ
procM1 ํ๋ก์์ ์์ฑ
์ธ์๊ฐ๊ณผ ๋ฐํ๊ฐ์ด ์๋ ํ๋ก์์ ๋ฅผ ์์ฑํ๋ค. (sql developer๋ฅผ ํตํด ์์ฑํ์๋ค.)
create or replace procedure procM1
is
begin
update tblAddress set age = age +1;
end procM1;
์ ์ฅ ํ๋ก์์ ํธ์ถํ๊ธฐ
{call 'ํ๋ก์์ ๋ช '} ์ผ๋ก ํธ์ถํ๋ค.
String sql = "{ call procM1 }";
CallableStatement ๊ฐ์ฒด ์์ฑ
cstat = conn.prepareCall(sql);
๊ฒฐ๊ณผ๊ฐ ์ ์ฅ
sql๋ฌธ ์คํ์ด ์ ๋๋ก ๋์๋์ง executeUpdate() ๋ฉ์๋๋ก ์ ๋ฐ์ดํธ๋ ํ์ ์๋ฅผ ๋ฐํ๋ฐ๋๋ค.
int result = cstat.executeUpdate();
์ ์ฒด ์ฝ๋
private static void m1() {
Connection conn = null;
CallableStatement cstat = null;
ResultSet rs = null;
try {
conn = DBUtil.open();
String sql = "{ call procM1 }";
cstat = conn.prepareCall(sql);
int result = cstat.executeUpdate();
System.out.println(result);
cstat.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2. ์ธ์๊ฐ(o), ๋ฐํ๊ฐ(X) ํ๋ก์์
procM2 ํ๋ก์์ ์์ฑ
์ธ์๊ฐ์ด ์๊ณ ๋ฐํ๊ฐ์ด ์๋ ํ๋ก์์ ๋ฅผ ์์ฑํ๋ค. (sql developer๋ฅผ ํตํด ์์ฑํ์๋ค.)
create or replace procedure procM2(
pname tblAddress.name%type,
page tblAddress.age%type,
pgender tblAddress.gender%type,
paddress tblAddress.address%type
)
is
begin
insert into tblAddress
values (seqAddress.nextVal, pname, page, pgender, paddress, default);
end procM2;
์ ์ฅ ํ๋ก์์ ๋ฅผ ํธ์ถํ ๋, ๋ฌผ์ํ(?)๋ฅผ ํตํด ์ธ์๊ฐ์ ๋๊ธด๋ค.
private static void m2() {
Connection conn = null;
CallableStatement cstat = null;
ResultSet rs = null;
try {
conn = DBUtil.open();
String sql = "{call procM2(?,?,?,?)}";
cstat = conn.prepareCall(sql);
cstat.setString(1, "๊น์ฒ ์");
cstat.setString(2, "5");
cstat.setString(3, "m");
cstat.setString(4, "๋ก์๋ง์");
int result = cstat.executeUpdate();
System.out.println(result);
cstat.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3. ์ธ์๊ฐ(X), ๋ฐํ๊ฐ(O) ํ๋ก์์
procM3 ํ๋ก์์ ์์ฑ
์ธ์๊ฐ์ด ์๊ณ ๋จ๋ ๋ฐํ๊ฐ์ด ์๋ ํ๋ก์์ ๋ฅผ ์์ฑํ๋ค. (sql developer๋ฅผ ํตํด ์์ฑํ์๋ค.)
create or replace procedure procM3(
pcnt out number
)
is
begin
select count(*) into pcnt from tblAddress;
end procM3;
์ ์ฅ ํ๋ก์์ ํธ์ถ
out ํ๋ง๋ฏธํฐ ํ๋ ๋น ๋ฌผ์ํ(?) ํ๋๋ก ํํํด์ค๋ค.
String sql = "{call procM3(?)}";
out ๋งค๊ฐ๋ณ์ ์ ๊ทผ๋ฒ
์ฒซ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ๊ฒฐ๊ณผ ๋งค๊ฐ ๋ณ์์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ๊ฒฐ๊ณผ ๋งค๊ฐ ๋ณ์์ ๋ฐ์ดํฐ ์ ํ์ ๋ํ๋ธ๋ค.
cstat.registerOutParameter(1, OracleTypes.NUMBER);
๊ฒฐ๊ณผ๊ฐ ์ ์ฅ
์ ์ฅ ํ๋ก์์ ๋ฅผ ์คํํ๊ณ , ์คํ ๊ฒฐ๊ณผ๋ก ์ํฅ์ ๋ฐ์ ํ์ ์๋ฅผ ๋ฐํํ๋ค. ์ด ๊ฒฝ์ฐ ResultSet๋ฅผ ์ฌ์ฉํ์ง์๋๋ค.
cstat.executeUpdate();
out ๋งค๊ฐ๋ณ์ ์ฝ๊ธฐ
int cnt = cstat.getInt(1);
์ ์ฒด ์ฝ๋
private static void m3() {
Connection conn = null;
CallableStatement cstat = null;
ResultSet rs = null;
try {
conn = DBUtil.open();
String sql = "{call procM3(?)}";
cstat = conn.prepareCall(sql);
cstat.registerOutParameter(1, OracleTypes.NUMBER);
cstat.executeUpdate();
//rs.getInt(1); ์ ์ ์ฌํ์ง๋ง rs, cstat๋ ํฌ์ง์
์ด ๋ค๋ฅด๋ค.
int cnt = cstat.getInt(1);
System.out.println(cnt);
cstat.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
4. ์ธ์๊ฐ(X), ๋ฐํ๊ฐ(O) ํ๋ก์์
procM4 ํ๋ก์์ ์์ฑ
์ธ์๊ฐ์ด ์๊ณ ๋ค์ค๋ฐํ๊ฐ์ด ์๋ ํ๋ก์์ ๋ฅผ ์์ฑํ๋ค. (sql developer๋ฅผ ํตํด ์์ฑํ์๋ค.)
create or replace procedure procM4(
pname out varchar2,
page out number,
paddress out varchar2
)
is
begin
select name, age, address into pname, page, paddress from tblAddress where rownum=1;
end procM4;
๋ค์ค์ผ๋ก ๋ฐํํ๋ฏ๋ก out ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ๋ฌ๋ฒ ์ ๊ทผํ๋ค.
private static void m4() {
Connection conn = null;
CallableStatement cstat = null;
ResultSet rs = null;
try {
conn = DBUtil.open();
String sql = "{call procM4(?,?,?)}";
cstat = conn.prepareCall(sql);
cstat.registerOutParameter(1, OracleTypes.VARCHAR);
cstat.registerOutParameter(2, OracleTypes.NUMBER);
cstat.registerOutParameter(3, OracleTypes.VARCHAR);
cstat.executeUpdate();
System.out.println(cstat.getString(1));
System.out.println(cstat.getInt(2));
System.out.println(cstat.getString(3));
cstat.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
5. ์ปค์๋ฅผ ๋ฐํํ๋ ํ๋ก์์
procM5 ํ๋ก์์ ์์ฑ
์ปค์๋ฅผ ๋ฐํํ๋ ํ๋ก์์ ๋ฅผ ์์ฑํ๋ค. (sql developer๋ฅผ ํตํด ์์ฑํ์๋ค.)
create or replace procedure procM5 (
pcursor out SYS_REFCURSOR
)
is
begin
open pcursor
for
select * from tblAddress;
end procM5;
cursor ์ ๊ทผํ๊ธฐ
์๋ฐ์๋ cursor ์๋ฃํ์ด ์์ด object๋ก ๊ฐ์ ธ์จ๋ค.
์ค๋ผํด ์ปค์๋ ๊ฒฐ๊ณผ ํ
์ด๋ธ์ ํ์ํ๋ ์ฐธ์กฐ ๊ฐ์ฒด์ธ๋ฐ ResultSet ๋ํ ๊ฒฐ๊ณผ ํ
์ด๋ธ์ ํ์ํ๋ ์ฐธ์กฐ ๊ฐ์ฒด์ด๋ฏ๋ก ์ค๋ผํด ์ปค์์ ResultSet๊ณผ ๋์ผํ ๊ตฌ์กฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
private static void m5() {
Connection conn = null;
CallableStatement cstat = null;
ResultSet rs = null;
try {
conn = DBUtil.open();
String sql = "{call procM5(?)}";
cstat = conn.prepareCall(sql);
cstat.registerOutParameter(1, OracleTypes.CURSOR);
cstat.executeQuery();
rs = (ResultSet)cstat.getObject(1);
while(rs.next()) {
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
System.out.println(rs.getString("address"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
'JDBC(Oracle)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JDBC] Auth(์ธ์ฆ ๋ฐ ํ๊ฐ) ๋ก๊ทธ์ธ ๊ตฌํ (0) | 2023.10.23 |
---|---|
[JDBC] SQL ์คํ ๋ด๋น : Statement ๊ฐ์ฒด (0) | 2023.10.20 |
[JDBC] JDBC ๋ฆฌํฉํ ๋ง (0) | 2023.10.20 |
[JDBC] JDBC ๊ธฐ์ด, ์ดํด๋ฆฝ์ค์ ์ฐ๊ฒฐํ๊ธฐ (0) | 2023.10.19 |