JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API입니다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공합니다.
자신의 컴퓨터에 mysql, oracle, mariadb 중 하나라도 설치가 되어 있어야 연동이 가능하고 DB 종류에 관계없이 동일한 API를 제공합니다.
JDBC를 사용하기위해서 드라이버를 이클립스 안에 설치해야하는데요.
여기서 설치 방법을 볼 수 있습니다 -> [JAVA] JDBC 사용해보기 #1 - 오라클 JDBC 드라이버 불러오기
이제 본격적으로 DB와 연동하기 위한 코드를 짜봅시다.
저는 oracle을 사용했습니다.
DB 접속
package test.util;
import java.sql.Connection;
import java.sql.DriverManager;
/*
* 객체를 생성해서 메소드를 호출하면 Connection 객체를 리턴하는 객체를 생성할 클래스 설계하기
*/
public class DBConnect {
//Connection 객체의 참조값을 담을 필드 선언
private Connection conn;
//생성자에서 Connection 객체를 얻어오는 작업을 한다.
public DBConnect() {
try {
//오라클 드라이버 클래스 로딩(OracleDriver 클래스를 사용할 준비를 한다)
Class.forName("oracle.jdbc.driver.OracleDriver");
//접속할 DB 의 정보
String url="jdbc:oracle:thin:@localhost:1521:xe";
//DB 연결 객체의 참조값 얻어와서 필드에 담기
conn=DriverManager.getConnection(url, "scott", "tiger");
//예외가 발생하지 않고 여기까지 실행순서가 진행이되면 접속 성공이다.
System.out.println("Oracle DB 접속 성공!");
}catch(Exception e){
}
}
//Connection 객체를 리턴하는 메소드
public Connection getConn() {
return conn;
}
}
Oracle DB 접속하는 코드입니다. DBConnect이라는 클래스로 만들어주었습니다.
getConnection에 DB의 아이디와 비번을 적어줍니다.
저는 오라클 DB에서 기본으로 제공해주는 연습용 scott 계정을 사용하였습니다.
scott계정 활성화 하는 게시글은 여기를 눌러주세요 [ORACLE] scott 계정 활성화하기 / 연습용 계정 활성화하기
SELECT문 예제
package test.main;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import test.util.DBConnect;
public class MainClass04 {
public static void main(String[] args) {
try {
//DBConnect 객체를 이용해서 Connection 객체의 참조값 얻어오기
Connection conn = new DBConnect().getConn();
//실행할 sql 문
String sql="SELECT ename, deptno, "
+ " TO_CHAR(hiredate,'YYYY.MM.DD') AS hiredate"
+ " FROM emp ORDER BY ename ASC";
//sql 문을 실행해줄 객체의 참조값 얻어오기
PreparedStatement pstmt=conn.prepareStatement(sql);
//query 문 수행하고 결과셋 객체 얻어오기
ResultSet rs=pstmt.executeQuery();
while(rs.next()) {
String ename=rs.getString("ename");
int deptno=rs.getInt("deptno");
//String hiredate=rs.getString(3);
String hiredate=rs.getString("hiredate");
System.out.println(ename+" | "+deptno+" | "+hiredate);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
DB를 연결했으면 sql문을 질의해야합니다.
먼저, Connection conn = new DBConnect().getConn();을 사용하여 미리 만들어놓은 DBConnect 클래스를 사용하여 Connection 객체의 참조값을 얻어옵니다.
그 다음에 sql 변수에 실행할 sql 문을 대입하고 conn.prepareStatement(sql)을 사용해서 sql 문을 실행해줄 객체의 참조값을 얻어옵니다.
executeQuery()를 사용하여 ResultSet 객체를 얻어옵니다.
이제 결과셋 객체를 활용하여 원하는 데이터를 추출해봅시다.
while문을 사용하여 결과셋 다음이 존재할 경우 while문을 반복합니다.
rs.next()는 커서라고 생각하시면됩니다. 위 사진처럼 커서 다음에 데이터가 있는지 확인하고 있으면 true를 반환하고 커서가 한칸 내려옵니다. 만약 다음 데이터가 없으면 false를 반환합니다.
getString, getInt 등을 사용하여 DB에서 제공한 적절한 데이터 형식으로 받아옵니다. 이때 인자로 sql문으로 받아온 값으로도 넘겨줄 수 있지만 열의 순서로도 넘겨줄 수 있습니다.
이렇게 DB값을 잘 받아온 것을 확인할 수 있습니다.
UPDATE 예제
update 예제에서는 member 테이블을 생성해서 사용하였습니다.
create table member(
num number not null,
name varchar(20) not null,
addr varchar(20) );
member 테이블을 오라클 DB에 넣어주세요.
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import test.util.DBConnect;
public class MainClass06 {
public static void main(String[] args) {
//수정할 회원의 정보(1번 회원의 이름을 이00로 바꾸고싶다면)
int num=1;
String name = "이00";
//필요한 객체를 담을 지역변수 미리 만들기
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체의 참조값 얻어오기
conn = new DBConnect().getConn();
//실행할 sql문 뼈대 준비하기
String sql = "UPDATE member SET name = ? where num=? ";
//PreparedStatement 객체의 참조값 얻어오기
pstmt = conn.prepareStatement(sql);
//?에 필요한값 바인딩하기
pstmt.setString(1, name);
pstmt.setInt(2, num);
//sql 문 실행하기
pstmt.executeUpdate();
System.out.println("회원 한명의 정보를 수정 했습니다.");
}catch(Exception e) {
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {}
}
}
}
원하는 데이터를 넘겨줄때 ? 를 사용해서 넘겨줄 수 있습니다.
setString, setInt 등으로 ?에 필요한 값을 바인딩합니다.
나머지는 select와 동일합니다.
DELETE 예제
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import test.util.DBConnect;
public class MainClass08 {
public static void main(String[] args) {
int num=3;
//필요한 객체를 담을 지역변수 미리 만들기
Connection conn = null;
PreparedStatement pstmt = null;
try {
//Connection 객체의 참조값 얻어오기
conn = new DBConnect().getConn();
//실행할 sql문 뼈대 준비하기
String sql = "DELETE FROM member where num=? ";
//PreparedStatement 객체의 참조값 얻어오기
pstmt = conn.prepareStatement(sql);
//?에 필요한값 바인딩하기
pstmt.setInt(1,num);
//sql 문 실행하기
pstmt.executeUpdate();
System.out.println("회원 한명의 정보를 삭제 했습니다.");
}catch(Exception e) {
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {}
}
}
}
DELETE도 UPDATE와 비슷합니다. sql부분만 고치면 되겠습니다.
INSERT 예제
INSERT는 DTO와 함께 만들어보겠습니다.
실제로 프로그래밍을 할때는 DTO와 같이 사용할 일이 많을 것인데요. 이제 DTO와 함께 사용해보겠습니다.
DTO에 관한 자세한 내용은 여기서 볼 수 있습니다 -> [JAVA] DTO vs VO vs Entity / DTO 살펴보기
MemberDto.java
package test.dto;
public class MemberDto {
private int num;
private String name;
private String addr;
//디폴드 생성자
public MemberDto() {
super();
}
//인자로 모든값을 전달 받는 생성자
public MemberDto(int num, String name, String addr) {
super();
this.num = num;
this.name = name;
this.addr = addr;
}
//모든 필드에 setter, getter 메소드 만들기
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
MemberDto를 만들어주었습니다.
package test.main;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import test.dto.MemberDto;
import test.util.DBConnect;
public class MainClass10 {
public static void main(String[] args) {
MemberDto dto = new MemberDto();
dto.setName("누구게");
dto.setAddr("어디게");
//회원 정보를 DB에 저장하고 성공여부를 리턴받는다.
boolean isSuccess = insertMember(dto);
if(isSuccess) {
System.out.println("성공!");
}else {
System.out.println("실패");
}
}
/*
* MemberDto 객체를 인자로 전달받아서 DB 에 저장하고
* 작업의 성공여부를 boolean 으로 리턴해주는 메소드
*/
public static boolean insertMember(MemberDto dto) {
//dto 에 담긴 정보를 DB 에 저장하는 코드를 작성해 보세요!
//필요한 객체를 담을 지역 변수 미리 만들기
Connection conn=null;
PreparedStatement pstmt=null;
int flag=0;
try {
//Connection 객체의 참조값 얻어오기
conn=new DBConnect().getConn();
//실행할 sql 문의 뼈대 미리 준비하기
String sql="INSERT INTO member"
+ " (num, name, addr)"
+ " VALUES(member_seq.NEXTVAL, ?, ?)";
//PreparedStatement 객체의 참조값 얻어오기
pstmt=conn.prepareStatement(sql);
//? 에 필요한값 바인딩하기
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//sql 문 실행하기 (INSERT, UPDATE, DELETE)
flag=pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
} catch (SQLException e) {}
}
//finally 절을 거쳐서 여기까지 실행순서가 왔을때 작업이 성공했는지는 어떻게 알수 있지?
if(flag > 0) {
//성공
return true;
}else {
//실패
return false;
}
}
}
Dto의 setter을 사용하여 원하는 데이터를 저장하고 getter로 얻어와서 sql에 넘겨줍니다.
pstmt.executeUpdate()는 변경된 행의 갯수를 의미합니다. flag라는 변수에 넣어서 만약 변경된 행이 0개면 실패, 1개 이상이면 성공으로 반환했습니다.
나머지는 다른 예제와 같습니다.
DTO를 사용한 DELETE와 UPDATE 예제
package test.main;
import java.lang.reflect.Member;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import test.dto.MemberDto;
import test.util.DBConnect;
public class MainClass11 {
public static void main(String[] args) {
MemberDto dto = new MemberDto();
dto.setNum(1);
dto.setName("박00");
boolean isSuccess = MainClass11.updateMember(dto);
if(isSuccess) {
System.out.println("성공");
}else {
System.out.println("실패");
}
MemberDto dto2 = new MemberDto();
dto2.setNum(7);
boolean isSuccess2 = MainClass11.deleteMember(dto2);
if(isSuccess2) {
System.out.println("성공");
}else {
System.out.println("실패");
}
}
//회원 한명의 정보를 삭제하고 성공여부를 리턴하는 메소드를 완성해보세요.
public static boolean deleteMember(MemberDto dto) {
//dto 에 담긴 정보를 DB 에 저장하는 코드를 작성해 보세요!
//필요한 객체를 담을 지역 변수 미리 만들기
Connection conn=null;
PreparedStatement pstmt=null;
int flag=0;
try {
//Connection 객체의 참조값 얻어오기
conn=new DBConnect().getConn();
//실행할 sql 문의 뼈대 미리 준비하기
String sql="DELETE FROM member"
+ " where num=?";
//PreparedStatement 객체의 참조값 얻어오기
pstmt=conn.prepareStatement(sql);
//? 에 필요한값 바인딩하기
pstmt.setInt(1, dto.getNum());
//sql 문 실행하기 (INSERT, UPDATE, DELETE)
flag=pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
} catch (SQLException e) {}
}
//finally 절을 거쳐서 여기까지 실행순서가 왔을때 작업이 성공했는지는 어떻게 알수 있지?
if(flag > 0) {
//성공
return true;
}else {
//실패
return false;
}
}
//회원 한명의 정보를 수정하고 성공여부를 리턴하는 메소드를 완성해보세요.
public static boolean updateMember(MemberDto dto) {
//dto 에 담긴 정보를 DB 에 저장하는 코드를 작성해 보세요!
//필요한 객체를 담을 지역 변수 미리 만들기
Connection conn=null;
PreparedStatement pstmt=null;
int flag=0;
try {
//Connection 객체의 참조값 얻어오기
conn=new DBConnect().getConn();
//실행할 sql 문의 뼈대 미리 준비하기
String sql="UPDATE member SET"
+ " name = ?"
+ " where num=?";
//PreparedStatement 객체의 참조값 얻어오기
pstmt=conn.prepareStatement(sql);
//? 에 필요한값 바인딩하기
pstmt.setString(1, dto.getName());
pstmt.setInt(2, dto.getNum());
//sql 문 실행하기 (INSERT, UPDATE, DELETE)
flag=pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
} catch (SQLException e) {}
}
//finally 절을 거쳐서 여기까지 실행순서가 왔을때 작업이 성공했는지는 어떻게 알수 있지?
if(flag > 0) {
//성공
return true;
}else {
//실패
return false;
}
}
}
sql문만 바뀌고 다른 곳은 다른 예제와 같습니다.