자바 추상클래스의 경우, 바로 객체로 만들 수 없어서 클래스가 필요했다.
이처럼 DB도, 오라클이 구현한 JDBC API를 이용할 것이다.
자바를 db server(Oracle)에서 사용하기 위한 드라이버가 jdbc(오라클의 경우 - ojdbc)인 것이다.
Ojdbc 8 다운로드
ojdbc8.jar 다운로드. (jar = java archive)
혹은 오라클을 깔았다면 파일이 이미 깔려있다. (찾으면 됨)
경로는
C:\app\컴퓨터유저이름\product\18.0.0\dbhomeXE\jdbc\lib 안에 존재한다!!
여기서 ojdbc8을 복사해서 이클립스에 넣자.
그 후, 프로젝트에서 오른쪽버튼 - Properties - Java Build Path 클릭.
오른쪽의 Add JARs...를 누르고 ojdbc8을 추가하고 Apply하자.
Referenced Libraries가 생겼고, 눌러보면 ojdbc8.jar가 존재한다.
간단히 정리한 jdbc 코딩의 절차는 다음과 같다.
DQL
1. jdbc driver class 등록
2. Connection객체 생성
3. PreparedStatment객체 생성
4. 실행 & ResultSet 리턴받기
5. ResultSet 처리
6. 자원반납 : 생성의 역순으로 반환
DML
1. jdbc driver class 등록
2. Connection객체 생성 & autoCommit false로 설정
3. PreparedStatment객체 생성
4. 실행 & 정수형(처리된 행수) 리턴값
5. 트랜잭션
6. 자원반납 : 생성의 역순으로 반환
Student 접속에서의 member
-- member테이블 생성
create table member(
id varchar2(20),
name varchar2(100) not null,
gender char(1),
birthday date,
email varchar2(500) not null,
point number default 1000,
reg_date TIMESTAMP default SYSTIMESTAMP,
constraint pk_member_id primary key(id),
constraint uq_member_email unique(email),
constraint ck_member_gender check(gender in ('M','F'))
);
자료 생성
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
insert into
member
values(
'honggd','홍길동','M','1999-09-09','honggd@naver.com', default, default);
insert into
member
values(
'sinsa','신사임당','F','1995-05-05','sinsa@naver.com', default, default);
insert into
member
values(
'gogd','고길동','M','1980-02-15','gogd@naver.com', default, default);
insert into
member
values(
'leess','이순신',null,null,'leess@naver.com', default, default);
insert into
member
values(
'jangbg','장보고','F',null,'jangbg@naver.com', default, default);
select*from member;로 다음과 같이 정보가 저장된 것을 확인할 수 있다.
이를 commit하고 저장한다.
이런식으로 일단 jdbc를 실행하고, 실제로 오라클에서 db가 변경되는 것 까지 확인할 수 있었다.
실제 jdbc는 다음과 같은 과정을 거쳐서 진행된다.
run에서 view로 전달, view에서 controller로 전달, dao로 전달, dao에서 db로 전달해서 요청.
응답은 반대로 db에서 dao로, dao에서 controller로, controller에서 view로 , view에서 run으로 전달하여 응답한다.
위와 같은 코드를 만들기 위해서 아래와 같이 java 패키징을 실행한다.
run 클래스
|
view클래스
|
vo 클래스
|
Controller 클래스
|
Dao클래스
|
|
|
|
|
|
member.view.MemberRun.java
package member.run;
import member.view.MemberMenu;
public class MemberRun {
public static void main(String[] args) {
new MemberMenu().mainMenu();
System.out.println("===== 이용해주셔서 감사합니다. =====");
}
}
member.view.MemberMenu.java
package member.view;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import member.controller.MemberController;
import member.model.vo.Member;
/**
* view클래스
* -사용자에게 메뉴 노출
* -사용자 입력값처리
* -메뉴선택시 controller의 메소드 호출(요청)
*/
public class MemberMenu {
Scanner sc=new Scanner(System.in);
MemberController memberController = new MemberController();
public void mainMenu() {
String menu = "\n***** 회원 정보 관리 *****\n"
+ "1. 전체조회\n"
+ "2. 아이디조회\n"
+ "3. 이름검색\n"
+ "4. 회원가입\n"
+ "5. 회원정보변경\n"
+"6. 회원탈퇴\n"
+"0. 프로그램종료\n"+
"************************\n"
+"선택 : ";
while(true) {
System.out.println(menu);
String choice = sc.next();
Member member=null;
int result=0;
switch(choice) {
case "1": break;
case "2": break;
case "3": break;
case "4":
member=inputMember();
System.out.println("member@mainMenu = "+member);
result = memberController.insertMember(member);
System.out.println(result >0?"> 회원가입 성공!":"> 회원가입 실패!");
break;
case "5": break;
//이름, 성별, 생일, 이메일을 한번에 변경할 것.
case "6": break;
case "0": return;
default : System.out.println("잘못 입력하셨습니다.");
}
}
}
/*
* 사용자 입력값을 받아 member객체를 반환
*
* */
private Member inputMember() {
System.out.println("> 회원정보를 입력하세요");
System.out.print("아이디 : ");
String id= sc.next();
System.out.print("이름 : ");
String name=sc.next();
System.out.print("성별(M/F) : ");
String gender = String.valueOf(sc.next().toUpperCase().charAt(0));
System.out.print("생일(ex . 19990909) : ");
String temp = sc.next();
Date birthday=null;
//문자열 -> java.util.Date로 바꿨다가 java.sql.Date로 변환
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try {
birthday = new Date(sdf.parse(temp).getTime());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.print("이메일 : ");
String email = sc.next();
return new Member(id,name,gender,birthday,email,0,null);
}
}
member.model.vo.Member.java
package member.model.vo;
import java.sql.Date;
import java.sql.Timestamp;
/**
* VO
* -Value Object
* -Database 테이블과 대응한다.
* -field는 테이블의 컬럼과 대응한다.
* -VO객체하나가 테이블의 레코드와 대응한다.
* -
*
*/
public class Member {
private String id;
private String name;
private String gender;
private Date birthday;
private String email;
private int point;
private Timestamp regDate;
/*
이름 널? 유형
-------- -------- -------------
ID NOT NULL VARCHAR2(20)
NAME NOT NULL VARCHAR2(100)
GENDER CHAR(1)
BIRTHDAY DATE
EMAIL NOT NULL VARCHAR2(500)
POINT NUMBER
REG_DATE TIMESTAMP(6)
*/
public Member() {}
public Member(String id, String name, String gender, Date birthday, String email, int point, Timestamp regDate) {
super();
this.id = id;
this.name = name;
this.gender = gender;
this.birthday = birthday;
this.email = email;
this.point = point;
this.regDate = regDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public Timestamp getRegDate() {
return regDate;
}
public void setRegDate(Timestamp regDate) {
this.regDate = regDate;
}
@Override
public String toString() {
return "Member [id=" + id + ", name=" + name + ", gender=" + gender + ", birthday=" + birthday + ", email="
+ email + ", point=" + point + ", regDate=" + regDate + "]";
};
}
member.model.dao.MemberDao.java
package member.model.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import member.model.vo.Member;
/**
* Dao
* Database Access Object
* 전달받은 데이터를 바탕으로 database에 질의(DQL/DML)하는 객체
*/
public class MemberDao {
final String driverClass="oracle.jdbc.OracleDriver";
final String url = "jdbc:oracle:thin:@localhost:1521:xe"; //db접속프로토콜@ip:포트:db명(sid)
final String user = "student";
final String password = "student";
public int insertMember(Member member) {
Connection conn=null;
PreparedStatement pstmt=null;
int result=0; //처리 행 수
String sql = "insert into member values(?, ?, ?, ?, ?, default, default)";
try {
//1. jdbc driver class 등록
Class.forName(driverClass);
//2. Connection 객체 생성 & autoCommit false로 설정
conn=DriverManager.getConnection(url,user,password);
conn.setAutoCommit(false);
//3. PreparedStatement객체 생성 & 미완성 쿼리 값대입
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, member.getId());
pstmt.setString(2, member.getName());
pstmt.setString(3, member.getGender());
pstmt.setDate(4, member.getBirthday());
pstmt.setString(5, member.getEmail());
//4. executeUpdate 실행 & 정수형(처리된 행수)리턴값
result=pstmt.executeUpdate();
//5. 트랜잭션
conn.commit();
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally {
//6. 자원반납 : 생성의 역순으로 반환
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
}
member.controller.MemberController.java
package member.controller;
import member.model.dao.MemberDao;
import member.model.vo.Member;
/**
* Controller 클래스
* - MVC패턴의 가장 중추역할
* - view로부터 요청을 받아 dao로 다시 요청을 전달하는 구조.
* - (돌아올때)dao의 처리 결과값을 받아 view로 리턴처리. (응답)
*/
public class MemberController {
private MemberDao memberDao = new MemberDao();
public int insertMember(Member member) {
int result = memberDao.insertMember(member);
return result;
}
}
다음과 같이 구성하고 실행한다.
아직 회원 가입만 만들었으므로, 유관순을 추가해보자.
java에서는 추가되었다고 뜬다. 그럼 실제로 db에도 변경이 되었을까?
변경되었다. 1번 행에 유관순이 추가된 것을 확인할 수 있다!!
이와 같이 다음시간에는 더 다양한 기능 (삭제, 변경, 조회 등 ) 을 배워볼 예정이다.