본문 바로가기

국비지원_핀테크

18일차_ [java] DB 연동

 

 

 

 

DB 연동

create table member_test(
    id varchar2(20) primary key,
    pwd varchar2(20),
    name varchar2(20),
    age number
);

insert into member_test values ('aaa', 'aaa', '홍길동', 20);
insert into member_test values ('bbb', 'bbb', '김개똥', 30);
insert into member_test values ('ccc', 'ccc', '고길똥', 40);
commit;

sqldeveloper 에서 연동용 member_test 테이블 하나 미리 생성해둠

 

프로젝트 생성

 

package ex01;

public class MemberDTO {
	// DB 의 컬럼과 동일한 자료형으로 DTO 생성
	private String id, pwd, name;
	private int age;
	
	// setter/getter 추가
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

DTO 에는 DB 의 컬럼 자료와 같은 자료형, 컬럼 명으로 변수를 생성

 

 

DB 다운로드 경로에 jdbc 폴더 하위에 ojdbc8.jar 라이브러리를 프로젝트에 추가해줘야 한다

ojdbc 라이브러리 추가 방법

 

 

ojdbc8 추가 후 module-info.java 파일에 sql 기능을 추가로 명시해줘야 작동한다

 

 

 

DB 연동 순서

프로젝트 라이브러리에 jdbc 를 추가 (위 동영상 참고) > module-info 에 라이브러리 추가 문구 작성 > 오라클 명령어를 사용할 수 있게 드라이버를 연동 ( Class.forName("oracle.jdbc.driver.OracleDriver") > Connection 객체를 통해 DB 연결 > PreparedStatement 객체를 통해 명령어를 DB 에 전송 > ResultSet 객체를 통해 명령어 수행 결과를 저장하여 출력

                             

package ex01;

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

class DB_con{
	// 연결을 시켜주는 Connetion 객체 ( 연결된 정보를 가지고 있음 )
	private Connection con;
	// 명령어를 전송하는 역할을 하는 PreparedStatement 객체
	private PreparedStatement ps;
	// 명령어 수행 결과 데이터를 저장하는 ResultSet 객체
	private ResultSet rs;
	
	public DB_con() {
		try {
			// jdbc 라이브러리 등록이 완료되었다면 아래 코드를 통해 오라클 드라이버의 기능을 사용할 수 있다
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("오라클 기능 사용가능(드라이버 로드)");
			
			// 18 버전 이전 : xe, 19 버전 이상 : orcl
			String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // 오라클 DB 정보 ( 아이피:포트번호:버전 )
			String id = "c##youngho3358"; // DB 아이디
			String pwd = "1234"; // DB 비밀번호
			
			// 예외처리가 필요하므로 아래 catch 에서 exception 하나로 예외를 모두 처리
			// con 은 연결만 담당
			con = DriverManager.getConnection(url, id, pwd);
			System.out.println("db 연결 성공 : " + con);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<MemberDTO> select() {
		// 명령어를 문자열 형태로 담아서 사용
		String sql = "select * from member_test";
		// DTO 객체를 ArrayList 형태로 저장 ( 사용자들을 배열 형태로 저장 )
		ArrayList<MemberDTO> arr = new ArrayList<>();
		try {
			// ps 는 명령어를 전달하는 객체 ( 연결된 정보를 토대로 명령어를 전달 )
			ps = con.prepareStatement(sql);
			
			// ps 로 명령어를 전송하여 출력된 내용을 ResultSet 객체로 저장
			rs = ps.executeQuery();
			// System.out.println(rs.next());
			
			// 각 데이터를 자료형에 맞게끔 저장
			// rs 는 iterator 와 같은 방법으로 작동
			// ResultSet 의 메소드 getString() 의 괄호 안의 값은
			// 출력하고자 하는 컬럼의 이름이 들어가야 한다.
			while(rs.next()) {
				// DTO 에 출력되는 값들을 저장
				MemberDTO dto = new MemberDTO();
				dto.setId(rs.getString("id"));
				dto.setPwd(rs.getString("pwd"));
				dto.setName(rs.getString("name"));
				dto.setAge(rs.getInt("age"));
				
				// ArrayList 로 DTO 정보(DB로 받아온 정보)들을 배열로 저장
				arr.add(dto);
				
				/*
				System.out.println(rs.getString("id"));
				System.out.println(rs.getString("pwd"));
				System.out.println(rs.getString("name"));
				System.out.println(rs.getInt("age"));
				System.out.println("-------------------------");
				*/
			}
			
			/*
			System.out.println(rs.next());
			System.out.println(rs.getString("id"));
			System.out.println(rs.getString("pwd"));
			System.out.println(rs.getString("name"));
			System.out.println(rs.getInt("age"));
			
			System.out.println(rs.next());
			System.out.println(rs.getString("id"));
			System.out.println(rs.getString("pwd"));
			System.out.println(rs.getString("name"));
			System.out.println(rs.getInt("age"));
			
			System.out.println(rs.next());
			*/
		} catch (Exception e) {
			e.printStackTrace();
		}
		return arr;
	}
	
	// 유저가 입력한 userId 를 전달받아 검색
	public MemberDTO selectOne(String userId) {
		// userId 값으로 검색하는 부분을 쿼리문으로 작성할때 문자열을 작음따옴표로 감싸줘야 함!!!!!!!
		String sql = "select * from member_test where id='" + userId + "'";
//		System.out.println(sql);
		
		MemberDTO dto = null;
		try {
			// 쿼리문을 DB로 전송
			ps = con.prepareStatement(sql);
			// 쿼리문이 작동된 결과 값을 저장
			rs = ps.executeQuery();
			
			// 검색된 결과 값이 있으면 DTO 객체에 해당 내용을 저장
			// 만약 검색될 결과 값이 없으면 DTO 객체는 null 값을 가진다
			if(rs.next()) {
				dto = new MemberDTO();
				dto.setId(rs.getString("id"));
				dto.setPwd(rs.getString("pwd"));
				dto.setName(rs.getString("name"));
				dto.setAge(rs.getInt("age"));
				/*
				System.out.println(rs.getString("id"));
				System.out.println(rs.getString("pwd"));
				System.out.println(rs.getString("name"));
				System.out.println(rs.getInt("age"));
				*/
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return dto;
	}
	
	public int delete(String delId) {
		// ? 자리에 나중에 값을 채워넣겠다는 뜻
		String sql = "delete from member_test where id=?";
		int result = 0;
		try {
			ps = con.prepareStatement(sql);
			
			// 1 번째 물음표에 sql 을 대입한다는 뜻
			ps.setString(1, delId);
			
			// 쿼리문 동작 후 반환 값이 ResultSet 형태로 받을 필요가 없으니 executeUpdate() 메소드 사용하여
			// 리턴 값인 int 변수로 전달 받는다.
			// 쿼리문을 실행 시 정상 작동한다면 = 1 을 리턴
			// 쿼리문을 실행 시 오류가 발생한다면 = 0 을 리턴
			result = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public int insert(MemberDTO dto) {
		String sql = "insert into member_test values(?,?,?,?)";
		int result = 0;
		try {
			ps = con.prepareStatement(sql);
			// 첫번째 물음표에 dto.getId 값 입력
			ps.setString(1, dto.getId());
			// 두번째 물음표에 dto.getPwd 값 입력
			ps.setString(2, dto.getPwd());
			// 세번째 물음표에 dto.getName 값 입력
			ps.setString(3, dto.getName());
			// 네번째 물음표에 dto.getAge 값 입력
			ps.setInt(4, dto.getAge());
			
			// insert 쿼리문을 사용할때 ps.executeUpdate(); 의 결과 값은
			// 성공 : 1, 실패 시 오류 문구가 출력된다 그래서 catch 로 넘어가게 되므로
			// 아이디 생성 실패 시 result 값은 최초 초기화 값인 0 이 리턴된다.
			result = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
}

public class MainClass {
public static void main(String[] args) {
	DB_con db = new DB_con();
	
	Scanner input = new Scanner(System.in);
	int num;
	while(true) {
		System.out.println("1. 모든 목록보기");
		System.out.println("2. 특정 사용자 보기");
		System.out.println("3. 데이터 추가");
		System.out.println("4. 데이터 삭제");
		System.out.print(">>> : ");
		num = input.nextInt();
		switch(num) {
		case 1: 
			// ArrayList 로 담아온 정보를 반복문을 통해 출력
			ArrayList<MemberDTO> arr = db.select();
			System.out.println("--main--");
			for(MemberDTO dto : arr) {
				System.out.println("id : " + dto.getId());
				System.out.println("pwd : " + dto.getPwd());
				System.out.println("name : " + dto.getName());
				System.out.println("age : " + dto.getAge());
				System.out.println("-------------------");
			}
			break;
		case 2: 
			System.out.print("검색 id 입력 : ");
			String userId = input.next();
			// 입력받은 userId 값을 db 클래스의 selectOne 메소드로 넘겨줌
			// 메소드에서 실행되어 받아온 값을 DTO 형식으로 반환받아서 변수에 저장
			// id 가 존재한다면 dto 에 값이 정상적으로 들어갔을 것이며, 만약
			// id 가 존재하지 않는다면 dto 는 객체 생성 초기 값인 null 이 설정되어 있을 것이다.
			MemberDTO dto = db.selectOne(userId);
			if(dto == null) {
				// 만약 사용자가 존재하지 않아 dto 값이 null 로 반환되었다면
				System.out.println("존재하지 않는 id입니다!!!");
			}else {
				// 사용자가 존재해 dto 값이 쿼리문 결과 값으로 저장되었다면
				System.out.println("---- 검색 결과 ----");
				System.out.println("id : " + dto.getId());
				System.out.println("pwd : " + dto.getPwd());
				System.out.println("name : " + dto.getName());
				System.out.println("age : " + dto.getAge());
			}
			
			break;
		case 3: 
			MemberDTO d = new MemberDTO();
			
			// id 가 동일한 데이터가 db 에 존재하는지 확인
			while(true) {
				System.out.print("가입할 id 입력 : ");
				d.setId(input.next());
				MemberDTO dd = db.selectOne(d.getId());
				if (dd==null) {
					break;
				}
				System.out.println("존재하는 id... 다시 입력...");
			}
			
			System.out.print("가입할 pwd 입력 : ");
			d.setPwd(input.next());
			System.out.print("가입할 name 입력 : ");
			d.setName(input.next());
			System.out.print("가입할 age 입력 : ");
			d.setAge(input.nextInt());
			
			int res = db.insert(d);
			if(res == 1) {
				System.out.println("회원가입 성공!!!!");
			}else {
				System.out.println("존재하는 id는 안됨!!!");
			}
			break;
		case 4: 
			System.out.print("삭제 id 입력 : ");
			String delId = input.next();
			int re = db.delete(delId);
			if(re==1) {
				// 아이디가 존재해 쿼리문이 정상적으로 작동했다면...
				System.out.println("삭제 성공!!!");
			}else {
				// 아이디가 존재하지 않아 쿼리문이 정상적으로 작동하지 않았다면...
				System.out.println("존재하지 않는 아이디... 삭제 불가!!!");
			}
			break;
		}
	}
}
}
728x90