[Java] DB와 연동하기
JAVA 에서 DB와 연동하기 위해서는 JDBC(Java Database Connectivity) 라이브러리를 개발환경에 맞게 추가해줘야한다. JDBC란 자바에서 DB 소프트웨어와 연결하여 프로그램을 개발하기 위해 사용하는 API로 JDBC Driver는 https://dev.mysql.com/downloads/connector/j/ 에서 다운로드 받으면 된다.
이클립스에서 JDBC 드라이버를 추가하는 방법으로는
먼저, 라이브러리가 준비 되어있다면, 프로젝트 파일에서 마우스 우클릭하고 Build Path -> Configure Build Path 에 들어간다.
Java Build Path에서 Libraries 탭을 누르고 Add External JARs를 연다.
준비한 라이브러리 파일을 불러와 등록하면 끝!
라이브러리가 추가되었다면 이제 연결해볼 시간이다.
아래 코드를 따라 해보자.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Jdbc1 {
public static void main(String[] args) {
String url = "jdbc:mysql://127.0.0.1/DB?useSSL=false";
String userid = "root";
String userpw = "0000";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// JDBC Driver를 로딩
System.out.println("드라이버가 로드되었습니다.");
Connection conn = DriverManager.getConnection(url,userid,userpw);
// JDBC와 DBMS 연결
System.out.println("MySQL에 정상적으로 연결되었습니다.");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
/* 실행결과
드라이버가 로드되었습니다.
MySQL에 정상적으로 연결되었습니다.
*/
Class.forName("jdbc 드라이터 패키지명") 를 사용하여 JDBC Driver를 로딩하고
DriverManager.getConnection(주소, 아이디, 비밀번호) 를 통해 JDBC와 DBMS의 연결하게된다.
메소드의 매개변수 중 주소의 패턴은 아래와 같다
jdbc:mysql://ip주소/db명?useSSL=SSL사용여부(true,false)
예) jdbc:mysql://127.0.0.1/aiclass?useSSL=false
이러한 과정을 try ~ catch 구문에 넣어 에러 발생시 예외 처리가 될 수 있게 사용하였다.
Statement 인터페이스
Statement 인터페이스는 Connection 클래스의 createStatement() 메소드로 호출가능하며, Statement 인터페이스를 구현한 객체인 Statement 객체는 여러 메소드를 통해 SQL 질의와 실행, 호출이 기능을 제공한다.
executeUpdate() 메소드는 insert, update, delete의 SQL 구문을 실행 할 수 있고 실행 후 몇개 구문이 성공했는지 알려주는 기능을 한다.
executeQuery() 메소드는 select SQL구문을 실행하여 조회의 기능을 수행한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Jdbc2 {
public static void main(String[] args) {
String url = "jdbc:mysql://127.0.0.1/DB?useSSL=false";
String userid = "root";
String userpw = "0000";
String sql = "insert into tb_member(mem_userid, mem_userpw, mem_name, " +
"mem_hp, mem_email, mem_hobby, mem_ssn1, mem_ssn2, \n" +
"mem_zipcode, mem_address1, mem_address2, mem_address3) values " +
"('avocado' , '9999', '안가도', '010-9999-9999', 'avocado@avocado.com'," +
"'드라이브', '001011','3068518','12345', '서울시 양천구 목동', '111-11','11111')";
try {
// DB 연결
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, userid, userpw);
// SQL을 통해 데이터를 다루는 부분
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate(sql);
if (result >= 1) {
System.out.println(result + "개의 레코드가 insert 되었음");
} else {
System.out.println("insert 가 실패되었음");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/* 실행결과
1개의 레코드가 insert 되었음"
*/
ResultSet 인터페이스
ResultSet 인터페이스는 결과를 저장할 수 있는 객체로 저장된 값을 레코드(로우) 단위로 불러올 수 있다. 레코드(로우) 단위로 데이터를 가져올 경우 타입을 지정하여 불러올 수 있다.
PreparedStatement 인터페이스
Statement 와 PreparedStatement 의 차이는 캐시 사용 유무로 PreparedStatement는 객체를 캐시에 담아 재사용할 수 있다. 반복적으로 쿼리를 수행한다면 statement에 비해 성능 좋으나 Statement 는 보안상 취약점이 발견되었기 때문에 PreparedStatement 를 사용하는 것을 권고하고 있다. PreparedStatement 인터페이스는 Statement 인터페이스에 비해 보안상과 재사용 등에서 여러 장점을 가지고 있어 PreparedStatement 인터페이스를 많이 사용한다.
String sql = "insert into tb_member (mem_userid, mem_userpw, mem_name ...) values (?,?,? ...)";
pstmt = conn.preparedStatement(sql);
pstmt.setString(1,mem_userid);
pstmt.setString(2,mem_userpw);
pstmt.setString(3,mem_name);
...
pstmt.executeUpdate();
위 코드를 보면 sql변수에서 직접적으로 mem_userid, mem_userpw, mem_name …에 데이터를 입력하는 방법이 아닌
( ? )를 사용하여 추후에 대입하게된다.