<이공계전문기술연수> 7. JDBC(Java Database Connectivity)

2019. 11. 22. 16:07· 이공계전문기술연수/Database

@JDBC

-> Java Database Connectivity 의 약자
-> 자바언어에서 DataBase에 접근 할 수 있게 해주는 Programming API
-> 각 DMBS 제조사에서 jar 파일을 구현해서 제공
-> java.jql 패키지에서 관리


@OJDBC
-> 오라클에서 제공하는 오라클 DB와 자바가 연결하기 위한 라이브러리
오라클버전별로 파일이름이 다름
-oracle 7 : classes111.zip
-oracle 8 : classes12.zip
-oracle 9i : ojdbc14.jar
-oracle 10g : ojdbc14.jar
-oracle 11g : ojdbc6.jar


C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib -> 여기서 가져옴
C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext -> 여기에 넣어야됨 API

기본 문제셋 인코딩 방식 통일
-> Java 에서 사용하는 문자셋은 ms949
-> oracle에서 사용하는 문자셋은 utf-8
-> UTF-8로 통합


1. windows -> preferences - > general -> worksapce -> other : UTF-8
2. windows -> preferences - > general -> editors -> spelling -> other : UTF-8
3. windows -> preferences - > JSON -> JSON files -> encoding : UTF-8
4. windows -> preferences - > web -> CSS files -> encoding : UTF-8
5. windows -> preferences - > web -> HTML files -> encdoing : UTF-8
6. windows -> preferences - > web -> jsp files -> encdoing : UTF-8
7. windows -> preferences - > XML files -> encdoing : UTF-8  
8. 프로젝트 만들고 - > properties -> libraries -> 등록

 

 

JDBC 사용 객체

## DriverManeger ##
-> JDBC 드라이버를 통해서 커넥션을 만드는 역할

## Connection ##
-> 특정 데이터베이스와 연결된 커넥션

## Statement ##
-> Connection 객체에 의해 프로그램에 리턴되는 객체
-> Query 문을 수행하는 역할 (Query문을 String 객체에 담아서 전달)

## PreparedStatement ##
-> Statement를 상속해서 만든 객체

## ResultSet ##
-> Select문 질의 성공 시 리턴되는 데이터를 담는 객체
-> cursor(커서)를 가지고 특정 행 대한 참조를 조작
 내가 바라보고 있는 행의 위치>

 

## PreparedStatment ## Statement 
-> Connection 객체의 preparedStatement() 메소드를 사용하여 객체를 생성 
-> SQL 구문을 미리 컴파일하고, 실행시간동안 인수값을 위한 공간을 확보 할 수 있다. 
-> (변수자리) 
-> 각각의 인수에 대해 위치홀더(?)를 사용하여 SQL문장을 정의 

SELECT * FROM MEMBER WHERE MEMBER_ID = 'USER01'; 
SELECT * FROM MEMBER WHERE MEMBER_ID = ? 

setString() 메소드로 값을 셋팅해서 사용 
setString(1, 'USER01'); 

 

@ 트랜잭션
-> 한번에 처리되어야 할 최소 작업단위

ex1) 1개의 트랜잭션에 DML 3개가 존재할때

 


Controller
Connection 객체 생성
1. DAO 호출 시 Connection 객체를 매개변수로 전달
2. DAO 호출 시 Connection 객체를 매개변수로 전달

 

5. 리턴받은 데이터를 확인하면 commit , rollback 수행
6. Connection 객체 소멸
7. View를 이용하여 결과 출력

DAO

3. 매개변수로 받은 Connection 객체를 사용해서 DML 수행
4. 결과값 리턴

 

<<실습>>

Eclipse package

(1) src.org.kh.model.vo

package org.kh.medel.vo;

import java.sql.Date;

public class Member {
	private String memberId;
	private String memberPw;
	private String memberName;
	private String email;
	private int age;
	private String addr;
	private String gender;
	private Date enrollDate;
	
