프린터기를 사용하려면 pc에 해당 드라이버를 설치해야 하는 것처럼, DB를 Java와 연동하려면 드라이버를 먼저 설치해줘야 한다.
mysql-connector-java-8.0.29.jar
가 드라이버다. Java Project
우클릭 > Bulid path
> Configure bulid path
로 들어간다.Java Build Path
> Class path
선택 > Add Library
> User Library
선택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를 조작할 수 있게 해주는 기능
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 메서드 특징
Statement createStatement(){}
ResultSet executeQuery(String select){}
int executeUpdate(String dml){}
PreparedStatement prepareStatement(String sql){}
ResultSet executeQuery(){}
int executeUpdate(){}
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와 성공적으로 연결된 것을 확인할 수 있다.
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("자원 반환 실패");
}
}
}