(30) [JDBC] 1์ผ์ฐจ : JDBC(Java Data Connectivity)
JDBC๋?
์๋ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ์ ๊ณตํ๋ API
- ์๋ฐ๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์
- SQL ๋ฌธ์ฅ ์คํ
- SQL ์คํ ๊ฒฐ๊ณผ ์ป์ด์ง ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด ๋ฐ ์คํ ๊ฒฐ๊ณผ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ๋ฑ
JDBC ๋๋ผ์ด๋ฒ
JDBC API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ ๊ณต
JDBC ๋๋ผ์ด๋ฒ ํ์
TYPE4 : Native-Protocol Java Driver(๋ค์ดํฐ๋ธ-ํ๋กํ ์ฝ ์์ ์๋ฐ ๋๋ผ์ด๋ฒ)
:์์ ์๋ฐ์ด๋ฉฐ ํน์ ๋ฐ์ดํฐ ์์ค์ ๋ํ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๋๋ผ์ด๋ฒ๋ก ํด๋ผ์ด์ธํธ๋ ๋ฐ์ดํฐ ์์ค์ ์ง์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์
1,2,3์ ํ์ฌ ์ ์ฌ์ฉํ์ง ์๋๋ค.
JAVA์ ์ค๋ผํด ์ฐ๋
- Oracle Database Express Edition ๋ค์ด๋ก๋
- Oracle Database 21c/18c Express Edition
https://www.oracle.com/database/technologies/xe-downloads.html
https://www.oracle.com/database/technologies/xe18c-downloads.html
- Oracle SQL Developer ๋ค์ด๋ก๋ - ํด
https://www.oracle.com/tools/downloads/sqldev-downloads.html
Oracle SQL Developer Downloads
This archive. will work on a 32 or 64 bit Windows OS. The bit level of the JDK you install will determine if it runs as a 32 or 64 bit application. This download does not include the required Oracle Java JDK. You will need to install it if it's not already
www.oracle.com
- ์๋ฐ์์ ์ค๋ผํด ์ ์ํ๊ธฐ ์ํด ํ์ํ ์ฌํญ
1) ์ค๋ผํด์ด ์ค์น๋ ํธ์คํธ ์ฃผ์
2) ์ฌ์ฉ์๋ช ๋ฐ ํจ์ค์๋
3) SID : XE
4) ์ค๋ผํด ํฌํธ ๋ฒํธ : 1521
5) ์ค๋ผํด ์ฌ์ดํธ์ ์ ๊ณตํ๋ ojdbc ๋ผ์ด๋ธ๋ฌ๋ฆฌ 18C : ojdbc8.jar
- ์ค๋ผํด
-- ๊ณ์ ์ญ์
DROP USER ๊ณ์ ๋ช
CASCADE;
-- ๊ณ์ ์ถ๊ฐ
GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO ๊ณ์ ๋ช
IDENTIFIED BY "ํจ์ค์๋";
-- ๊ณ์ ์ DEFAULT ํ
์ด๋ธ์คํ์ด์ค๋ฅผ USERS๋ก ๋ณ๊ฒฝ
ALTER USER ๊ณ์ ๋ช
DEFAULT TABLESPACE USERS;
-- ๊ณ์ ์ TEMPORARY ํ
์ด๋ธ์คํ์ด์ค๋ฅผ TEMP ๋ก ๋ณ๊ฒฝ
ALTER USER ๊ณ์ ๋ช
TEMPORARY TABLESPACE TEMP;
- ๋ฐฉํ๋ฒฝ ์ค์ ์ธ๋ฐ์ด๋ - ํ์ฉ๊ท์น ์์ฑ
- ์ ์ดํ - ์์คํ ๋ฐ ๋ณด์ - Windows Defender ๋ฐฉํ๋ฒฝ ์ข์ธกํ๋ฉด - ๊ณ ๊ธ์ค์
์ข์ธกํ๋ฉด - "์ธ๋ฐ์ด๋ ๊ท์น" ํด๋ฆญ ์ฐ์ธกํ๋ฉด - "์ ๊ท์น" ํด๋ฆญ "ํฌํธ" ์ ํ - [๋ค์] ๊ท์น - TCP ์ ํ
ํน์ ๋ก์ปฌ ํฌํธ : ํฌํธ๋ฒํธ - [๋ค์] ์ฐ๊ฒฐํ์ฉ - [๋ค์] - ํ๋กํ ๋ชจ๋ ์ ํ - [๋ค์] ์ด๋ฆ : ์ค๋ผํด ์ ๋ ฅ - [๋ง์นจ] - ํฌํธ๋ฒํธ์ SID ํ์ธ : C:\app\user\product\21c\homes\OraDB21Home1\network\admin (๋ค๋ฅผ์ ์์) , tnsnames ํ์ผ์์ SID์ ํฌํธ ๋ฒํธ ํ์ธ ๊ฐ๋ฅ
- pom.xml์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ https://mvnrepository.com/
- ํ๋ก์ ํธ ์์ฑ
1) Maven Project ์์ฑ
- [File] - [New] - [Maven Project]
Create a simple project ์ ํ - [Next]
- New Maven Project ์ฐฝ
Group ID : com.user
Artifact ID : jdbcEx -> ์ํฐํฉํธ๋ ํ๋ก์ ํธ๋ช ์ด๋จ
[Finish]
2) JDK ๋ฒ์ ๋ณ๊ฒฝ : ํ๋ก์ ํธ - ๋ง์ฐ์ค์ฐ์ธก - Properties
(1) ํ๋ก์ ํธ - ๋ง์ฐ์ค์ฐ์ธก - Properties
Project Facets : Java ๋ฒ์ ์ 17๋ก ๋ณ๊ฒฝ
(2) [์ฃผ์] Project Facets ์์ ์๋ฐ ๋ฒ์ ์ ๋ณ๊ฒฝํด์ผ ํ๋ฉฐ, ์ด๋ฏธ 17๋ก ์ค์ ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ๋ณ๊ฒฝ ํ ๋ค์ ๋ณ๊ฒฝํ๋ค.
JDBC ์์ธ์ฒ๋ฆฌ
โถ java.sql.SQLException ํด๋์ค
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค ์๋ฌ ๋ฐ ๊ทธ์ธ์ ์๋ฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์์ธ
์์ธ์ฌํญ์ด ๋ฐ์ํ๋ฉด getMessage() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์์ธ์ฌํญ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
ava.sql.SQLException ํ์ ํด๋์ค
- java.sql.SQLIntegrityConstraintViolationException
๋ฌด๊ฒจ์ค(๊ธฐ๋ณธํค,์ฐธ์กฐํค ๋ฑ) ์ ์ฝ์กฐ๊ฑด์ ์๋ฐํ๋ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ์์ธ
- SQLDataException
๋ฐ์ดํฐ ๋ณํ์ค๋ฅ, 0์ผ๋ก ๋๋๊ฑฐ๋ ํจ์์ ์ ํจํ์ง ์๋ ์ธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฑ์์ ๋ฐ์ํ๋ ์์ธ
DriverManager
DriverManager๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ํด๋์ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ์ ํํ๊ณ ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์์ฑํ๋ ๊ธฐ๋ฅ์ ํ๋ค.
Connection
ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DBMS) ์์ ์ฐ๊ฒฐ(session) ์ ๋ํ๋ด๋ ๊ฐ์ฒด
Connection ๊ฐ์ฒด๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ Statement,PreparedStatement๋ฑ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฑฐ๋ COMMIT,ROLLBACK๋ฑ์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
์ค๋ผํด ์ฐ๋ DBConn ํด๋์ค ๋ง๋ค๊ธฐ
import java.sql.Connection;
import java.sql.DriverManager;
// Singleton pattern
public class DBConn {
private static Connection conn;
private DBConn() {
}
public static Connection getConnection() {
// String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; // 11g ๋ฐฉ์
String url = "jdbc:oracle:thin:@//127.0.0.1:1521/xe"; // 12c ์ด์
// 1521:์ค๋ผํดํฌํธ๋ฒํธ, xe:SID
String user = "์ฌ์ฉ์๋ช
";
String pwd = "ํจ์ค์๋";
if(conn == null) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); // ์๋ฐ 6๋ถํฐ๋ ์๋ต๊ฐ๋ฅ. ์๋ ๋ก๋ฉ
conn = DriverManager.getConnection(url, user, pwd);
} catch (Exception e) {
e.printStackTrace();
}
}
return conn;
}
public static void close() {
if(conn != null) {
try {
if(! conn.isClosed()) {
conn.close();
}
} catch (Exception e) {
}
}
conn = null;
}
}
Statement
์ ์ ์ธ SQL๋ฌธ์ ์คํํ์ฌ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ฃผ๋ ๊ฐ์ฒด. Statement ๊ฐ์ฒด๋ Connection์ createStatement() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ป๋๋ค. SQL Ingection(SQL์ฃผ์ ) ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ ๋๋ก ์ฌ์ฉํด์๋ ์๋๋ค.
package db.item2;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
/*
* -Statement ์ธํฐํ์ด์ค
* : ์ ์ ์ธ SQL๋ฌธ์ ์คํํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค
* : Connention์ createStatement() ๋ฉ์๋ค ๋ฆฌ์ฉํ์ฌ ๊ฐ์ฒด ๋ฐํ
* : SQL Injection(SQL์ฃผ์
) ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๋ฏ๋ก ์ ๋ ์ฌ์ฉํ๋ฉด ์๋๋ค.
* : executeUpdate(์ฟผ๋ฆฌ) ๋ฉ์๋
* : INSERT,UPDATE,DELETE,CREATE,ALTER,DROP ๋ฑ์ ์คํ
* : executeQuery(์ฟผ๋ฆฌ) ๋ฉ์๋
* : SELECT๋ฌธ ์คํ
* : SELECT ์คํ ๊ฒฐ๊ณผ๋ ResultSet ๊ฐ์ฒด๋ก ๋ฐํ
*/
import com.util.DBConn;
public class EX01_Statement {
public static void main(String[] args) {
Connection conn=DBConn.getConnection();
Statement stmt=null;
String sql;
int result;
try {
//๋๋ฒ ์คํํ๋ฉด ๋๋ฒ์งธ์ ORA-00001 ์๋ฌ ๋ฐ์ : ๊ธฐ๋ณธํค ์ค๋ณต
//์๋ฐ์์ DML๋ฌธ์ ์คํํ๋ฉด ๊ธฐ๋ณธ์ด COMMIT๋จ
// your eclipse's rainbow color of code is great minji park;
sql = "INSERT INTO score(hak,name,birth,kor,eng,mat)VALUES('1002','๊น์๋ฐ','2003-10-10',90,80,100)";
stmt=conn.createStatement();
//executeUpdate(์ฟผ๋ฆฌ) : SELECT ๋ฌธ์ ์ ์ธํ ์ฟผ๋ฆฌ ์คํ
result = stmt.executeUpdate(sql);
//DML(INSERT,UPDATE,DELETE)๋ ์ฟผ๋ฆฌ์ ์ํฅ ๋ฐ์ ํ์ ๋ฐํ
System.out.println(result+"ํ์ด ์ถ๊ฐ ๋์์ต๋๋ค.");
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
stmt.close();
} catch (Exception e2) {
}
}
DBConn.close();
}
}
package db.item2;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import com.util.DBConn;
public class Ex02_Statement {
public static void main(String[] args) {
Connection conn = DBConn.getConnection();
Statement stmt = null;
ResultSet rs = null;
String sql;
try {
//์ฟผ๋ฆฌ ๋ง์ง๋ง์ ;์ด ์์ผ๋ฉด ORA-00933์๋ฌ ๋ฐ์
sql ="SELECT hak hno,name,birth,kor,eng,mat,kor+eng+mat,(kor+eng+mat)/3 FROM score";
// "//WHERE hak = '1001'";
stmt =conn.createStatement();
rs=stmt.executeQuery(sql);
//NUMBER,DATE๋ ๋ฌธ์์ด๋ก ๋ฐํ ๋ฐ์์ ์๋ค.
while(rs.next()) {
System.out.print(rs.getString("hno")+"\t");
System.out.print(rs.getString("name")+"\t");
//System.out.print(rs.getString("birth")+"\t");
//๋ ์ง๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํ ๋ฐ์ผ๋ฉด YYYY-MM-DD HH24:MI:SS๋ก ๋ฐํ
Date birth=rs.getDate("birth");
//java.sql.Date : ๋ ์ง ํ์์ YYYY-MM-DD
System.out.print(birth.toString()+"\t");
System.out.print(rs.getInt("kor")+"\t");
System.out.print(rs.getInt("eng")+"\t");
System.out.print(rs.getInt("mat")+"\t");
System.out.print(rs.getInt(7)+"\t");
// ์ธ๋ฑ์ค๋ก ์ปฌ๋ผ์ ๊ฐ ๋ฐํ ์ธ๋ฑ์ค๋ 1๋ถํฐ ์์
System.out.print(rs.getInt(8)+"\n");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if (stmt != null) {
try {
stmt.close();
} catch (Exception e2) {
}
}
}
}
}
Ingection
package db.item2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.util.DBConn;
public class Ex03_Ingection {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String sql;
String hak,name,birth;
int kor,eng,mat;
Connection conn=DBConn.getConnection();
Statement stmt=null;
ResultSet rs = null;
try {
stmt=conn.createStatement();
System.out.print("๊ฒ์ํ ํ๋ฒ?");
hak = br.readLine();
//1' or name IS NOT NULL OR name= '2
// ์ด๋ฐ์์ผ๋ก ํ๋ฒ์ ์
๋ ฅํ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ
// -> SQL Ingection(SQL์ฃผ์
)
//๋ฐ๋ผ์ Statement๋ ์ ๋๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค
sql="SELECT hak,name,birth,kor,eng,mat FROM score WHERE hak ='"+hak+"'";
rs = stmt.executeQuery(sql);
while(rs.next()) {
hak=rs.getString("hak");
name=rs.getString("name");
birth=rs.getString("birth");
kor=rs.getInt("kor");
eng=rs.getInt("eng");
mat=rs.getInt("mat");
System.out.print(rs.getString("hak")+"\t");
System.out.print(rs.getString("name")+"\t");
System.out.print(rs.getString("birth")+"\t");
System.out.print(rs.getInt("kor")+"\t");
System.out.print(rs.getInt("eng")+"\t");
System.out.print(rs.getInt("mat")+"\t");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (Exception e2) {
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (Exception e) {
}
}
}
}
}