[Java] DB ์ฐ๋
๐ ๋ค์ด๊ฐ๋ฉฐ
์ด๋ฒ ๊ธ์์๋ Oracle/MySQL๋ก ์์ ํ๋ ๊ฒ์ ์๋ฐ์ ์ฐ๋(JDBC)ํด, ์๋ฐ์์ DB์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ(insert)ํ๊ณ ์กฐํ(select)ํ๋ค.
JDBC(Java Database Connectivity)๋? ์๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๋ํ๋ ๊ธฐ์ .
java.sqlํจํค์ง์์ ์ง์ํ๋ค.
DB ์ฐ๋์ ํญ์ 4๋จ๊ณ๋ฅผ ๋ฐ๋ฅธ๋ค.
flowchart LR
A["โ ๋๋ผ์ด๋ฒ ๋ก๋<br>Class.forName(...)"] --> B["โก ์ ์<br>DriverManager.getConnection"]
B --> C["โข ์ฟผ๋ฆฌ ์คํ<br>PreparedStatement"]
C --> D["โฃ DB ํด์ <br>close()"]
style B fill:#F80000,color:#fff
style C fill:#326CE5,color:#fff
1. INSERT โ ์๋ฐ์์ DB์ ์ถ๊ฐ
GUI(Swing)๋ก ์ฑ
์ด๋ฆยท๊ฐ๊ฒฉ์ ์
๋ ฅ๋ฐ์ Oracle์ book ํ
์ด๋ธ์ ๋ฃ๋๋ค. (์ฝ๋๊ฐ ๊ธธ์ด ๋ณด์ด์ง๋ง ๋๋ถ๋ถ Frame ๋์์ธ์ด๊ณ , ํต์ฌ์ connect()์ insert()๋ค.)
โ ์ ์ โ connect()
1
2
3
4
5
6
7
8
9
10
11
public void connect() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); // โ ๋๋ผ์ด๋ฒ ๋ก๋
con = DriverManager.getConnection( // โก ์ ์
"jdbc:oracle:thin:@localhost:1521:XE", "batman", "1234");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(this, "๋๋ผ์ด๋ฒ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.");
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "SQL์ ์ ์ํ ์ ์์ต๋๋ค.");
}
}
์ ์ URL์ ๋ฏ์ด๋ณด๋ฉด ์ด๋ ๋ค.
| ๋ถ๋ถ | ๊ฐ | ์๋ฏธ |
|---|---|---|
| ํ๋กํ ์ฝ | jdbc:oracle:thin | Oracle thin ๋๋ผ์ด๋ฒ |
| ํธ์คํธ | @localhost | ๋ด ์ปดํจํฐ |
| ํฌํธ | 1521 | Oracle ๊ธฐ๋ณธ ํฌํธ |
| SID | XE | Oracle XE ๋ฒ์ |
| ย | "batman", "1234" | ๊ณ์ / ๋น๋ฐ๋ฒํธ |
๐ก
Class.forName(...)์ ํ๋ก์ ํธ์ ์ค์นํ ๋๋ผ์ด๋ฒ(javaโDB ๋ค๋ฆฌ)๋ฅผ ๋ก๋ํ๋ค.DriverManager.getConnection์ ์ ์ ํConnection๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฏ๋ก, ๋ฉค๋ฒ๋ณ์con์ ๋ด๋๋ค.con์ ๊ฐ์ด ์ ๋ค์ด๊ฐ์ผ๋ฉด ์ ์ ์ฑ๊ณต์ด๋ค.
โก ์ฝ์ โ insert()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void insert() {
String name_value = book_name.getText();
int price_value = Integer.parseInt(price.getText()); // String โ int
String sql = "insert into book(book_id, book_name, price) " +
"values(seq_book.nextval, '" + name_value + "', " + price_value + ")";
PreparedStatement pstmt = null;
try {
if (con != null) {
pstmt = con.prepareStatement(sql); // ์ฟผ๋ฆฌ ์ค๋น
int result = pstmt.executeUpdate(); // DML ์คํ (insert/update/delete)
if (result > 0) JOptionPane.showMessageDialog(this, "๋ฑ๋ก ์ฑ๊ณต");
else JOptionPane.showMessageDialog(this, "๋ฑ๋ก ์คํจ");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
}
}
| ์์ | ์ญํ |
|---|---|
PreparedStatement | ์ฟผ๋ฆฌ๋ฌธ์ ์ํํ๋ ์ธํฐํ์ด์ค |
executeUpdate() | DML(insert/update/delete) ์คํ, ์ํฅ๋ฐ์ ํ ์๋ฅผ ๋ฐํ |
๐ก
executeUpdate()๋ ์ ์์ด๋ฉด ์ฒ๋ฆฌ๋ ํ ์(>0), ์๋ฌ๋ฉด 0์ ๋ฐํํ๋ค. ๊ทธ๋์if(result > 0)์ผ๋ก ์ฑ๊ณต/์คํจ๋ฅผ ๊ตฌ๋ถํ๋ค.
์ข ๋ฃ ์ ์์ ํด์
1
2
3
4
5
6
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try { con.close(); } catch (SQLException e1) {} // DB ์์ ํด์
System.exit(0);
}
});
โ ๏ธ ๋ณดํต์
setDefaultCloseOperation(EXIT_ON_CLOSE)์ ์ฐ์ง๋ง, ์ฌ๊ธฐ์๋ WindowListener๋ฅผ ์ต๋ช ํด๋์ค๋ก ๋ง๋ค์๋ค. ํ๋ก๊ทธ๋จ ์ข ๋ฃ๋ฟ ์๋๋ผ ์ ์ํด๋ DB ์์์ ์ง์ ํด์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
2. SELECT โ DB์์ ์๋ฐ๋ก ์กฐํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user, pass);
String sql = "select * from book";
PreparedStatement pstmt = con.prepareStatement(
sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = pstmt.executeQuery(); // select ์คํ โ ๊ฒฐ๊ณผ ํ๋ฅผ ์๋ฐ ๋ฉ๋ชจ๋ฆฌ๋ก
rs.next(); rs.next(); // ์ปค์๋ฅผ 2๋ฒ์งธ ํ์ผ๋ก
System.out.println(rs.getInt("book_id"));
System.out.println(rs.getString("book_name"));
rs.previous(); // ์ด์ ํ์ผ๋ก
rs.beforeFirst(); // ์ปค์ ์์๋ณต๊ท (0๋ฒ์งธ)
while (rs.next()) { // ์ฒ์๋ถํฐ ๋๊น์ง ์ํ
System.out.println(rs.getInt("book_id"));
}
INSERT์ ๋ฌ๋ผ์ง๋ ์ ์ ์ ๋ฆฌํ๋ฉด ์ด๋ ๋ค.
| ํญ๋ชฉ | INSERT | SELECT |
|---|---|---|
| ์คํ ๋ฉ์๋ | executeUpdate() | executeQuery() |
| ๋ฐํํ | int(ํ ์) | ResultSet(๊ฒฐ๊ณผ ํ) |
| ์ต์ | ์์ | TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY |
๐ก
prepareStatement์ ๋ ์ต์ :TYPE_SCROLL_INSENSITIVE๋ ์ปค์๋ฅผ ์์๋๋ก ์์ ๋กญ๊ฒ ์์ง์ด๊ฒ ํ๊ณ ,CONCUR_READ_ONLY๋ ์๋ฐ์ ์กฐํ๊ฐ ์ค์ ์๋ฒ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง๋ ๋ค. (๊ธฐ๋ณธ๊ฐ์ ์ ๋ฐฉํฅ ์ ์ฉ์ด๋ผprevious()๊ฐ ์๋ฌ๋๋ค.)
ResultSet์ ์ปค์๋ฅผ ์ดํดํ๋ ๊ฒ ํต์ฌ์ด๋ค.
| ๋ฉ์๋ | ๋์ |
|---|---|
next() | ์ปค์๋ฅผ ํ ์นธ ์์ผ๋ก (๋ ์ฝ๋ ์์ผ๋ฉด true) |
previous() | ํ ์นธ ๋ค๋ก |
beforeFirst() | 0๋ฒ์งธ ํ(๋งจ ์)์ผ๋ก ๋ณต๊ท |
getInt/getString("์ปฌ๋ผ") | ํ์ฌ ํ์ ์ปฌ๋ผ ๊ฐ |
๐ก
ResultSet์ ์ด๊ธฐ ์ปค์ ์์น๋ 0๋ฒ์งธ ํ(์ฒซ ํ์ด ์๋)์ด๋ค. ๊ทธ๋์next()๋ฅผ ํ ๋ฒ ํด์ผ ์ฒซ ํ์ ๋ง๋๋ค.while(rs.next())๋ ๋ค์ ๋ ์ฝ๋๊ฐ ์์ ๋๊น์ง(false) ์ํํ๋ฏ๋ก ์ ์ฒด ์กฐํ์ ๋ฑ ๋ง๋๋ค.
๐ ์ ๋ฆฌ
1
2
3
4
5
6
JDBC DB ์ฐ๋ (java.sql)
โโ 4๋จ๊ณ ๋๋ผ์ด๋ฒ ๋ก๋ โ ์ ์ โ ์ฟผ๋ฆฌ ์คํ โ ํด์
โโ INSERT PreparedStatement + executeUpdate() (ํ ์ ๋ฐํ)
โโ SELECT executeQuery() โ ResultSet (์ปค์๋ก ์ํ)
โโ ์ปค์ ์ด๊ธฐ 0๋ฒ์งธ, next()/previous()/beforeFirst()
โโ ์์ finally / windowClosing์์ close() ํ์
| ๊ฐ๋ | ํ ์ค ์ ์ |
|---|---|
| JDBC | ์๋ฐ๋ก DB๋ฅผ ์ฐ๋ํ๋ ๊ธฐ์ |
| Connection | DB์์ ์ฐ๊ฒฐ ๊ฐ์ฒด |
| executeUpdate / executeQuery | DML ์คํ / SELECT ์คํ |
| ResultSet | ์กฐํ ๊ฒฐ๊ณผ ํ(์ปค์๋ก ์ ๊ทผ) |
์๋ฐ์์ DB๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ๊ฒฐ๊ตญ โ๋๋ผ์ด๋ฒ ๋ก๋ โ ์ ์ โ ์ฟผ๋ฆฌ โ ํด์ โ 4๋จ๊ณ๋ค. INSERT๋ executeUpdate(ํ ์), SELECT๋ executeQuery(ResultSet)๋ผ๋ ์ฐจ์ด, ๊ทธ๋ฆฌ๊ณ ResultSet ์ปค์๊ฐ 0๋ฒ์งธ์์ ์์ํ๋ค๋ ์ ๋ง ์ก์ผ๋ฉด ์ดํ ํ ๊ตฌํ๋ ์ด๋ ต์ง ์๋ค.




Comments powered by Disqus.