오래전에 교수님이 시켜서 섰던 글을 옮겨 둡니다.
아래 내용대로 하더라도 안되었던 것으로 기억합니다. UTF8 과 EUC_KR 사의 문제가 있었던 것 같은데, 기억이 가물가물하군요... 나중에(언제가될지 모르겠지만, ) 시간이 나면 다시 정리 할께요...
--------------------------------------
다음은 수업시간에 교수님이 저를 꼭 집어서 시켜서 제가 작성한 것 입니다. 도움이 될 까 하고 여기에 올려봅니다.
JDBC
에 대한 설명을 수업시간에 들어서 다 아실거라 믿습니다. 다시 조금 설명하면 Java와 DB의 연결점이라고 생각하시면 됩니다.
DB 마다 조금씩 SQL명령구문이 다릅니다. 다른 DB를 사용한다고 해서 SQL명령이 들어간 부분을 완전히 바꾼다고 한다면
보수유지에 문제가 많겠지요. 그래서 통일성있게 하려고 JDBC를 사용합니다.
JDBC를 사용할려면 우선 자바 JDK가 깔려있어야 하겠고 또 DB에 맞는 JDBC Driver가 필요합니다. 우리의 목표는 MySQL과 자바의 연결이니 MySQL에서 제공하는 JDBC Driver 가 필요합니다. http://www.mysql.com/downloads/api-jdbc.html 이 주소를 따라가면 MySQL의 JDBC 드라이버를 받을 수 있습니다.
다운 받을 때 버전 번호 잘 확인 하기 바랍니다. 버전 번호에 대한 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions.html
에 있습니다. 이 내용은 JDBC버전과 Mysql 의 관계를 설명한것입니다. 저의 엉터리 영어 해석을 동원하자먄
Connector/J 3.0 버전은 MySQL 3.x or MySQL 4.1 servers(버전뒤에 servers 가 붙는 것은
뭔지 모르겠습니다.) 에서 동작하고 , Connector/J 3.1 는 MySQL 4.1 and MySQL 5.0 servers
에서 동작하고, Connector/J 5.0 는 Connector/J 3.1의 기능에 뭔가를 추가했다는 말 같습니다.
여기에 우리는 자바 가상머신 버전과 Connector/J 의 버전도 고려해야 합니다. 그 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions-java.html 여기에 있습니다. 자바 1.5이상을 쓰시면 그 다지 걱정하지 않아도 될 것 같군요..
그냥 zip 파일이기 때문에 압축해제 하고 싶은데 하시기 바랍니다. 이 디렉토리(폴더)안에는
mysql-connector-java-[ver]-bin.jar 이런 형식의 jar 파일이 있습니다. 이 파일의 총
경로(디렉토리주소\파일이름)를 CLASSPATH라는 환경변수에 이 디렉토리를 설정하기 바랍니다. (CLASSPATH 에 추가
하는 것은 다 아시리라 믿습니다. PATH에 설정하듯이 설정하면 됩니다. CLASSPATH라는 환경변수가 없으면 만들고, 있으면
세미콜론 하나 붙인 후 이 패스를 추가 하면됩니다. )
근데 이게 재부팅해야 작동하는 것 같습니다. 환경설정 자체는
재부팅이 필요없는데 JVM이 다시 로드되어서 작동하는 것 같습니다. 재부팅 안하고 하려면
mysql-connector-java-5.0.5-bin.jar 파일을 C:\Program
Files\Java\jdk1.5.0_10\lib 라는 디렉토리에 넣으면 됩니다. 이게 더 좋은 방법일 것 같습니다.
이제 잘 설정되었는지 실험해 보시기 바랍니다. 다음을 컴파일 한 후 실행해 보기 바랍니다.
===============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class jdbcTest {
public static void main(String[] args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}
}
}==================================================
이
프로그램은 간단하게 Mysql과 연결하기 위해 드라이버를 로딩하는 기능을 합니다. 이게 제대로 실행되어야 합니다. 실행중 에러가
나면 안됩니다. 잘 작동하지 않는다면 대부분의 문제는 앞에서 설정을 잘못하였거나 자기 Mysql 버전과 맞지 않는 것을 사용했기
때문입니다.(저 같은 경우, 완전이 압축해제 하지 않아서 시간을 조금 허비했군요. 이 경우도 확인해 보시기 바랍니다.)
이제 Mysql에 접속해 보겠습니다. 우선 mysql이 작동하는 상태로 만들고, 다음 코드를 컴파일 후 실행해 보기 바랍니다.
===================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class jdbcTest {
public static void main(String[] args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}
try{
Connection conn =
DriverManager.getConnection("jdbc:mysql://localhost" ,"아이디" ,"패스워드");
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
}
}
====================================================
아이디와 패스워드 라고 중간에 한글로 된 부분은 진짜 자신의 아이디와 패스워드를 적어주시기 바랍니다.
DriverManager.getConnection
메소드는 접근하기 위한 주소와 아이디, 패스워드를 받아 MySQL과 접속시켜줍니다. 만일 웹에서 작동하게 된다면
localhost 대신 자신의 웹주소를 적어야 하겠죠. 그리고 만일 Mysql을 처음 설치할 때 localhost로 안하고 다른
것으로 설정했다면 그 주소로 해야 합니다. 에러가 안 나와야 정상입니다.
이제 쿼리를 날려봅시다.
==============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
public class jdbcTest {
public static void main(String[] args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}
Connection conn = null;
try{
conn =
DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
Statement stmt = null;
ResultSet rs = null;
try{
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT version()");
// or alternatively, if you don't know ahead of time that
// the query will be a SELECT...
if (stmt.execute("SELECT versoin()")) {
rs = stmt.getResultSet();
}
} catch(Exception ex) {
// handle the error
}
}
}
================================================================
쿼
리만 날려 봤습니다. SELECT versoin()은 SQL 버전을 출력해 주는 구문입니다. 우리의 결과는 rs에 들어
있습니다.이 자료를 출력하겠습니다. 우선 mytest 데이터베이스에 test라는 테이블을 만들어서 다음과 같이 자료를
넣었습니다. 우선 Database를 만들어 주어야 합니다.
create database mytest;
그 다음 테이블을 만들어 주어야 합니다. 다음과 같이 하면 됩니다.
CREATE TABLE `mytest`.`test` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(45) character set utf8 NOT NULL,
`age` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
);
그리고 그 안의 데이터는 다음과 같습니다.
1 김철수 19
2 이영희 25
3 홍길동 43
insert into 를 이용하는 것은 다 아시겠죠..
================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.sql.CallableStatement;
public class jdbcTest {
public static void main(String[] args) {
try {
// The newInstance() call is a work around for some
// broken Java implementations
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// handle the error
}
Connection conn = null;
try{
conn =
DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
} catch (SQLException ex) {
// handle any errors
System.out.println("SQLException: " + ex.getMessage());
System.out.println("SQLState: " + ex.getSQLState());
System.out.println("VendorError: " + ex.getErrorCode());
}
Statement stmt = null;
ResultSet rs = null;
try{
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM mytest.test");
// or alternatively, if you don't know ahead of time that
// the query will be a SELECT...
if (stmt.execute("SELECT * FROM mytest.test")) {
rs = stmt.getResultSet();
}
} catch(Exception ex) {
// handle the error
}
try{
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id + " " + name + " " +age);
}
}catch(Exception ex) {
// handle the error
}
}
}
================================================
다음과 같은 결과가 나와야 합니다.
=====================
1 김철수 19
2 이영희 25
3 홍길동 43
====================
MySql5.x 버전을 사용하면 한글이 깨져서 나올 수 있는데, MySQL Server Instance Config Wizard
라는 프로그램(MySQL 설치시 자동설치됩니다.)으로 환경설정을 다시 해주어야 합니다. 기본으로 하다기 Charracter
set 을 설정하는 부분이 있는데, 맨 마지막 Manaul로 설정하고 Character set을 EucKR로 설정하세요.
그리고 테이블 삭제하고 다시 만들어서 실험해 보세요..
여기 까지가 제 강의 입니다. 대부분의 자료는 http://dev.mysql.com/doc/refman/5.0/en/connector-j.html 와 http://www.javastudy.co.kr/docs/lec_jdbc/index.shtml 에서 읽어보고 작동여부를 점검했습니다. 저기 있는대로 하니까 안되는 것도 있어 좀 고쳐서 했습니다.