	public Member() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Member(String memberId, String memberPw, String memberName, String email, int age, String addr,
			String gender, Date enrollDate) {
		super();
		this.memberId = memberId;
		this.memberPw = memberPw;
		this.memberName = memberName;
		this.email = email;
		this.age = age;
		this.addr = addr;
		this.gender = gender;
		this.enrollDate = enrollDate;
	}
	public Member(String memberId, String memberPw, String memberName, String email, int age, String addr,
			String gender) {
		super();
		this.memberId = memberId;
		this.memberPw = memberPw;
		this.memberName = memberName;
		this.email = email;
		this.age = age;
		this.addr = addr;
		this.gender = gender;
		
	}
	public String getMemberId() {
		return memberId;
	}
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPw() {
		return memberPw;
	}
	public void setMemberPw(String memberPw) {
		this.memberPw = memberPw;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public Date getEnrollDate() {
		return enrollDate;
	}
	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
	
	@Override
	public String toString() {
		return memberId+"\t"+memberName+"\t"+email+"\t"+age+"\t"+addr+"\t"+
				gender+"\t"+enrollDate;
	}
	
	
	
}

(2) src.org.kh.controller

package org.kh.controller;

import java.util.ArrayList;

import org.kh.medel.dao.MemberDao;
import org.kh.medel.vo.Member;
import org.kh.view.MemberView;

public class MemberController {
	MemberDao md = new MemberDao();
	MemberView mv = new MemberView();
	
	public void updateMember(String searchId) {
		Member m = md.searchId(searchId);
		if(m==null) {
			mv.printMsg("회원정보가 없습니다.");
			return;
		}
		Member updateMember = mv.updateMember();
		updateMember.setMemberId(searchId);
		int result = md.updateMember(updateMember);
		
		if(result > 0) {
			mv.printMsg("삭제성공");
		}else {
			mv.printMsg("회원정보가 없습니다.");
		}
	}
	
	public void printAll(){
		ArrayList<Member> list = md.printAll();
		for(Member m : list) {
			mv.printMsg(m.toString());
		}
	}
	
	public void searchId(String searchId) {
		Member m = md.searchId(searchId);
		
		if(m != null) {
			mv.printMsg(m.toString());
		}else {
			mv.printMsg("회원 정보가 없습니다.");
		}
	}
	
	public void searchName(String name){
		ArrayList<Member> list = md.searchName(name);
		if(!list.isEmpty())
		{
			for(Member m : list) {
				mv.printMsg(m.toString());
			}
		}else {
			mv.printMsg("회원정보가 없습니다.");
		}
	}
	
	public void insertMember(String insertId) {
		Member m = md.searchId(insertId);
		if(m != null) {
			mv.printMsg("이미 존재하는 회원입니다.");
			return;
		}
		
		Member m2 = mv.insertMember(insertId);
		int result = md.insertMember(m2);
		
		if(result > 0) {
			mv.printMsg("회원가입 성공");
		}else {
			mv.printMsg("회원가입 실패");
		}
	}
	
//	public void updateMember(String[] ar) {
//		int result = md.updateMember(ar);
//		if(result > 0) {
//			mv.printMsg("삭제성공");
//		}else {
//			mv.printMsg("회원정보가 없습니다.");
//		}
//	}
//	
	public void deleteMember(String id) {
		int result = md.deleteMember(id);
		if(result > 0) {
			mv.printMsg("삭제성공");
		}else {
			mv.printMsg("회원정보가 없습니다.");
		}
	}
}

(3) src.org.kh.model.dao

package org.kh.medel.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.kh.medel.vo.Member;

public class MemberDao {
	public ArrayList<Member> printAll() {
		// 조회 결과를 담을 list객체 생성
		ArrayList<Member> list = new ArrayList<Member>();
		// Connection 객체
		Connection conn = null;
		// SQL구문 사용 객체
		Statement stmt = null;
		// select 결과 저장 객체
		ResultSet rset = null;
		// 전송할 쿼리문
		String query = "select * from member";

		try {
			// 1. 사용할 DB에 대한 드라이버 등록(클래스 등록)
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 2. 등록된 클래스를 이용해서 DB연결
			// -> 실패하면 NULL, -> 성공시 Connection 객체생성
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "jdbc", "1234");
			// 3. 쿼리문을 실행할 Statement 객체를 생성
			stmt = conn.createStatement();
			// 4. 쿼리문 전송하고 실행결과 받기
			rset = stmt.executeQuery(query);
			while (rset.next()) {
				String memberId = rset.getString("member_id");
				String memberPw = rset.getString("member_pw");
				String memberName = rset.getString("member_name");
				String email = rset.getString("email");
				int age = rset.getInt("age");
				String addr = rset.getString("addr");
				String gender = rset.getString("gender");
				Date enrollDate = rset.getDate("enroll_date");
				Member m = new Member(memberId, memberPw, memberName, email, age, addr, gender, enrollDate);
				list.add(m);
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	return list;
	}
	
	public Member searchId(String searchId) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		Member m = null;
		String query = "select * from member where member_id =?";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","jdbc","1234");
			
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, searchId);
			rset = pstmt.executeQuery();
			if(rset.next()) {
				m = new Member();
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPw(rset.getString("member_pw"));
				m.setMemberName(rset.getString("member_name"));
				m.setAddr(rset.getString("addr"));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				m.setGender(rset.getString("gender"));
				
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return m;
		
	}
	
