본문 바로가기
ICIA 수업일지

2021.07.12 수업일지

by 주성씨 2021. 7. 17.

- Back to JAVA

- JDBC *****

※ JDBC (Java Database Connectivity)

- 자바에서 제공해 주는 DB관련 처리를 하는 데 필요한 API들이다.
- 자바와 DB를 연결해주는 드라이버가 필요하다. 그 역할을 DB가 한다. 오라클DB를 깔았으면 그 안에 들어있다.
- 오라클에서 제공하는 ojdbc6.jar를 이클립스에서 Build Path에 추가하면 드라이버가 인식된다.
- Build는 java의 api와 코드를 잘 혼합해 프로그램이 생성될 수 있게 해준다.

 

오라클 폴더에서 찾을 수 있다.

 

위와 같은 경로를 통해 BP에 들어간다.

 

모듈 패스를 클릭하여 외부에서 JAR확장자를 추가하도록 하자.

 

오라클에서 복사한 ojdbc6를 추가한것을 볼 수 있다.

 

해당 프로젝트에서 확인 가능하다.

 

- 이클립스에 들어가서 다음과 같이 한다.

package ex1;

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

public class JdbcTest {
	
	// 지역변수를 필드에 올려 놓도록 하다.
	// 모든 메서드에서 커넥션 인스턴스 사용가능.
	Connection con;
	
	// static block ; class당 한번 초기화 할 때 실행
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); // 클래스라는 이름의 클래스
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
			e.printStackTrace();
		}
	}

	// java에서 DB접속 작업
	public void connect() {
		try {
			// 지역변수에 있는 Connection은 지워주도록 한다.
			con = DriverManager.getConnection
			// @ 이하는 실제 DB의 IP를 적어야한다.
			("jdbc:oracle:thin:@localhost:1521:xe", "icia", "1111");
			// DB id, pw
			System.out.println("DB 접속 성공");
		} catch (SQLException e) {
			System.out.println("DB 접속 실패");
			e.printStackTrace();
		}
	}

 

	public static void main(String[] args) {
		new JdbcTest().connect();
	}

ㄴ 접속하도록 한다.

 

DB 접속 성공

 

