728x90

■ JDBC

- 자바 DB간의 연동을 해주는 API -> Interface(규약) 

비휘발성 데이터

1. 메모장, 한글, 워드, 엑셀

2. FireBase 서버를 통한 저장 

3. Database를 통해 컴퓨터에 저장

==> 3번 활용

 

순서

1. 데이터 베이스 연결 (Oracle,MariaDB,MySQL등)

Oracle -> Connection사용

MySQL -> getCon사용

하지만 인터페이스(Connection)로 통일 시킨다.

- DB연결에 필요한것

1) Oracle -> 라이브러리, 드라이버(패키지안에 있는 클래스 필요)

2) user ID,PW 필요(HR/HR), url필요

3) SQL문 준비 ,결과값 처리하기

4) 사용한 기능 닫기

* Oracle ojdbc6.jar파일 import

--> 프로젝트 우클릭 / Build path / Configure Build Path
-> libraries -> Add External JARs 

*DB연결

1) JDBC Driver 로딩
*DriverManger 클래스.
-> JDBC Driver를 통해서 Connection 만드는 역할
--> Class.forName("oracle.jdbc.driver.OracleDriver"); 메소드를 통해서 생성. 
--> 드라이버를 구현하는 작업.
--> ClassNotFoundException 에러 --> 프로젝트 ojdbc6.jar 

 

2) 통로 연결(Connection)
-> Connection 인터페이스
SQL문장 정의, 실행시킬수 있는 Statement 객체 생성해주기 위한 인터페이스.
-> Connection 객체를 사용. 

3) Statement 인터페이스/PreparedStatement 인터페이스.
Statement인터페이스 : Connection 객체를 통해서 구현되는 일종의 메소드 집합. 
--> Statement 객체 생성하고 SQL 질의문 실행할때 사용.
executeQuery() 메소드 호출 -> Select문
--> 단순 질의문 질의 할때 사용. 
// 한번 실행 될때마다 새로 분석이 필요함. --> 실행속도 느림. 
//실행될때마다 매번 서버에서 분석 --> 실행속도 빠름. 재사용성 용이. 
4) PreparedStatement 인터페이스.
1. 동일한 질의문 반복적으로 수행, 값만 바꾸어서 여러번 실행할 경우. 
2. 데이터들이 많아서 질의문 정리할 필요가 있을때 

"위치홀더" :  '?' 인자로 사용 --> 일종의 토큰
--> SQL 문장이 실행되기 이전에 실제 값으로 대체. 

3. ResultSet 인터페이스.
SQL문(Select) 사용 성공 -> ResultSet 반환(리턴)
--> 테이블형태(행/열) 
--> Cursor(커서) 
제일 처음에는 첫번째 행 바로 앞에 가리키고 있다.
next() 메소드를 통해서 다음 위치로 넘어가게 해줍니다. 


3) SQL(Query)문 전송

4) 연결 종료. 

회원가입 insert문 만들기 예제)

실행 코드

package JDBC기초;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class ex01Insert {

	public static void main(String[] args) {
		
		 Scanner sc = new Scanner(System.in);
	     PreparedStatement psmt = null;
	     Connection conn = null;

		
		System.out.print("ID를 입력해 주세요 >> ");
		String id = sc.next();
		System.out.print("PW를 입력해 주세요 >> ");
		String pw = sc.next();
		System.out.print("이름를 입력해 주세요 >> ");
		String name = sc.next();
		
		// JDBC연결과정
		// 1. 데이터베이스 연결
		// 1-1) 드라이버 동적로딩
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// -> 어떤 데이터베이스를 사용할건지
			// oracle.jdbc.driver ---> ojdbc6.jar 패키지명
			// OracleDriver --> 클래스명
						
			// 동적로딩
			// : 실행하는 순간 자료형이 결정되는 것(OracleDriver로 자료형으로 바뀜)
			// static (정적인 저장공간) : 실행되는 순간 바로 로딩이 되는 것
			// static 저장되는 것들은 다 글꼴이 기울임꼴
			
			// 1-2) 데이터 베이스 연결에 필요한 준비물
			// 데이터 베이스의 주소 : url
			// 데이터 베이스 계정 : user
			// 데이터 베이스 비밀번호 : password
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			// jdbc:oracle:thin -> thin 드라이버
			// @localhost -> ip주소(내 컴퓨터 ip주소의 키워드)
			// 1521 -> port번호
			// xe-> oracle의 별칭
			String user = "hr";
			String password = "hr";	
			
			conn = DriverManager.getConnection
					("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			// 2. Query문(SQL) 전송
			// 2-1) SQL문장 준비하기
			String sql = "insert into mem values(?,?,?)";
			// ?(입력값) : 어떤 값을 입력할지 모르기때문에 ?로 처리
			// 2-2) SQL문장 전송
			psmt = conn.prepareStatement(sql);
			// psmt라는 바구니가 비어있어 id, pw, name을 담아준다
			// 2-3) ?인자 채워주기(사용자가 입력한 데이터로)
			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, name);
			// psmt.set자료형(몇번째 물음표, 어떤값);
			int row = psmt.executeUpdate();
			//row 데이터가 수정이나 추가가 되었을경우 row가 0보다 크고
			// 변동이 없을 경우 0
			
			// 3. 결과값을 이용한 작업 처리하기
			if(row>0) {
				// 영향을 받은 행이 있다면
				System.out.println("데이터 추가 성공!");
			}else {
				System.out.println("데이터 추가 실패!");
			}
			
		} catch (ClassNotFoundException e) {
			// Class.forName에서 오류가 났을때
			System.out.println("드라이버 로딩 실패");
			e.printStackTrace();
		} catch (SQLException e) {
			// connection 오류났을때
			System.out.println("url,user,password 권한 오류");
			e.printStackTrace();
		} finally {
			// 중간에 예외 상황이 발생 하더라고 무조건 한번은 실행시켜서
			// 사용한 기능들을 닫아주는 구문
			// 4. 닫기(데이터베이스 자원 반납)
			// conn, psmt(사용한 역순으로 닫아주자 psmt -> conn
			try {
				// 지역변수로 오류생겨 전역변수로 바꾼다 
				// -> 후에 자원반납하다 생긴오류 잡기 위해 try catch문 작성
				// psmt, conn이 사용이 되었는지 확인 후 판단 -> 사용했으면 null(x)
				if(psmt != null) 
				psmt.close();
				if(conn != null)
				conn.close();
				// if문 실행코드 한줄이면 {}생략가능
			} catch (SQLException e) {
				 System.out.println("반납 시 오류");
				e.printStackTrace();
			} 	
		}	
	}
}

delete문 만들기)

실행코드

package JDBC기초;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class ex02Delete {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Connection conn = null;
		PreparedStatement psmt = null;
		
		System.out.print("삭제하고 싶은 ID의 설정된 이름 >> ");
		String name = sc.next();
		
		// 사용자로부터 입력받은 이름이 해당하는 id,pw,name(1개의 행)
		// 을 삭제하는 JDBC코드 작성해보기
		
		// sql = "delete 테이블명 where name = 사용자가 입력"
		// where은 Database의 조건절
		
		try {
			// 1. 드라이버 동적 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 2. 데이터 베이스 연결에 필요한 준비물
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			
			conn = DriverManager.getConnection
					("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			// 3. sql문 준비하기
			String sql = "delete from mem where name = ? ";
			psmt = conn.prepareStatement(sql);
			// ? 인자 채우기
			psmt.setString(1,name);
			
			// 4. 결과값 받아오기, sql문 전송
			// delete, insert, update... executeUpdate()
			// 영향을 받은 행이 있는지(0>row), 없는지(0<=row) int row(자료형) 결과값
			int row = psmt.executeUpdate();
			if(row>0) {
				System.out.println("데이터 삭제 성공");
			}else {
				System.out.println("데이터 삭제 실패");
			}
			
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("권한 오류");
			e.printStackTrace();
		} finally {
			try {
				if(psmt!=null)
					psmt.close();
				if(conn!=null)
					conn.close();
			}catch (SQLException e) {
				 System.out.println("반납 시 오류");
				e.printStackTrace();
			} 
		}	
	}
}

select문 

실행코드

package JDBC기초;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ex03Select {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		// ResultSet
		// 동적 로딩
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";

			conn = DriverManager.getConnection(url, user, password);

			// sql문 준비
			String sql = "select * from mem";
			psmt = conn.prepareStatement(sql);
			// select문에 ? 인자가 없어서 따로 채우지 않는다
			rs = psmt.executeQuery();
			while (rs.next()) {
				String id = rs.getString("id");
				String pw = rs.getString("pw");
				String name = rs.getString("name");
				System.out.println(id + " " + pw + " " + name);
			}

		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 오류");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("권한 오류");
			e.printStackTrace();
		} finally {
			// conn,psmt, rs
			// 열어준 역순으로 닫아주기
			try {
				if (rs != null)
					rs.close();
				if (psmt != null)
					psmt.close();
				if (conn != null)
					conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

회원관리 프로그램 만들기 예제)

MemberVO.java

package 회원정보관리프로그램;

public class MemberVO {
	// 필드 구성 --> 데이터 베이스 컬럼명 동일
	private String id;
	private String pw;
	private String name;
	
	// 생성자 만들기
	public MemberVO(String id, String pw, String name) {
		this.id = id;
		this.pw = pw;
		this.name = name;
	}
	public MemberVO(String id, String pw) {
		this.id = id;
		this.pw = pw;
	}
	
	// Getter / Setter
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPw() {
		return pw;
	}

	public void setPw(String pw) {
		this.pw = pw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}		
}

DAO.java

package 회원정보관리프로그램;

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

public class DAO {

	private Connection conn;
	private PreparedStatement psmt;
	private ResultSet rs;

	private void getConnection() { // connection 해주는 메소드
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";

			conn = DriverManager.getConnection(url, db_id, db_pw);
			if (conn != null) {
				System.out.println("연결 성공");
			} else {
				System.out.println("연결 실패");
			}

		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 연결 실패");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("권한 부여 실패");
			e.printStackTrace();
		}
	}
	private void close() {

		try {
			if (rs != null) {
				rs.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	// 회원가입 메소드
	public int insert(String id, String pw, String name) {
		int cnt = 0; // 리턴받기위한 변수
		try {
			getConnection();
			String sql = "INSERT INTO MEM values(?,?,?)";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, name);

			cnt = psmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;
	}
	// 회원 조회
	public ArrayList<MemberVO> select(){
		ArrayList<MemberVO> list = new ArrayList<>();
		
		try {
			getConnection();
			String sql = "select * from mem";
			psmt = conn.prepareStatement(sql);
			rs = psmt.executeQuery();
			
			while (rs.next()) {
				String id = rs.getString(1);
				String pw = rs.getString(2);
				String name = rs.getString(3);
				
				MemberVO vo = new MemberVO(id, pw, name);
				list.add(vo);
			}
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return list;
	}
	// 회원 정보 삭제
	public int delete(String id) {
		int cnt = 0;
		try {
			getConnection();
			String sql = "delete from mem where id = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			cnt = psmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;
	}
	// 특정회원정보 조회
	public MemberVO selectOne(String sid) {
		MemberVO vo = null;
		try {
			getConnection();
			String sql = "select * from mem where id = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, sid);
			rs = psmt.executeQuery();
			
			if(rs.next()) {
				String id = rs.getString(1);
				String pw = rs.getString(2);
				String name = rs.getString(3);
				
				vo = new MemberVO(id,pw,name);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return vo;
	}
	// 로그인
	public MemberVO login(String id, String pw) {
		MemberVO vo = null;
		try {
			getConnection();
			String sql = "select * from mem where id = ? and pw = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			psmt.setString(2, pw);
			rs = psmt.executeQuery();
			if(rs.next()) {
				id= rs.getString(1);
				pw= rs.getString(2);
				vo = new MemberVO(id,pw);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return vo;	
	}
}

+ 로그인 다른 코드화면

main.java

package 회원정보관리프로그램;

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

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		DAO dao = new DAO();
		System.out.println("======= 회원정보관리시스템 =======");
		
		
		while (true) {
			System.out.print("[1]로그인 [2]회원가입 [3]전체조회 " + "[4]특정회원조회 [5]회원정보삭제 [6]프로그램종료 >> ");
			// [1]로그인 [2]회원가입 [3]전체조회 [4]특정회원조회 [5]회원정보삭제 [6]프로그램종료
			int num = sc.nextInt();
			if (num == 1) {
				System.out.println("로그인");
				System.out.print("ID : ");
				String id = sc.next();
				System.out.print("PW : ");
				String pw = sc.next();
				MemberVO vo = dao.login(id, pw);
				if(vo!= null) {
					System.out.println("로그인 완료");
				}else {
					System.out.println("로그인 실패");
				}
				
			} else if (num == 2) {
				System.out.println("회원가입");
				System.out.print("ID : ");
				String id = sc.next();
				System.out.print("PW : ");
				String pw = sc.next();
				System.out.print("Name : ");
				String name = sc.next();
				int cnt = dao.insert(id, pw, name);
				if(cnt>0) {
					System.out.println("회원가입완료");
				}else {
					System.out.println("가입실패");
				}
			} else if (num == 3) {
				System.out.println("전체조회");
				ArrayList<MemberVO> list = dao.select();
				for(int i=0; i<list.size(); i++) {
					System.out.print("id : " + list.get(i).getId()+"\t");
					System.out.print("pw : " + list.get(i).getPw()+"\t");
					System.out.print("name : " + list.get(i).getName()+"\t");
					System.out.println();
				}
			} else if (num == 4) {
				System.out.println("특정회원조회");
				System.out.print("ID 입력 >> ");
				String sid = sc.next();
				MemberVO vo = dao.selectOne(sid);
				if(vo != null) {
					System.out.println("ID : " +vo.getId()+"/ PW : "+ vo.getPw()+"/ Name : "+vo.getName()+"/ ");
				}else {
					System.out.println("존재하지 않습니다");
				}
			} else if (num == 5) {
				System.out.println("회원정보삭제");
				System.out.print("삭제할 ID 입력 >> ");
				String id = sc.next();
				int cnt = dao.delete(id);
				if(cnt>0) {
					System.out.println("삭제 완료");
				}else {
					System.out.println("삭제 실패");
				}
			} else if (num == 6) {
				System.out.println("프로그램종료");
				break;
			}
		}
	}
}

+ 로그인 다른코드

 

728x90

'Study > JAVA' 카테고리의 다른 글

JAVA기초 14일차 <MVC패턴, 상속, 추상화>  (1) 2022.09.26
JAVA기초 13일차 <arraylist>  (1) 2022.09.24
JAVA기초 12일차 <객체지향2>  (0) 2022.09.24
JAVA기초 11일차 <객체지향>  (1) 2022.09.24
JAVA기초 10일차 <메서드>  (0) 2022.09.24
복사했습니다!