Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ALLYES

[2022년 청년친화형 기업 ESG지원 사업 - 17] 본문

ESG

[2022년 청년친화형 기업 ESG지원 사업 - 17]

Allyes_99 2022. 9. 27. 17:54

일시 : 2022.09.27

시간 : 9:00 ~ 18:00


오전/오후 : Java


  • JDBC(Java DataBase Connectivity)
    • 개념
      • 자바 DB간 연결해주는 API
    • 실행 단계
      • JDBC Driver 동적 로딩
      • 데이터베이스 연결
      • SQL(Query)문 전송
      • 연결종료
  • DriverManager 클래스
    • JDBC 드라이버를 통해서 Connection 만드는 역할
      • Class.forName 메소드를 통해서 생성
      • Class.forName : 드라이버를 구현하는 작업
      • ClassNotFoundException 예외
        • 위 에러가 발생한 이유 : 프로젝트에 ojdbc6.jar 추가 x
        • 추가하는 방법 : 프로젝트 우클릭 - Build path - Configure build path - Libraries
    • DriverManager 클래스의 모든 메소드는 static 영역에 저장됨
      • 이로 인해 반드시 객체를 생성할 필요가 없음
    • Connection 인터페이스 객체 생성
      • getConnection() 메소드
  • Connection 인터페이스
    • SQL문장을 정의하고 실행 시킬 수 있는 Statement 객체를 생성하기 위해서 Connection  객체 사용 
    • Statement 인터페이스
      • Connection 객체를 통해 구현되는 메소드 집합 정의
      • Statement 객체 생성 후 SQL 질의문을 실행 할 경우 executeQuery() 메소드 호출 
        • 단순 질의문을 사용할 경우에 유용함
  • PrepareStatement 인터페이스
    • 개념 
      • 실행시간 동안에 인수 값을 위한 공간을 미리 확보 가능
      • SQL문장이 미리 컴파일
    • 실행 요건
      • 1. 동일한 질의문을 반복적으로 수행, 값만 바꾸어서 여러번 실행 할 경우
      • 2. 데이터들이 많아서 질의문을 정리할 필요가 있을 경우
      • 3. 인수들이 많을 때
    • Statement vs PrepareStatement
      • Statement 인터페이스 : 실행될 때 마다 매번 서버에서 분석 => 실행 속도 느림
      • PrepareStatement 인터페이스 : 한번 분석되면 재사용이 용이  => 실행 속도 빠름
    • 위치 홀더 
      • " ? " 인자로 사용
      • 일종의 토큰
      • SQL 문장이 실행되기 이전에 실제 값으로 대체
  • ResultSet 인터페이스
    • 개념 
      • SQL문(Select문) 사용 성공 : ResultSet 반환(리턴)
    • 형태 
      • 테이블 형태
      • 행과 열 존재
    • Cursor(커서)
      • 초기의 첫번 째 행 바로 앞을 가리키고 있음
      • ResultSet 객체의 메소드에 따라서 커서가 다음 위치로 이동

 

>> 키보드로 입력받아 출력하는 insert문

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

public class Ex01_insert {

	public static void main(String[] args) {
		// 키보드로부터 id/pw/name/age 등을 입력을 받고
		// JDBC Insert문 구현
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null; // 쿼리의 결과를 담은 객체

		try { // try-catch : 예외 처리를 하기 위한 문법
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. DB연결
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			String db_id = "hr";	// DB 연결 아이디
			String db_pw = "hr";	// DB 연결 비밀번호

			conn = DriverManager.getConnection(url, db_id, db_pw);

			if (conn != null) {
				System.out.println("연결 성공");
			} else {
				System.out.println("연결 실패");
			}
			
			// 키보드에 입력받기
			Scanner sc = new Scanner(System.in);
			System.out.print("ID : ");
			String id = sc.next();
			System.out.print("PW : ");
			String pw = sc.next();
			System.out.print("Name : ");
			String name = sc.next();
			System.out.print("Age : ");
			int age = sc.nextInt();

			String sql = "insert into mem(id,pw,name,age) values(?,?,?,?)";
			psmt = conn.prepareStatement(sql);

			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, name);
			psmt.setInt(4, age);

			int cnt = psmt.executeUpdate();
			if (cnt > 0) {
				System.out.println("insert 성공");
			} else {
				System.out.println("insert 실패");
			}

			// 4. 종료
			// 종료 순서 : 가장 마지막에 열어주었던 객체부터 역순부터 닫아줌

		} catch (SQLException e) { // DB정보 확인
			System.out.println("sql 오류");
			e.printStackTrace();
		} catch (ClassNotFoundException e1) {
			System.out.println("동적 오류 발생");
			e1.printStackTrace();
		} finally {
			if (psmt != null) {
				try {
					psmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

 

>> 키보드로 입력받아 출력하는 update문

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

public class Ex02_update {

	public static void main(String[] args) {
		// ID가 Mars인 사람을 비밀번호 1025로 바꿔서 SQL문을 전송 JDBC 구현

		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@127.0.0.1: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("연결 실패");
			}

			Scanner sc = new Scanner(System.in);
			System.out.println("===회원 정보 수정 ===");
			System.out.print("ID 입력 : ");
			String id = sc.next();
			System.out.print("PW 변경 : ");
			String pw = sc.next();

			String sql = "UPDATE MEM SET pw = ? WHERE id = ?";
			psmt = conn.prepareStatement(sql);

			psmt.setString(1, id);
			psmt.setString(2, pw);

			int cnt = psmt.executeUpdate();
			if (cnt > 0) {
				System.out.println("update 성공");
			} else {
				System.out.println("update 실패");
			}

		} catch (SQLException e) { // DB정보 확인
			System.out.println("sql 오류");
			e.printStackTrace();
		} catch (ClassNotFoundException e1) {
			System.out.println("동적 오류 발생");
			e1.printStackTrace();
		} finally {
			if (psmt != null) {
				try {
					psmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}

		}

	}
}

 

>> MVC 형태

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 {
	// Controller 단계
	// DAO : Data Access Object
	// 정의 : DB에 있는 data들에게 접근하기 위한 객체
	// 사용 이유 : DB접근을 하기 위하 로직, 비지니스 로직을 분리하기 위해서

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

	private void getConnection() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String db_url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";

			conn = DriverManager.getConnection(db_url, db_id, db_pw);
			if (conn != null) {
				System.out.println("DB연결 성공");
			} else {
				System.out.println("DB연결 실패");
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void close() {
		try {
			if (rs != null) {
				rs.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public int insert(String id, String pw, String name, int age) {
		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);
			psmt.setInt(4, age);

			cnt = psmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;
	}

	public int update(String id, int age) {
		int cnt = 0;
		try {
			getConnection();

			String sql = "update mem set age = ? where id = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setInt(1, age);
			psmt.setString(2, id);
			cnt = psmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return cnt;

	}

	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 ArrayList<MemberVO> select() {
		ArrayList<MemberVO> list = new ArrayList<MemberVO>();
		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);
				int age = rs.getInt(4);

				MemberVO vo = new MemberVO(id, pw, name, age);
				list.add(vo);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}
		return list;

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

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		// 1.등록 2.조회 3.수정 4.삭제 5.종료

		// DB 관련 작업 수행 객체 DAO
		DAO dao = new DAO();
		while (true) {
			System.out.print("1.등록 2.조회 3.수정 4.삭제 5.종료 >> ");
			int choice = sc.nextInt();

			if (choice == 1) {
				// 등록 기능
				System.out.println("===등록 단계===");
				System.out.print("PW : ");
				String pw = sc.next();
				System.out.print("ID : ");
				String id = sc.next();
				System.out.print("NAME : ");
				String name = sc.next();
				System.out.print("AGE : ");
				int age = sc.nextInt();
				int cnt = dao.insert(pw, id, name, age);

				if (cnt > 0) {
					System.out.println("등록 성공");
				} else {
					System.out.println("등록실패");
				}

			}else if(choice ==2) {
				// 조회 기능
				System.out.println("===조회 단계===");
				ArrayList<MemberVO> list = dao.select()
;				
				for(int i =0; i<list.size(); i++) {
					System.out.println(list.get(i).getId() +"\t"+ list.get(i).getPw()+"\t"+ list.get(i).getName() +"\t"+ list.get(i).getAge());
				}
			}
			else if (choice == 3) {
				// 수정 기능
				// ID : 0909
				System.out.println("===수정 단계===");
				System.out.print("ID : ");
				String id = sc.next();
				System.out.print("AGE : ");
				int age = sc.nextInt();
				int cnt = dao.update(id, age);
				if (cnt > 0) {
					System.out.println("수정 성공");
				} else {
					System.out.println("수정 실패");
				}
			} else if (choice == 4) {
				//삭제 기능
				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 (choice == 5) {
				System.out.println("종료");

			}
		}
	}

}
public class MemberVO {
	// 필드 구성
	// 필드 = DB 컬럼값

	private String id;
	private String pw;
	private String name;
	private int age;

	// 생성자
	public MemberVO(String id, String pw, String name, int age) {
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.age = age;
	}

	// 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;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

JDBC 연결 과정

 

복습 코드

package 오후;

public class MemberVO {
	private String id;
	private String pw;
	private String name;
	private int age;

	public MemberVO(String id, String pw, String name, int age) {
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.age = age;
	}
	
	// 오버로딩
	public MemberVO(String id, String pw) {
		this.id = id;
		this.pw = pw;
	}

	public MemberVO(String name) {
		this.name = name;
	}

	public String getId() {
		return id;
	}

	public String getPw() {
		return pw;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

}
package 오후;

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

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		MemberDAO dao = new MemberDAO();

		while (true) {
			System.out.print("[1]회원가입 [2]로그인 [3]조회 [4] 종료 >> ");
			int choice = sc.nextInt();

			if (choice == 4) {
				System.out.println("종료");
				break;
			} else if (choice == 1) {
				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();
				System.out.print("AGE : ");
				int age = sc.nextInt();

				MemberVO vo = new MemberVO(id, pw, name, age);
				int result = dao.joinInsert(vo);
				if (result == 0) {
					System.out.println("회원가입 실패!");
				} else {
					System.out.println("회원가입 성공!");
				}
			} else if (choice == 2) {
				System.out.println("로그인을 시작합니다.");
				System.out.print("ID : ");
				String id = sc.next();
				System.out.print("PW : ");
				String pw = sc.next();

				MemberVO vo = new MemberVO(id, pw);
				String name = dao.loginSelect(vo);
				if (name == null) {
					System.out.println("로그인 실패");
				} else {
					System.out.println(name + "님 환영!!");
				}
			} else if (choice == 3) {
				System.out.print("[1]전체조회 [2]선택조회 >> ");
				int searchChoice = sc.nextInt();
				if (searchChoice == 1) {
					// 전체조회 기능
					System.out.println("===전체조회===");
					System.out.println("ID\tPW\tNAME\tAGE");
					ArrayList<MemberVO> li = dao.searchAllSelect();
					if (li.size() > 0) {
						for (int i = 0; i < li.size(); i++) {
							String id = li.get(i).getId();
							String pw = li.get(i).getPw();
							String name = li.get(i).getName();
							int age = li.get(i).getAge();

							System.out.println(id + "\t" + pw + "\t" + name + "\t" + age);
						}
					} else {
						System.out.println("조회 실패");
					}

				} else if (searchChoice == 2) {
					// 선택조회 기능
					System.out.println("===선택조회===");
					System.out.print("검색 NAME : ");
					String insertname = sc.next();
					MemberVO vo = new MemberVO(insertname);
					ArrayList<MemberVO> list = dao.searchSelect(vo);
					if (list.size() == 0) {
						System.out.println("조회 실패");
					} else {
						System.out.println("ID\tPW\tNAME\tAGE");
						for (int i = 0; i < list.size(); i++) {
							String id = list.get(i).getId();
							String pw = list.get(i).getPw();
							String name = list.get(i).getName();
							int age = list.get(i).getAge();

							System.out.println(id + "\t" + pw + "\t" + name + "\t" + age);
						}
					}

				}
			}
		}

	}
}
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 MemberDAO {

	Connection conn = null; // 실제 DB 연결 해주는 객체
	PreparedStatement psmt = null; // SQL 구문을 실행해주는 역할
	ResultSet rs = null; // DB에서 검색해온 값을 저장

	// DB 연결
	private void getConnection() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			String db_url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";

			conn = DriverManager.getConnection(db_url, db_id, db_pw);

		} catch (ClassNotFoundException e) { // 클래스를 찾을 수 없다면 에러 문구 출력
			e.printStackTrace();
		} catch (SQLException e) { // SQL문 에러가 발생하면 에러문구 출력
			e.printStackTrace(); // 발생하는 모든 에러를 대비하는 문구 : Exception
		}
	}

	// 연결 닫기
	private void close() {
		try {
			if (conn != null) {
				conn.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public int joinInsert(MemberVO vo) {
		int cnt = 0;

		// DB연결
		getConnection();

		// Query 준비
		String sql = "INSERT into MEM values(?,?,?,?)";

		try {
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, vo.getId());
			psmt.setString(2, vo.getPw());
			psmt.setString(3, vo.getName());
			psmt.setInt(4, vo.getAge());

			cnt = psmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}

		return cnt;
	}

	public String loginSelect(MemberVO vo) {
		String name = null;

		getConnection();
		String sql = "select name from mem where id=? and pw =?";

		try {
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, vo.getId());
			psmt.setString(2, vo.getPw());

			rs = psmt.executeQuery();
			while (rs.next()) {
				name = rs.getString(1);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}

		return name;
	}

	public ArrayList<MemberVO> searchAllSelect() {
		ArrayList<MemberVO> list = new ArrayList<MemberVO>();

		getConnection();
		String sql = "select * from mem";
		try {
			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);
				int age = rs.getInt(4);

				list.add(new MemberVO(id, pw, name, age));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close();
		}

		return list;
	}
	
	public ArrayList<MemberVO> searchSelect(MemberVO vo) {
		ArrayList<MemberVO> list = new ArrayList<MemberVO>();
		
		getConnection();
		String sql = "select * from mem where name =?";
		try {
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, vo.getName());
			rs = psmt.executeQuery();
			
			while(rs.next()) {
				String id = rs.getString(1);
				String pw = rs.getString(2);
				String name = rs.getString(3);
				int age = rs.getInt(4);
				list.add(new MemberVO(id, pw, name, age));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return list;
	}
	
}

 

  • 1. DB 연결
    • getConnection() 호출
  • 2. SQL Query 준비
    • String sql = " ? " ;
    • psmt 객체 생성
      • psmt = conn.prepareStatement(sql);
    • ? 채워주기
      • psmt.setString(순서, 데이터) 
      • psmt.setInt(순서, 데이터)
  • 3. Query 전송
    • insert, update, delete : 테이블 정보 변경 O
      • int cnt = psmt.executeUpdate()
      • return값은 정수 타입으로 반환 : sql문 실행에 영향을 받는 행 수 반환 
    • select : 테이블 정보 변경 X
      • rs = psmt.executeQuery()
      • return 값은 ResultSet 객체로 반환
  • 4. Query 결과값 활용
    • insert, update, delete : 테이블 정보 변경 O
      • int cnt를 리턴
    • select : 테이블 정보 변경 X
      • while(rs.next()){}
        • { } : String name = rs.getString(컬럼 순서), int age = rs.getInt(컬럼순서)
        • rs.next()는 다음행이 없을 때 false를 반환함, 즉 더이상 가져올 행이 없을 때까지 while문 반복
        • ResultSet 객체에는 select한 정보가 들어있다. 안에 들어가있는 데이터를 가져올 때는 rs.getString(), getInt()를 호출
  • 5. 객체 닫아주기
    • close() 호출