	public ArrayList<Member> searchName(String name){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		ArrayList<Member> list = new ArrayList<Member>();
		Member m = null;
		String query = "select * from member where member_name like ?";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","jdbc","1234");
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, "%"+name+"%");
			rset = pstmt.executeQuery();
			
			while(rset.next()) {
				m = new Member();
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPw(rset.getString("member_pw"));
				m.setMemberName(rset.getString("member_name"));
				m.setAddr(rset.getString("addr"));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				m.setGender(rset.getString("gender"));
				
				list.add(m);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return list;
	}
	
	public int insertMember(Member m) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		String query = "insert into member values(?,?,?,?,?,?,?,sysdate)";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","jdbc","1234");
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPw());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4, m.getEmail());
			pstmt.setInt(5, m.getAge());
			pstmt.setString(6, m.getAddr());
			pstmt.setString(7, m.getGender());
			
//			pstmt.setString(8, "sysdate");
			
			result = pstmt.executeUpdate();
			
			if(result>0) {
				conn.commit();
			}else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return result;
		
	}
	
	public int updateMember(Member updateMember) {
		
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		//update member set member_name = 'member_name', email = 'email', addr = 'addr', 
		//gender ='gender' where memberId = 'memberId';
		
//		String query = "update member set member_name = '"+updateMember.getMemberName()+"', "
//						+"email = '"+updateMember.getEmail()+"', addr = '"+updateMember.getAddr()+"', gender ='"+updateMember.getGender()+"' where member_id = '"+updateMember.getMemberId()+"'";
				
		String query = "update member set member_name = ?, email = ?, addr = ?, gender = ? where member_id = ?";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","jdbc","1234");
			
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1,updateMember.getMemberName());
			pstmt.setString(2,updateMember.getEmail());
			pstmt.setString(3,updateMember.getAddr());
			pstmt.setString(4,updateMember.getGender());
			pstmt.setString(5,updateMember.getMemberId());
			result = pstmt.executeUpdate();
			if(result>0) {
				conn.commit();
			}else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return result;
		
		
		
	}
	
	
	public int deleteMember(String id) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		//update member set member_name = 'member_name', email = 'email', addr = 'addr', 
		//gender ='gender' where memberId = 'memberId';
		
		String query = "delete from member where member_id = ?";
				
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","jdbc","1234");
			
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1,id);
			result = pstmt.executeUpdate();
			if(result>0) {
				conn.commit();
			}else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return result;
		
	}
	
	
	
	
	
	
	
	
	
	
	
}

(4) src.org.kh.view

package org.kh.view;

import java.util.ArrayList;
import java.util.Scanner;

import org.kh.controller.MemberController;
import org.kh.medel.vo.Member;

public class MemberView {
	Scanner sc = new Scanner(System.in);
	public void mainMenu() {
		MemberController mc = new MemberController();
		while(true) {
			System.out.println("=== 회원 관리 프로그램 ===");
			System.out.println("1. 회원 정보 전체 조회"); // select
			System.out.println("2. 회원 아이디 조회");	// select
			System.out.println("3. 회원 이름으로 검색"); // select
			System.out.println("4. 회원가입");		// insert
			System.out.println("5. 회원 정보 변경");	// update
			System.out.println("6. 회원 탈퇴");		// delete
			System.out.println("0. 프로그램 종료");
			System.out.println("7. 테스트"); 
			System.out.print("선택 > ");
			int choice = sc.nextInt();
			
			switch(choice) {
			case 1: 
				mc.printAll();
				break;
			case 2: 
				mc.searchId(searchId());
				break;
			case 3: 
				mc.searchName(searchName());
				break;
			case 4: 
				mc.insertMember(insertId());
				break;
			case 5:
				mc.updateMember(insertId());
				break;
			case 6: 
				mc.deleteMember(deleteMember());
				break;
			case 7:
				break;
			case 0:
				System.out.print("정말로 종료하시겠습니까?(y/n) : ");
				String end = sc.next();
				if(end.toLowerCase().charAt(0) == 'y') {
					return;
				}
				break;
			}
		}
	}

//	public void printAll() {
//		mc.printAll();
//	}
	public String insertId() {
		System.out.print("아이디를 입력하세요 : ");
		return sc.next();
		
	}
	public Member updateMember() {
		Member m = new Member();
		System.out.print("수정 할 이름 입력 : ");
		String memberName = sc.next();
		System.out.print("수정 할 이메일 입력 : ");
		String email = sc.next();
		System.out.print("수정 할 주소 입력 : ");
		String addr = sc.next();
		System.out.print("수정 할 성별 입력 : ");
		String gender = sc.next();
		m.setMemberName(memberName);
		m.setEmail(email);
		m.setAddr(addr);
		m.setGender(gender);
		return m;	
	}
	