- 접속이 끝나면 닫아주도록 한다.

	public void connect() {
		try {
			// 지역변수에 있는 Connection은 지워주도록 한다.
			con = DriverManager.getConnection
			// @ 이하는 실제 DB의 IP를 적어야한다.
			("jdbc:oracle:thin:@localhost:1521:xe", "zoodb", "1111");
			// DB id, pw
			System.out.println("DB 접속 성공");
		} catch (SQLException e) {
			System.out.println("DB 접속 실패");
			e.printStackTrace();
		}finally {
			try {
				con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
	}

ㄴ 접속이 무한할 수 없기때문에 접속을 한번했으면 다음 사람을 위해서 다음 사람이 사용하기 위해서 접속을 끊어줘야 한다. 지금과 같은 경우는 혼자 사용해서 굳이 닫아주지 않아도 되지만 다인 이용시에는 반드시 붙여주도록 한다. 반드시 해주기 위해서 finally를 사용한다. 위와 같은 예제에서는 단순히 접속이라는 것을 연결는 것이 목적이기 때문에 finally를 저 위치에 해주지만 검색 삽입 수정을 할 경우 다른 위치에 두도록 한다.

 

- SQL 돌아가서

- zoodb에 접속해 다음과 같이 테이블을 만든다.

drop table member;
create table member(
    id nvarchar2(10) primary key,
    pw nvarchar2(10),
    name nvarchar2(10),
    age number
);

 

insert into member values('aaa','1111','에이',11);
insert into member values('bbb','1111','비',12);
insert into member values('ccc','1111','씨',13);
insert into member values('ddd','1111','디',14);

select * from member;
commit;

ㄴ 반드시 commit; 하도록 한다.

 

- 다시 이클립스로 돌아가서

	// 검색
	public void select() {
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			stmt = con.createStatement();
			String sql = "SELECT * FROM MEMBER";
			rs = stmt.executeQuery(sql);
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("select 예외 발생");
			e.printStackTrace();
		}
		
	}

 

	// 메인 메서드
	public static void main(String[] args) {
		JdbcTest jt = new JdbcTest();
		jt.connect();
		jt.select();
	}

 

※ Statement 인터페이스

- DB에 연동한 후에 SQL 문장을 DB로 전송하는 역할을 하는 인터페이스이다.
- Statement를 구현하는 객체는 Connection인터페이스의 메서드를 이용해서 생성한다.
- Statement stmt = con.createStatement();

▶ Statement 인터페이스의 대표적인 메서드
- int executeUpdate(String sql) 메서드는 파라미터로 SELECT 문장 이외의 SQL문장을 전달할 수 있다. 반환값은 SQL문을 실행한 후에는 적용(삭제, 수정)된 행수이다.
- ResultSet executeQuery(String sql) 메서드는 SELECT 구문을 실행할 때 사용된다. 반환값은 SELECT 실행 결과의 레코드 셋이고, 반환형은 ResultSet 참조형 이다. 반환된 레코드 셋의 위치는 컬럼이름이 있는 곳이므로 next() 메서드를 호출하여 실제 데이터가 있는 다음 레코드로 이동해야 한다. 다음 이동할 레코드가 존재하지 않으면 false가 반환된다.

 

▶ ResultSet 의 주요 메소드

 

- 검색 메서드에 데이터를 찾는 반복문을 추가한다.

	// 검색
	public void select() {
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			stmt = con.createStatement();
			String sql = "SELECT * FROM MEMBER";
			rs = stmt.executeQuery(sql);
			// 다음줄로 이동하는 반복문
			while(rs.next()) {
				System.out.println("아이디 : "+rs.getNString("id")
				+ "비밀번호 : "+rs.getNString("pw")
				+ "이름 : "+rs.getNString("name")
				+ "나이 : "+rs.getNString("age"));
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("select 예외 발생");
			e.printStackTrace();
		}
		
	}

 

- 검색 메서드에 finally문을 이동시킨다.

	// 검색
	public void select() {
		Statement stmt = null;
		ResultSet rs = null;

		try {
			stmt = con.createStatement();
			String sql = "SELECT * FROM MEMBER";
			rs = stmt.executeQuery(sql);
			// 다음줄로 이동하는 반복문
			while (rs.next()) {
				System.out.println("아이디 : " + rs.getNString("id") + "비밀번호 : " + rs.getNString("pw") + "이름 : "
						+ rs.getNString("name") + "나이 : " + rs.getNString("age"));
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("select 예외 발생");
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				stmt.close();
				con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}

	}

 

- 다른 메서드에서도 stmt, rs를 사용해야하기 때문에 필드위에 올려놓는다.

public class JdbcTest {

	// 지역변수를 필드에 올려 놓도록 하다.
	// 모든 메서드에서 커넥션 인스턴스 사용가능.
	Connection con;
	Statement stmt = null;
	ResultSet rs = null;

 

- 삽입 메서드를 생성한다.

	public void insert() {
		try {
			stmt = con.createStatement();
			String sql = "insert into member values('eee','1111','이이','40')";
			int cnt = stmt.executeUpdate(sql); // update, delete, insert에서만 사용
			// 성공시 양수이지만 간혹 음수인 경우도 있어서 아래와 같이 한다.
			if(cnt!=0) {
				System.out.println("insert 성공");
			}
			// 실패시 0리턴
			else {
				System.out.println("insert 실패");
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("insert 실패");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
		
	}

 

	// 메인 메서드
	// java는 자동 commit
	public static void main(String[] args) {
		JdbcTest jt = new JdbcTest();
		jt.connect();
		jt.insert(); // 작업 후 close()
		jt.connect();
		jt.select(); // 작업 후 close()
	}

 

- 삭제 메서드를 생성한다.

	//삭제
	public void delete() {
		try {
			stmt=con.createStatement();
			String sql = "DELETE FROM member WHERE name='에이'";
			int cnt = stmt.executeUpdate(sql);
			if(cnt!=0) {
				System.out.println("delete 성공");
			} else {
				System.out.println("delete 실패");
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("delete 실패");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
	}

 

- 확인

	public static void main(String[] args) {
		JdbcTest jt = new JdbcTest();
		jt.connect();
		jt.delete();
	}

 

- 수정 메서드를 생성한다.

	// 수정
	public void update() {
		try {
			stmt = con.createStatement();
			String sql = "update member set pw = '2222' where id = 'bbb'";
			int cnt = stmt.executeUpdate(sql);
			if(cnt!=0) {
				System.out.println("update 성공");
			} else {
				System.out.println("update 실패");
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("update 실패");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
		
	}

 

- 확인

	// 메인 메서드
	// java는 자동 commit
	public static void main(String[] args) {
		JdbcTest jt = new JdbcTest();
		jt.connect();
		jt.update();
	}

 

- 전체

package ex1;

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

public class JdbcTest {

	// 지역변수를 필드에 올려 놓도록 하다.
	// 모든 메서드에서 커넥션 인스턴스 사용가능.
	Connection con;
	Statement stmt = null;
	ResultSet rs = null;

	// static block ; class당 한번 초기화 할 때 실행
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); // 클래스라는 이름의 클래스
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
			e.printStackTrace();
		}
	}

	// java에서 DB접속 작업
	public void connect() {
		try {
			// 지역변수에 있는 Connection은 지워주도록 한다.
			con = DriverManager.getConnection
			// @ 이하는 실제 DB의 IP를 적어야한다.
			("jdbc:oracle:thin:@localhost:1521:xe", "zoodb", "1111");
			// DB id, pw
			System.out.println("DB 접속 성공");
		} catch (SQLException e) {
			System.out.println("DB 접속 실패");
			e.printStackTrace();
		}

	}

	// 검색
	public void select() {
		try {
			stmt = con.createStatement();
			String sql = "SELECT * FROM MEMBER";
			rs = stmt.executeQuery(sql);
			// 다음줄로 이동하는 반복문
			while (rs.next()) {
				System.out.println("아이디 : " + rs.getNString("id") + "비밀번호 : " + rs.getNString("pw") + "이름 : "
						+ rs.getNString("name") + "나이 : " + rs.getNString("age"));
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("select 예외 발생");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}

	}

	// 삽입
	public void insert() {
		try {
			stmt = con.createStatement();
			String sql = "insert into member values('eee','1111','이이',40)";
			int cnt = stmt.executeUpdate(sql); // update, delete, insert에서만 사용
			// 성공시 양수이지만 간혹 음수인 경우도 있어서 아래와 같이 한다.
			if(cnt!=0) {
				System.out.println("insert 성공");
			}
			// 실패시 0리턴
			else {
				System.out.println("insert 실패");
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("insert 실패");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
		
	}
	
	//삭제
	public void delete() {
		try {
			stmt=con.createStatement();
			String sql = "DELETE FROM member WHERE name='에이'";
			int cnt = stmt.executeUpdate(sql);
			if(cnt!=0) {
				System.out.println("delete 성공");
			} else {
				System.out.println("delete 실패");
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("delete 실패");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
	}

	// 수정
	public void update() {
		try {
			stmt = con.createStatement();
			String sql = "update member set pw = '2222' where id = 'bbb'";
			int cnt = stmt.executeUpdate(sql);
			if(cnt!=0) {
				System.out.println("update 성공");
			} else {
				System.out.println("update 실패");
			}
		} catch (SQLException e) {
			System.out.println(e.getMessage());
			System.out.println("update 실패");
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
				System.out.println("close 성공");
			} catch (SQLException e) {
				System.out.println("close 실패");
				e.printStackTrace();
			}
		}
		
	}
	// 메인 메서드
	// java는 자동 commit
	public static void main(String[] args) {
		JdbcTest jt = new JdbcTest();
		jt.connect();
		jt.insert(); // 작업 후 close()
		jt.connect();
		jt.select(); // 작업 후 close()
		jt.connect();
		jt.delete(); // 작업 후 close()
		jt.connect();
		jt.update(); // 작업 후 close()
	}

}

 

- CRUD 작업

Create : insert
Read : select
Update : update
Delete : delete

 

- Member 클래스를 만들자.

package ex1;

public class Member {
	
	}

}

 

package ex1;

public class Member { 
	
	//lombok이라는 유틸리티를 이용하면 getter, setter을 자동으로 생성해준다.

	private String id;
	private String pw;
	private String name;
	private int age;
	
	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;
	}
	
}

ㄴ 이런 클래스는 데이터 bean, DTO라고 한다.

 

- LoginBL이라는 클래스를 생성한다.

package ex1;

public class LoginBL {

}

 

- JdbcTest에서 connect 메서드까지만 복사해서 가지고 온다.

package ex1;

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

public class LoginBL {

	Connection con;
	Statement stmt = null;
	ResultSet rs = null;

	// static block ; class당 한번 초기화 할 때 실행
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver"); // 클래스라는 이름의 클래스
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패");
			e.printStackTrace();
		}
	}

	// java에서 DB접속 작업
	public void connect() {
		try {
			// 지역변수에 있는 Connection은 지워주도록 한다.
			con = DriverManager.getConnection
			// @ 이하는 실제 DB의 IP를 적어야한다.
			("jdbc:oracle:thin:@localhost:1521:xe", "zoodb", "1111");
			// DB id, pw
			System.out.println("DB 접속 성공");
		} catch (SQLException e) {
			System.out.println("DB 접속 실패");
			e.printStackTrace();
		}

	}

}

 

- 이전에 파이널리 구문에 사용했던 코드를 이용해 close 메서드를 만들어준다.

	public void close() {
		try {
			if(rs!=null) rs.close();
			if(stmt!=null) stmt.close();
			if(con!=null) con.close();
			System.out.println("close 성공");
		} catch (SQLException e) {
			System.out.println("close 실패");
			e.printStackTrace();
		}
	}

ㄴ 위를 다음과 같이 수정한다.

	public void close() {
		try {
			if(rs!=null) rs.close();
			if(stmt!=null) stmt.close();
			if(con!=null) con.close();
		}catch(SQLException e){
			System.out.println("close 예외 발생");
			e.printStackTrace();
		}

	}

 

- login 업무 메서드 생성

	public Member login(String id, String pw) {
		try {
			stmt = con.createStatement();
			String sql = "SELECT * FROM MEMBER WHERE ID='"+id+"' AND PW='"+pw+"'";
			rs= stmt.executeQuery(sql);
			if(rs.next()) {
				id=rs.getNString("ID");
				pw=rs.getNString("PW");
				String name=rs.getNString("NAME");
				int age=rs.getInt("AGE");
				
				return new Member(id,pw,name,age);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

 

- Member 클래스에 생성자 생성

package ex1;

// 이런 클래스는 데이터 bean, DTO(data transfer object) 라고 한다.
// 데이터 전송 오브젝트
public class Member { 
	
	//lombok이라는 유틸리티를 이용하면 getter, setter을 자동으로 생성해준다.

	private String id;
	private String pw;
	private String name;
	private int age;
	
	public Member(String id, String pw, String name, int age) {
		this.id=id;
		this.pw=pw;
		this.name=name;
		this.age=age;
	}
	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;
	}
	
}

 

- LoginMain 클래스를 생성해 아이디와 패스워드를 입력받고 해당 유저의 정보를 출력해보자.

package ex1;

import java.util.Scanner;

public class LoginMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("아이디 입력 : ");
		String id = sc.next();
		System.out.print("패스워드 입력 : ");
		String pw = sc.next();

ㄴ 앞서 배웠던 스캐너 매서드를 이용해서 아이디와 패스워드를 입력받도록 한다.

		LoginBL lb = new LoginBL();
		lb.connect();
		Member mb = lb.login(id, pw);
		lb.close();
		if (mb == null) {
			System.out.println("로그인 실패");
		} else {
			mb.toString();
		}

ㄴ toString은 오버라이드를 통해서 회원 정보를 출력하도록 하자. Member 클래스에 만든다.

	@Override
	public String toString() {
		System.out.println("아이디 = "+id+", 비밀번호 = "+pw+", 이름 = "+name+", 나이 = "+age);
		return super.toString();
	}

 

+ Member 클래스의 get, set 메서드를 만들기 떄문에 생성자는 꼭 안만들어도 된다.

	// get, set 메서드를 만들기 때문에 생성자는 꼭 안만들어도 된다.
//	public Member(String id, String pw, String name, int age) {
//		this.id=id;
//		this.pw=pw;
//		this.name=name;
//		this.age=age;
//	}

 

+ 생성자를 참조처리한 후 LoginBL의 Login 메서드는 다음과 같이 바꿀 수 있다.

	// login 업무 생성
	public Member login(String id, String pw) {
		try {
			stmt = con.createStatement();
			String sql = "SELECT * FROM MEMBER WHERE ID='"+id+"' AND PW='"+pw+"'";
			rs= stmt.executeQuery(sql);
			Member mb = new Member();
			if(rs.next()) {
				mb.setId(rs.getNString("ID"));
				mb.setPw(rs.getNString("PW"));
				mb.setName(rs.getNString("NAME"));
				mb.setAge(rs.getInt("AGE"));
				
				return mb;
				
				// 생성자는 get,set 때문에 꼭 안만들어도 된다.
//				return new Member(id,pw,name,age);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

'ICIA 수업일지' 카테고리의 다른 글

2021.07.14 수업일지  (0) 2021.07.17
2021.07.13 수업일지  (0) 2021.07.17
2021.07.09 수업일지  (0) 2021.07.12
2021.07.08 수업일지  (0) 2021.07.10
2021.07.07 수업일지  (0) 2021.07.10