MySQL과 Java 연동
1. JDBC 드라이버 설치
MySQL Server가 컴퓨터에 설치되었다는 조건하에 컨넥터(JDBC)를 설치한다.
위의 "Connector/J"를 클릭하고 Zip형식의 파일을 다운 받는다.
다운 받은 파일을 압축풀면 위의 파일들이 보이는데 빨간색으로 표시한 파일을 복사한다.
복사한 파일을 위의 2개의 폴더에 모두 복사해야 한다.
각각의 폴더안의 jre/lib/ext 디렉토리에 복사해야 한다.
이제 MySQL의 JDBC 드라이버 설치가 모두 완료되었다. 설치는 정말 간단하다.ㅋ
2. 자바와의 연동
그렇다면, 이제 자바의 소소를 타이핑하면서 실제로 DB와 자바를 연동해보자.
자바와 db의 연동은 크게 4가지로 구분된다.
1. JDBC 드라이버 로드
2. DB에 연결
3. DB 사용
4. DB 연결 중단
java.lang.Class 클래스의 정적 메소드인 forName 메소드를 호출해서 할 수 있는데,
이 메소드의 본래 기능은 주어진 클래스 이름에 해당하는 클래스 정보를 찾아서 리턴하는 것이지만
그 과정에서 클래스 파일을 자바 가상 기계 안으로 읽어들이기 때문이다.
메소드의 호출방법 :
Class.forName(com.mysql.jdbc.Driver");
JDBC 드라이버의 클래스 이름
JDBC 드라이버를 로드한 다음에는 DB와 연결을 해야 한다.
DB와의 연결방법 :
jdbc:mysql:// ip 주소 : 포트번호 / db명
이렇게 만든 db URL을 가지고 java.sql.DriverManager 클래스의 정적 메소드인 getConnection
메소드를 호출하면 데이터베이스에 연결할 수 있다.
사용방법 :
Connection con = DriverManager.getConnection (
"jdbc:mysql:// ip 주소 : 포트번호 / db명", " db 아이디", "db 패스워드");
마지막으로는 데이터베이스와의 연결을 끊어줘야 한다.
연결 해지 방법 : con.close();
[현재까지의 자바 소스 코드 ]
import java.sql.*;
public class Test {
public static void main(String args[]) {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/testdb", "root", "123");
System.out.println("db에 접속 완료");
conn.close();
}
catch(ClassNotFoundException cnfe) {
System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
}
catch(SQLException se) {
System.out.println(se.getMessage());
}
}
}
3. DB의 데이터 불러오기
그렇다면 실제로 데이터베이스에 입력되어 있는 값들을 불러와보자.
먼저, MySQL에 입력되어 있는 데이터는 다음과 같다.
자바 소스코드에서 DB에 있는 데이터를 가져오는 State는 다음과 같다.
1. Connection에서 DB와 연동을 한다. 즉, DB와의 연결을 맨 처음으로 실행한다.
따라서, Connection에는 데이터베이스의 정보가 저장된다.
2. 자바에서 DB의 데이터를 쿼리문을 통해 제어할 수 있도록 Connection에서
createStatement() 메소드를 통하여 Statement객체를 생성한다.
Statement에서는 executeQuery(String sql) 메소드를 통하여 쿼리문을 작성한다.
이 메소드는 파라미터로 넘겨준 SQL문을 데이터베이스로 보내서 실행하고,
그 결과로 ResultSet 객체를 리턴한다. 즉, SQL문을 실행한 결과가 ResultSet에 저장된다.
3. ResultSet에는 next() 메소드가 있는데, 이 메소드는 실행결과의 다음 행 위치로 이동하는
메소드이다. 따라서, 결과가 끝까지 모두 실행되고 나면 실행은 중지한다.
데이터를 불러올 때는 DB의 애트리뷰트에 맞는 자료형을 선언해야 한다.
예를 들어서 DB에 저장할 때 애트리뷰트명은 name이고, 자료형은 varchar(10) 이었다면
자바 소스 코드에서는 String name = ResultSet.getString("name")이 되어야 한다.
여기서 getString() 메소드 안의 "name"은 DB의 애트리뷰트명이다.
즉, 맨 처음 Connection을 만들고, Connection은 Statement에게 넘겨주고, Statement는
마지막으로 ResultSet에게 넘겨준다.
[ DB의 데이터를 불러오는 자바 소스 코드 ]
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Test {
public static void main(String args[]) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/testdb", "root", "123");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery
("select code, name, price, maker from goodsinfo;");
System.out.println("상품코드 상품명 \t\t\t가격 제조사");
System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
while(rs.next()) {
String code = rs.getString("code");
String name = rs.getString("name");
int price = rs.getInt("price");
String maker = rs.getString("maker");
System.out.printf("%8s %s \t%12d %s%n", code,
toUnicode(name), price, toUnicode(maker));
}
}
catch(ClassNotFoundException cnfe) {
System.out.println("해당 클래스를 찾을 수 없습니다." + cnfe.getMessage());
}
catch(SQLException se) {
System.out.println(se.getMessage());
}
finally {
try {
stmt.close();
}
catch(Exception ignored) {
}
try {
conn.close();
}
catch(Exception ignored) {
}
}
}
private static String toUnicode(String str) {
try {
byte[] b = str.getBytes("ISO-8859-1");
return new String(b);
}
catch(java.io.UnsupportedEncodingException uee) {
System.out.println(uee.getMessage());
return null;
}
}
}
[ 결과 ]
[ Tip ]
만일, 위의 소스코드에서 한글로 되어 있는 String 값을 유니코드로 바꾸지 않는다면
어떻게 될까? 결과부터 보자.
한글로 되어있는 String값은 다 깨져서 출력된다.
왜 그럴까?
MySQL 서버는 기본적으로 ISO-8859-1 문자셋 (Latin 1 문자셋이라고도 함)을 사용하여
데이터를 저장하는데, 자바에서는 기본적으로 Unicode 문자셋을 사용한다.
그렇기때문에 데이터베이스로부터 한글이 포함된 데이터를 읽어와서 그대로 출력하면
깨져 보일 수 있다. 따라서, 한글이 포함되어 있는 데이터를 출력하기 전에 반드시
유니코드로 변경해 주어야 한다.