- DBMS를 관리하기 위해 사용되는 프로그래밍 언어
- JDBC 실습에는 H2 데이터베이스를 이용할 예정이고 아래는 MySQL 사용법과 기본적인 SQL 문법 관련 포스팅이다.
- MySQL 시작, 특징과 SQL 개념
- MySQL SELECT 사용법 및 함수, 데이터 타입
- MySQL DML (INSERT, UPDATE, DELETE)
1 . JDBC 드라이버 객체 로드
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) {
try {
DriverManager.registerDriver(new org.h2.Driver()); } catch (SQLException e) {
e.printStackTrace();
}
}
}
2 . DB 연결
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
try {
DriverManager.registerDriver(new org.h2.Driver());
String jdbcUrl = "jdbc:h2:tcp://localhost/~/test";
conn = DriverManager.getConnection(jdbcUrl, "sa", ""); //JDBC Url, DB 아이디, DB 비밀번호
if(conn != null) {
System.out.println("Conn 객체의 정보 : " + conn.toString());
}
//Conn 객체의 정보 : conn0: url=jdbc:h2:tcp://localhost/~/test user=SA
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3 . SQL 전송 준비
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
DriverManager.registerDriver(new org.h2.Driver());
String jdbcUrl = "jdbc:h2:tcp://localhost/~/test";
conn = DriverManager.getConnection(jdbcUrl, "sa", "");
String sql = "insert into animal values(?, ?, ?, ?)";
stmt = conn.prepareStatement(sql);
if(stmt != null) {
System.out.println("stmt 객체 정보: " + stmt.toString());
}
//stmt 객체 정보: prep0: insert into animal values(?, ?, ?, ?)
} catch (SQLException e) {
e.printStackTrace();
}
}
}
setString, setInt
등의 메소드를 통해 값을 입력해준다.
4 . SQL 전송
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
DriverManager.registerDriver(new org.h2.Driver());
String jdbcUrl = "jdbc:h2:tcp://localhost/~/test";
conn = DriverManager.getConnection(jdbcUrl, "sa", "");
String sql = "insert into animal values(?, ?, ?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1, "NUM1");
stmt.setString(2, "Tory");
stmt.setInt(3, 5);
stmt.setString(4, "Dog");
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
stmt.setString
을 이용해 파라미터에 값을 입력해주고 있다. (첫번째 물음표는 1부터 시작한다.)
- DB 테이블의 칼럼이 UNIQUE, PRIMARY KEY 특성이 있는지 잘 확인하지 않으면 에러가 뜰 수 있다.
stmt.executeUpdate()
를 이용해 sql을 DB로 보내 삽입, 수정, 삭제 처리를 할 수 있다.
stmt.executeUpdate()
을 int 타입 변수로 받아 출력하면 데이터가 처리된 횟수를 알 수 있다.
stmt.executeQuery()
를 이용해 sql을 DB로 보내 정보를 조회할 수 있다.ResultSet rs = null; // ResultSet 초기화
(...)
String sql = "select * from table";
stmt = conn.prepareStatement(sql)
rs=stmt.executeQuery(); //ResultSet에 sql을 통해 데이터를 받아올 수 있다.
while(rs.next()) {
System.out.print(rs.getString("COLUMN1")+ ", ");
System.out.print(rs.getString("COLUMN2")+ ", ");
System.out.println(rs.getInt("COLUMN3")+ ", ");
}
(...)
finally{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
(...)
}
- rs.next()는 다음 행의 값이 존재하면 true, 존재하지 않으면 false를 반환한다.
- ResultSet은 데이터가 있는 테이블 맨 위(beforeFirst)와 맨 아래(afterLast)에 빈 영역이 존재하는데 ResultSet이 생성될 때 beforeFirst에 위치하게 된다. (그림상의 컬럼명과 데이터테이블 사이)
- ResultSet의 커서(cursor)는 각 행을 가리키고 next()가 true일 때마다 커서가 한 행씩 내려간다.
- getString, getInt를 통해 해당 데이터를 받아온다.
5 . DB 연결 종료
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
try {
DriverManager.registerDriver(new org.h2.Driver());
String jdbcUrl = "jdbc:h2:tcp://localhost/~/test";
conn = DriverManager.getConnection(jdbcUrl, "sa", "");
String sql = "insert into animal values(?, ?, ?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1, "NUM1");
stmt.setString(2, "Tory");
stmt.setInt(3, 5);
stmt.setString(4, "Dog");
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
stmt.close();
}catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 자원 누수로 인한 오류는 추후에 예상치 못한 오류를 발생할 수 있다.
Reference: