๐Ÿ’ป/JDBC

(30) [JDBC] 1์ผ์ฐจ : JDBC(Java Data Connectivity)

๋”ฐ๊ถˆ 2024. 4. 2. 08:31
JDBC๋ž€?
์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” API
- ์ž๋ฐ”๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†
- SQL ๋ฌธ์žฅ ์‹คํ–‰
- SQL ์‹คํ–‰ ๊ฒฐ๊ณผ ์–ป์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด ๋ฐ ์‹คํ–‰ ๊ฒฐ๊ณผ์˜ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ 

 

JDBC ๋“œ๋ผ์ด๋ฒ„

JDBC API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์ œ๊ณต

JDBC ๋“œ๋ผ์ด๋ฒ„ ํƒ€์ž…

TYPE4 : Native-Protocol Java Driver(๋„ค์ดํ‹ฐ๋ธŒ-ํ”„๋กœํ† ์ฝœ ์ˆœ์ˆ˜ ์ž๋ฐ” ๋“œ๋ผ์ด๋ฒ„)

:์ˆœ์ˆ˜ ์ž๋ฐ”์ด๋ฉฐ ํŠน์ • ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๋Œ€ํ•œ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋กœ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹ 

1,2,3์€ ํ˜„์žฌ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

JAVA์™€ ์˜ค๋ผํด ์—ฐ๋™

 

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) {
				
			}
		}

	}
	}
}