* JDBC프로그래밍
JDBC란? 자바 프로그램에서 SQL문을 실행하여 데이터를 관리하기 위한 JAVA API이다.
특징은 다양한 데이터베이스에 대해서 별도의 프로그램을 만들 필요 없이, 해다 데이터베이스의 JDBC를 이용하면 하나의 프로그램으로 데이터 베이스를 관리할 수 있다.
우리는 Mysql을 사용하므로 mysql용 jdbc를 사용한다.
* 데이터베이스와 java의 연결 순서
1. JDBC 드라이버 로드.
2. 데이터베이스 Connection 객체 생성
3. 쿼리문 실행을 위한 Statement 객체 생성.
4. 쿼리문을 실행
5. ResultSet 객체를 통해 쿼리문 실행 결과값을 소비.
6.Statement 객체 종료
7. 데이터베이스 connection 객체 종료.
* DBMS와의 통신을 위한 JDBC 드라이버
-JDBC드라이버는 DBMS와의 통신을 담당하는 자바 클래스로서 각 DBMS마다 별도의 드라이버가 필요하다.
-주요 DBMS의 JDBC 드라이버 클래스
1. MySQL : "com.mysql.jdbc.Driver"
2. ORACLE : "oracle.jdbc.driver.OracleDriver"
* 데이터베이스 식별을 위한 JDBC URL
웹이 주소를 구분할 때 URL을 사용하는 것처럼 데이터베이스도 URL을 통해 데이터베이스들을 구분한다.
1. MySQL : "Jdbc:mysql://호스트이름:포트번호/DB이름"
2. ORACLE: "jdbc:oracle:thin:호스트이름:포트번호/DB이름"
* 데이터베이스 연결을 위한 Connection 객체
- JDBC를 이용하여 데이터베이스를 사용하려면 데이터베이스와 연결된 커넥션을 구해야한다.
- java.sql 패키지에 있는 Connection클래스가 데이터베이스 커넥션을 지원하며 DriverManager클래스가 제공하는 getConnection()메서드를 사용하여 커넥션을 구할 수 있다.
- getConnection()메서드에 파라미터값으로 JDBC, URL, DB사용자 계정명, DB사용자 암호를 전달하면 메서드는 DB와 연결된 커넥션 객체를 리턴한다.
- 만일 제대로 객체를 생성하지 못하면 SQLException발생하므로 getConnection() 메서드를 사용할 때는 반드시 try ~ catch구문으로 예외처리를 해줘야한다.
- Connection 객체를 다 사용한 뒤어는 반드시 close() 메서드를 호출하여 connection객체가 사용한 시스템 지원을 반환해야한다. 그렇지 않으면 시스템 자원이 불필요하게 소모되어 커넥션을 구할 수 없는 상황이 발생할 수도 있습니다.
* 쿼리문을 실행하기 위한 Statement 객체
-Connection 객체를 생성한 후에는 connection 객체로부터 statement를 생성하고 쿼리문을 실행할 수 있다.
- Statment 객체는 Connection객체의 createStatment() 메서드를 이용하여 생성한다.
- Statement 객체를 사용하면 쿼리문을 실행시킬 수 있다.
1. executeQuery(String query) : ResultSet - select 쿼리문을 실행한다.
2. executeUpdate(String query) : int = Insert, Update, Delete 쿼리문을 실행한다.
* ResultSet 주요 메서드
1. getString(String name): String - 지정한 컬럼 값을 String으로 읽어옴. 파라미터 변수 name에는 DB테이블의 컬럼이름을 적는다.
2. getint(String name): int - 지정한 컬럼 값을 int 타입으로 읽어옴.
3.getDouble(String name): double - 지정한 컬럼 값을 double 타입으로 읽어옴
* Statement 객체를 대신하는 PreparedStatment 객체
- Statement 객체 PreparedStatment객체는 쿼리문을 실행하는 동일한 기능을 제공한다.
- 그런데 PreparedStatment 객체를 사용하는 이유는 이 객체가 값 변환을 자동으로 해주는 기능을 제공하고, 간결한 코드를 만들 수 있기 때문이다.
- Statment 객체는 지정할 값이 많아질 경우 따옴표가 복잡하게 얽히기 때문에 코드 작성에서 오류가 발생할 수도 있고, 코드 수정시에도 어려움이 발생한다.
- 그러나 PreparedStatment 객체는 값을 지정할 때 값 부분을 물음표(?)로 처리하기 때문에 간단히 값을 지정할 수 있다.
이때 첫번째 물음표의 인덱스는 1이며, 이후 물음표의 인덱스는 나오는 순서대로 인덱스 값이 1씩 증가한다.
데이터베이스와 java의 연결
1. 이클립스 새로운 Dynamic Web Project 만든다.
2. 현제 동작시킬 프로젝트 클릭 : 서버 우클릭 > Add and Remove
3. mysql과 웹 연결해주는 컨넥터 설치
mysql-connector-java-5.1.46-bin.jar 을 이래 경로에 붙여넣어주면 끝이다.
4. 연결 코드 싸주기
10-1에서 만들어 놓은 jsp_practice DB에 연결하겠다.
package kr.co.koo.jdbc.basic;
import java.sql.*;
public class Jdbcinsert {
public static void main(String[] args) {
//DB 연동 순서
//1. DB사용자 계정명과 암호, DB URL등 초기 데이터 변수를 설정.
String uid = "jsp";
String upw = "jsp";
String url = "Jdbc:mysql://localhost:3306/jsp_practice";
//2. JDBC 커넥터 드라이버 호출
try {
//2. JDBC 커넥터 드라이버 호출
Class.forName("com.mysql.jdbc.Driver");
//3. DB연동을 위한 클래스들의 객체를 생성.
/*
* # A - Connectrion 객체
* : DB와의 연결을 위한 객체. Connection객체를 생성하려면 직접 new연산자를 통해
* 객체를 생성할 수 없고, DriverManager클래스가 제공하는 정적 메서드
* getConnection()을 호출하려 객체를 생성해야한다.
*
*/
Connection conn = DriverManager.getConnection(url, upw, uid);
System.out.println(conn);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5. DB 테이블안에 값 저장하기. (위 코드에서 조금더 추가한거다.)
package kr.co.koo.jdbc.basic;
import java.sql.*;
public class Jdbcinsert {
public static void main(String[] args) {
//DB 연동 순서
//1. DB사용자 계정명과 암호, DB URL등 초기 데이터 변수를 설정.
String uid = "jsp";
String upw = "jsp";
String url = "Jdbc:mysql://localhost:3306/jsp_practice";
Connection conn = null;
Statement stmt = null;
//2. JDBC 커넥터 드라이버 호출
try {
//2. JDBC 커넥터 드라이버 호출
Class.forName("com.mysql.jdbc.Driver");
//3. DB연동을 위한 클래스들의 객체를 생성.
/*
* # A - Connectrion 객체
* : DB와의 연결을 위한 객체. Connection객체를 생성하려면 직접 new연산자를 통해
* 객체를 생성할 수 없고, DriverManager클래스가 제공하는 정적 메서드
* getConnection()을 호출하려 객체를 생성해야한다.
*
*/
conn = DriverManager.getConnection(url, upw, uid);
/*
# b - Statement 객체:
SQL문 실행을 위한 객체.
Statement객체는 Connection객체가 제공하는
createStatement()메서드를 호출하여 생성합니다.
*/
stmt = conn.createStatement();
/*
# c - SQL문 작성.
SQL문은 String형태로 작성합니다.
*/
String sql = "INSERT INTO member VALUES ('jsp012', 'jjj123', '김제이에스피', 'jjj123@naver.com') ";
/*
# d - Statement객체를 통한 SQL문 실행
1. insert, update, delete명령일 경우
executeUpdate()를 호출합니다.
2. select명령일 경우 executeQuery()를 호출합니다.
3. executeUpdate는 실행 성공시 성공한 쿼리의 개수를,
실패시 0을 리턴합니다.
*/
int resultNum = stmt.executeUpdate(sql);
if(resultNum == 1) {
System.out.println("DB에 회원정보 저장 성공!");
} else {
System.out.println("DB에 회원정보 저장 실패!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
/*
4. DB연동 객체들 자원 반납.
- 원활한 JDBC프로그래밍을 위해 사용한 자원들을 반납합니다.
*/
// close()도 throw가 붙어있어서 예외 처리를 해줘야한다.
try {
conn.close(); stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
6. 위 코드를 좀더 수정해보자. 이번에는 스캐너로 값을 받아서 db에 값을 넣어보자.
package kr.co.koo.jdbc.basic;
import java.sql.*;
import java.util.Scanner;
public class Jdbcinsert {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("# 회원정보 입력을 시작합니다.");
System.out.println("* 아이디: ");
String id = sc.next();
System.out.println("* 비밀번호: ");
String pw = sc.next();
System.out.println("* 이름: ");
String name = sc.next();
System.out.println("* 이메일: ");
String email = sc.next();
//DB 연동 순서
//1. DB사용자 계정명과 암호, DB URL등 초기 데이터 변수를 설정.
String uid = "jsp";
String upw = "jsp";
String url = "Jdbc:mysql://localhost:3306/jsp_practice";
Connection conn = null;
Statement stmt = null;
//2. JDBC 커넥터 드라이버 호출
try {
//2. JDBC 커넥터 드라이버 호출
Class.forName("com.mysql.jdbc.Driver");
//3. DB연동을 위한 클래스들의 객체를 생성.
/*
* # A - Connectrion 객체
* : DB와의 연결을 위한 객체. Connection객체를 생성하려면 직접 new연산자를 통해
* 객체를 생성할 수 없고, DriverManager클래스가 제공하는 정적 메서드
* getConnection()을 호출하려 객체를 생성해야한다.
*
*/
conn = DriverManager.getConnection(url, upw, uid);
/*
# b - Statement 객체:
SQL문 실행을 위한 객체.
Statement객체는 Connection객체가 제공하는
createStatement()메서드를 호출하여 생성합니다.
*/
stmt = conn.createStatement();
/*
# c - SQL문 작성.
SQL문은 String형태로 작성합니다.
*/
String sql = "INSERT INTO member VALUES "
+ "('"+id+"', '"+pw+"', '"+name+"', '"+email+"')";
/*
# d - Statement객체를 통한 SQL문 실행
1. insert, update, delete명령일 경우
executeUpdate()를 호출합니다.
2. select명령일 경우 executeQuery()를 호출합니다.
3. executeUpdate는 실행 성공시 성공한 쿼리의 개수를,
실패시 0을 리턴합니다.
*/
int resultNum = stmt.executeUpdate(sql);
if(resultNum == 1) {
System.out.println("DB에 회원정보 저장 성공!");
} else {
System.out.println("DB에 회원정보 저장 실패!");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
/*
4. DB연동 객체들 자원 반납.
- 원활한 JDBC프로그래밍을 위해 사용한 자원들을 반납합니다.
*/
// close()도 throw가 붙어있어서 예외 처리를 해줘야한다.
try {
conn.close(); stmt.close(); sc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
'IT' 카테고리의 다른 글
12-1. jsp - JDBC프로그래밍 PreparedStatement (0) | 2022.10.12 |
---|---|
11-1. JSP - JDBC 프로그래밍 select, delete (1) | 2022.10.11 |
20. 자바 - set, Map 컬렉션 (0) | 2022.10.07 |
16-1. 자바 예외처리 - try ~ catch (1) | 2022.10.06 |
19. 자바 - List 컬렉션 기초 (1) | 2022.10.05 |