[Java] DB(MYSQL/Oracle) 연동하기

programmeaow·2022년 6월 8일
0

Java

목록 보기
8/13

📝 MYSQL Connector를 통해 Java와 MYSQL/Oracle을 연결하기

프린터기를 사용하려면 pc에 해당 드라이버를 설치해야 하는 것처럼, DB를 Java와 연동하려면 드라이버를 먼저 설치해줘야 한다.

  1. MYSQL Connector를 다운받는다. [ MySQL Community Downloads ]
    ( Platform Independent를 선택하여 다운로드 받았다! )
  2. 다운 받은 파일을 압축 해제 한다.
    : 압축 해제시 볼 수 있는 mysql-connector-java-8.0.29.jar 가 드라이버다.
  3. 이클립스에서 드라이버로 연동한다.
    2 - 1. Java Project 우클릭 > Bulid path > Configure bulid path 로 들어간다.
    2 - 2. 좌측 메뉴에서 Java Build Path > Class path 선택 > Add Library > User Library 선택
    2 - 3. User Libraries > New External JARS.. 에서 방금 다운로드 받은 파일 중 JAR 파일을 선택한 뒤 저장한다.

드라이버 적용 후 실제 코드로 해당 DB를 연결시켜줘야 한다.

try { 
	Class.forName("com.mysql.jdbc.Driver");
    
	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/database이름", "ID","PW");
	Statement stmt = conn.createStatement();
    resultSet rset = stmt.executeQuery("실행할 쿼리 문장");
    
    } catch (ClassNotFoundException e) { 
    	e.printStackTrace();
        
	try {       
		rs.close();
		stmt.close();
		conn.close();
	
		} catch (SQLException e) {
		e.printStackTrace();
	}

이것이 기본 연동 코드이다. 위의 연동 코드에 대해 조금 알아보자.

Class.forName("com.mysql.jdbc.Driver") : 드라이버 불러오기
DriverManager.getConnection("jdbc:mysql://localhost...", "ID","PW") : DB와 연결
Statement stmt = conn.createStatement() : DB 문법에 맞춰서 쿼리 작성 가능하게 하는 기능
resultSet rset = stmt.executeQuery("실행할 쿼리 문장") : JAVA에서 쿼리 문장을 작성하여 DB를 조작할 수 있게 해주는 기능

✅ SQL 문장 실행시, table 정보를 출력하려면 next , get 은 필수이다.

열 마다 데이터가 있는지 확인하고(next) 데이터가 있으면 행마다 정보를 가져오는(get) 구조이기 때문이다.

따라서 데이터를 전부 읽기 위해 반복문을 사용한다.

ex) emp table의 사원번호(empno) 가져오기
while (rset.next()) {
	System.out.println(rset.getInt("empno"));
}

반복문으로 rset.next() 를 실행하고 가져올 행의 데이터가 문자열이면 String , 정수면 Int 를 사용하여 get 으로 데이터를 가져온다.
empno는 정수 타입의 데이터가 저장되어 있기 때문에 getInt 를 사용하였다.

✅ 쿼리 문장 작성법

출력 등의 쿼리 문장 작성시 : stmt.executeQuery() ( Read )
DB를 업데이트 시켜 데이터 변경시 : stmt.executeUpdate() ( Insert / Update / Delete )


( 아래는 수업자료 참고 )

같이 보면 좋은 링크 : JDBC execute, executeQuery, executeUpdate 메서드 특징

  • 미리 정해진 sql문장 없이 sql문장 실행 객체 생성
Statement createStatement(){}
  	ResultSet executeQuery(String select){}
  	int executeUpdate(String dml){}
  • 미리 지정해둔 sql문장으로 sql 실행 객체 생성
PreparedStatement prepareStatement(String sql){}
 	ResultSet executeQuery(){}
  	int executeUpdate(){}



먼저 드라이버를 불러온 뒤 연결 객체를 생성하여 ID와 PW로 DB와 연결하기부터 해보자.
try {
	Class.forName("com.mysql.cj.jdbc.Driver");
		
    Connection con = DriverManager.getConnection("URL", "ID", "PW");
	} catch (Exception e) {
		e.printStackTrace();
	}

내 DB와 root 계정과 연결시키면 이렇게 코드를 작성할 수 있다.

public static void mysql(String[] args) {
	try {
		Class.forName("com.mysql.cj.jdbc.Driver");

		String url = "jdbc:mysql://localhost/playdata?characterEncoding=UTF-8&serverTimezone=UTC";
		Connection con = DriverManager.getConnection(url, "root", "playdata");

		System.out.println(con); //정상 접속 확인

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

이번에는 Oracle과 연동을 해보자. 기본 코드는 MYSQL을 연동시킬 때와 크게 다르지 않다.

try {
	Class.forName("oracle.jdbc.driver.OracleDriver");
	String url = "jdbc:oracle:thin:@localhost:1521:xe";
	Connection con = DriverManager.getConnection(url, "ID", "PW");

	} catch (Exception e) {
		e.printStackTrace();
	}

내 DB의 SCOTT 계정에 연결해보았다.

public static void oracle(String[] args) {
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");

		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		Connection con = DriverManager.getConnection(url, "SCOTT", "TIGER");

		System.out.println(con); //접속 정상 확인용

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

System.out.println 문장으로 출력된 값을 통해 DB와 성공적으로 연결된 것을 확인할 수 있다.




📝 연동 후 Java에서 MYSQL 문장 실행하기

MYSQL에 있는 DEPT table의 정보를 출력해보자.
먼저 main 메서드에 DB를 연동하는 코드부터 작성해야한다.

public static void main(String[] args) {
		//driver 불러오기
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
            
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
            
			System.out.println("해당 MYSQL DB의 driver가 없습니다.");
		}

Class.forName 만 작성해서 드라이버를 불러오려 하면 에러가 뜨는데, 드라이버가 존재하지 않는 경우가 발생할 수 있기 때문이다.
따라서 try ~ catch 를 사용하여 예외처리를 해주어야 한다.

그 다음으로는 접속 객체와 문장을 실행할 객체를 생성해줘야 한다.

//접속 객체 생성
String url = "jdbc:mysql://localhost/playdata?characterEncoding=UTF-8&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "root", "playdata");

//문장 실행 객체 생성
Statement stmt = conn.createStatement();

URL이 너무 길어서 객체를 따로 생성하여 그 안에 넣어주었다. (불필요한 객체 생성이기 때문에 하지 않는 것이 좋다!)

이제 SQL 문장 실행 객체를 생성하고, 실행할 문장을 입력하면 된다.
나는 SELECT * FROM DEPT 문장을 실행할 것이다.

ResultSet rset = stmt.executeQuery("select * from dept");

while (rset.next()) {
	System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
}

DB에 접속이 되면 해당 문장이 실행된다.
하지만, DB에 접속이 되지 않는 경우 또한 발생할 수 있기 때문에 try ~ catch 를 사용하여 예외처리를 해주어야 한다.

생성한 접속 객체와 문장 실행 객체 등을 try문 밖에서 선언하고 예외처리를 함께 해주었다.

String url = "jdbc:mysql://localhost/playdata?characterEncoding=UTF-8&serverTimezone=UTC";
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;

	try {
			conn = DriverManager.getConnection(url, "root", "playdata");
			stmt = conn.createStatement();
			rset = stmt.executeQuery("select * from dept");

		while (rset.next()) {
			System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
		}
        
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("DB 접속시 문제가 발생하였습니다.");
		}

실행시 DEPT table의 데이터가 출력되는 것을 볼 수 있다.

DB 연동 후 SQL 문장 실행 후에는 꼭 생성한 객체를 close 로 자원 반환을 해주어야한다.

📌자원 반환 순서는 매우 중요! 📌

finally를 사용하여 자원을 모두 close로 반환 해주어야 한다.
close 사용시 try ~ catch를 사용해야 하므로, if 문으로 선언한 뒤 전부 try 문 안에 넣어 한번에 예외처리를 해주었다.

finally {
		try { 
			if (rset != null) {
				rset.close();
				rset = null;
			}
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
		} catch (SQLException e) {
			System.out.println("자원 반환에 실패하였습니다.");
		}

전체 코드

public static void main(String[] args) {
	try {
		Class.forName("com.mysql.cj.jdbc.Driver");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
		System.out.println("해당 MYSQL DB의 driver가 없습니다.");
	}

	String url = "jdbc:mysql://localhost/playdata?characterEncoding=UTF-8&serverTimezone=UTC";
	Connection conn = null;
	Statement stmt = null;
	ResultSet rset = null;

	try {
		conn = DriverManager.getConnection(url, "root", "playdata");
		stmt = conn.createStatement();
		rset = stmt.executeQuery("select * from dept");

		while (rset.next()) {
			System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
		}

	} catch (SQLException e) {
		e.printStackTrace();
		System.out.println("DB 접속 문제 발생");
            
	} finally {
		try { 
			if (rset != null) {
				rset.close();
				rset = null;
			}
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
		} catch (SQLException e) {
			System.out.println("자원 반환 실패");
		}
	}
}
profile
개발이란 뭘까

0개의 댓글