본문 바로가기

Full Stack 교육 회고록

8/29 [java] - jdbc,mvc

728x90
SMALL

JDBC(JAVA Database Connectivity)

: 자바에서 DB에 접속하기 위해 사용되는 API

 

JBBC DrIVER: DBMS 제소사들이 자신들의 DB에 맞게 interface의 메소드들을 구현하여 제공

 

!!JDBC 연결 순서!!

1. JDBC Driver 로딩

  - ojdbc6.jar 추가

  - Class.forName()메소드 사용해 동적 생성

2. Database연결

    -Connection 생성

3. SQL문장 실행

    - PreparedStatement 생성 

4. 연결 종료

- 역순으로 닫아 준다.

 

0. 선행작업

 

프로젝트 파일 왼쪽 마우스 클릭 -> buid path -> Configure Buid Path ->

Java Build Path 창 안에서 위쪽에 위치한 Libraries-> classpath ->add external JARs... ->

JAR Selection 안에서  C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 이 경로 타고 들어가서 마지막에 열기 버튼 누르기

-> Apply and close로 연결하기

 

1.JDBC 드라이버 연결

Referenced Libraried -> ojdbc6.jar -> oracle.jdbc.driver

 

//1. JDBC 드라이버 연결
//Class.forName(): 드라이버 연결에 필요한 클래스 찾아오기!
Class.forName("oracle.jdbc.driver.OracleDriver");  오류나면 -> Surround with try/catch

 

-테이블 만들기

SQL*Plus: Release 11.2.0.2.0 Production on 월 8월 29 10:26:55 2022

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> conn hr/hr;
Connected.
SQL> select * from student;
select * from student
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> create table student(
  2  name varchar2(30),
  3  age number(20),
  4  gender varchar2(30)
  5  );

Table created.

SQL> inert into student values('채수민', 27, '여성');
Wrote file afiedt.buf

  1  create table student(
  2  name varchar2(30),
  3  age number(20),
  4  gender varchar2(30)
  5* )
SQL>
SQL> insert into student values('채수민', 27, '여성');

1 row created.

SQL> select*from student;

NAME                                                                AGE
------------------------------------------------------------ ----------
GENDER
------------------------------------------------------------
채수민                                                               27
여성


SQL> commit;

Commit complete.

SQL>
package Ex01;

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

public class Ex_Select {

	public static void main(String[] args) {
		
		//JDBC 연결순서
		//0. (선행작업) 프로젝트에 ojdbc6.jar 파일 연결
		//1. JDBC 드라이버 연결
		//2. 데이터베이스 연결
		//3. SQL문 작성 및 전송
		//4. 객체 연결 종료
		
		//객체 생성 및 선언
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		
		//try: 예외 처리를 진행 할 수 있는 구문!
		//catch : try 실행시 발생하는 오류를 catch문을 통해 해결할 수 있다
		try {
			//1. JDBC 드라이버 연결
			//Class.forName(): 드라이버 연결에 필요한 클래스 찾아오기!
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2. 데이터베이스 연결 -> Connection 객체 필요!
			// 데이터 베이스에 연결하기 위한 필요 정보! (DB주소, 아이디, 비밀번호)
			
			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("접속 실패");
			}	
			
			//3. SQL 작성 및 전송 -> PreparedStatement
			String sql = "select * from student";
			
			psmt = conn.prepareStatement(sql);
			
			//sql 문장 전송 작업필요!
			// ResultSet -> select sql문 실행시 돌아오면 테이블 형태를 
			// 담을 수 있는 객체!
			rs = psmt.executeQuery();
			
			while(rs.next()) {
			  //String name = rs.getString("name");
				String name = rs.getString(1);     //->숫자는 컬럼 번호를 뜻한다
				int age = rs.getInt(2);
				String gender = rs.getString(3);
				
				//하나의 행에 대하여 다 가져온 후 한번에 출력하기
				System.out.println(name + " / "+ age + " / "+ gender);
			}
			
	
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 연결 오류");
		} catch (SQLException e) {
			System.out.println("데이터베이스 연결 오류");
		}
		
		//4. 객체 연결 종료
		finally {//마지막에 무조건 수행할 수 있는 키워드 
			//객체 닫는 순서? 역순으로...
			// Connection(conn) <- PreparedStatement(psmt)  <- ResultSet(rs)
			
				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();
				}
		
		}
	}

}

java db랑 왔다갔다 할수 있는건 conn이다.

 

psmt라는 가방에 sql문장을 잃어버리지 않게 가방에 넣어서 넘어간다

 

<내 컴퓨터 주소 알아내는방법>

C:\Users\smhrd>ipconfig

Windows IP 구성


이더넷 어댑터 이더넷:

   연결별 DNS 접미사. . . . :
   링크-로컬 IPv6 주소 . . . . : fe80::19e6:37e4:ecd4:57a%11
   IPv4 주소 . . . . . . . . . : 172.30.1.23
   서브넷 마스크 . . . . . . . : 255.255.255.0
   기본 게이트웨이 . . . . . . : 172.30.1.254

C:\Users\smhrd>

 

<Ex_Insert>

package Ex01;

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

public class Ex_Insert {

	public static void main(String[] args) {

		// 객체 생성
		Connection conn = null;
		PreparedStatement psmt = null;
		
		Scanner sc = new Scanner(System.in);

		try {
			// 1. jdbc 동적 로딩!
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2.데이터베이스 연결!
			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("접속 실패");
			}

			// 3. sql 전송
			// '강예진', 20, '여성' -> insert 문장 구현!
			
			System.out.print("이름 : ");
			String name = sc.next();
			System.out.print("나이 : ");
			int age = sc.nextInt();
			System.out.print("성별 : ");
			String gender = sc.next();
			
			String sql = "insert into student values(?, ?, ?)";

			psmt = conn.prepareStatement(sql);
			
			//?값에 실제 값들이 연결될 수 있도록 만들어 주기
			//set(위치, 데이터 값) -> 위치는 1부터 시작한다!
			psmt.setString(1, name);
			psmt.setInt(2, age);
			psmt.setString(3, gender);

			// prepareStatement의 사용함수!
			// - Query() : 테이블의 전후가 바뀌는 작업 수행시 '조회'
			// - Update() : 테이블의 전후가 수정되는 작업 수행시 '삽입' , '수정', '삭제'

			int result = psmt.executeUpdate();

			if (result > 0) {
				System.out.println("삽입 성공");
			} else {
				System.out.println("삽입 실패");
			}

		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 연결 오류");
		} catch (SQLException e) {
			System.out.println("데이터베이스 오류");
		}

		// 4. 객체 연결 종료
		finally {// 마지막에 무조건 수행할 수 있는 키워드
			// 객체 닫는 순서? 역순으로...
			// Connection(conn) <- PreparedStatement(psmt) <- ResultSet(rs)

			try {
				if (psmt != null) {
					psmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}
SQL> commit;

Commit complete.

SQL> select*from student;

NAME                                                                AGE
------------------------------------------------------------ ----------
GENDER
------------------------------------------------------------
강예진                                                               20
여성

채수민                                                               27
여성

김미희                                                               25
여성
728x90
LIST