	public String searchId() {
		System.out.print("조회할 아이디를 입력하세요 : ");
		String searchId = sc.next();
		return searchId;
		
	}
	
	public String searchName() {
		System.out.print("조회할 이름을 입력하세요 : ");
		String name = sc.next();
		return name;
		
	}
	public Member insertMember(String insertId) {
		String memberId = insertId;
		System.out.print("pwd 입력 : ");
		String memberPw = sc.next();
		System.out.print("이름 입력 : ");
		String memberName = sc.next();
		System.out.print("이메일 입력 : ");
		String email = sc.next();
		System.out.print("나이 입력 : ");
		int age = sc.nextInt();
		System.out.print("주소 입력 : ");
		String addr = sc.next();
		System.out.print("성별 입력(남자/여자) : ");
		String gender = sc.next();
		Member m = new Member( memberId, memberPw, memberName, email, age, addr,gender, null);
		return m;
	}
//	public String[] updateMember() {
//		String[] ar  = new String[5];
//		System.out.print("ID 입력 : ");
//		ar[0] = sc.next();
//		System.out.print("수정 할 이름 입력 : ");
//		ar[1] = sc.next();
//		System.out.print("수정 할 이메일 입력 : ");
//		ar[2] = sc.next();
//		System.out.print("수정 할 주소 입력 : ");
//		ar[3] = sc.next();
//		System.out.print("수정 할 성별 입력 : ");
//		ar[4] = sc.next();
//		
//		return ar;
//	}
	
	public String deleteMember(){
		System.out.print("삭제 할 회원 ID 입력: ");
		String id = sc.next();
		
		return id;
	}
	
	public void printMsg(String msg) {
		System.out.println(msg);
	}
}

(5) src.org.kh.run

package org.kh.run;

import org.kh.view.MemberView;

public class MemberRun {

	public static void main(String[] args) {
		MemberView mv = new MemberView();
		mv.mainMenu();
		
	}
}

'이공계전문기술연수 > Database' 카테고리의 다른 글

<이공계전문기술연수> 8. JDBC Template  (0) 2019.11.22
<이공계전문기술연수> 6. DB (INDEX , DECLARE)  (0) 2019.09.05
<이공계전문기술연수> 5. DB 실습  (0) 2019.09.04
<이공계전문기술연수> 4. DB (DDL / DML / DCL)  (0) 2019.09.03
<이공계전문기술연수> 3. DB 그룹 함수  (0) 2019.09.02
'이공계전문기술연수/Database' 카테고리의 다른 글
  • <이공계전문기술연수> 8. JDBC Template
  • <이공계전문기술연수> 6. DB (INDEX , DECLARE)
  • <이공계전문기술연수> 5. DB 실습
  • <이공계전문기술연수> 4. DB (DDL / DML / DCL)
임쟌
임쟌
임쟌
Jian's Blog
임쟌
전체
오늘
어제

공지사항

  • [자기소개]
  • 쟌's Blog (227)
    • Language (32)
      • Python (8)
      • Go (24)
      • Java (0)
    • Framework (10)
      • Django (9)
      • Gin (1)
      • Spring boot (0)
      • Fiber (0)
    • Database (10)
      • PostgreSQL (8)
      • MySQL (0)
      • Redis (2)
    • Server (51)
      • Linux (16)
      • Git (12)
      • Oracle Cloud Infrastructure (13)
      • Mac (4)
      • Docker (4)
      • RabbitMQ (0)
      • ETC (2)
    • Operating System (0)
      • OS (0)
    • Algorithm (22)
      • Go (22)
      • Python (0)
    • Exam Certification (4)
    • Daily Life (27)
      • Review (21)
      • Diary (6)
    • 이공계전문기술연수 (71)
      • Java (17)
      • Database (8)
      • HTML | CSS (13)
      • JavaScript | jQuery (6)
      • Servlet | JSP (16)
      • Spring Framework (11)

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
임쟌
<이공계전문기술연수> 7. JDBC(Java Database Connectivity)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.