WEB JAVA SPRING/etc

자바 & DB 연결

sshhhh 2023. 8. 24. 13:15

DBTestMain

package ko.co.mlec.jdbc;

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

/*
 * 
 * 작업순서
 * 1. JDBC 드라이버 로딩
 * 2. DB접속 하여 연결객체 얻어오기
 * 3. SQL 쿼리 생성
 * 4. 쿼리 실행 및 결과 얻기
 * 5. 접속 해제
 * 
 */
public class DBTestMain {	// 자바와 DB 연결 class 생성

	public static void main(String[] args) {	// 자바 DB 연결 메인 작성 
		// 이름 틀릴 수도 있어서 예외처리 해줘야함	
		// 예외처리를 담당하는 구문. 예외가 발생할 수 있는 부분을 try 블럭으로 감싸주면 예외처리를 할 수 있다.
		
		//try해서 성공시 try안으로 실패시 catch로 들어감 
		try {	
			Class.forName("oracle.jdbc.driver.OracleDriver");//1. 드라이버 로딩	
			System.out.println("오라클 드라이버 로딩 성공...");	
			
			Connection conn = DriverManager.getConnection(	//2. DB접속
					"jdbc:oracle:thin:@localhost:1521:xe","hr","hr");
			System.out.println("DB 접속 성공 : " + conn);
			
		} catch (Exception e) { // e : 에러변수
				e.printStackTrace(); //에러의 발생근원지를 찾아서 단계별로 에러를 출력
				                     //즉 에러변수인 e를 출력하겠다
		}
	}

 

콘솔

오라클 드라이버 로딩 성공...
DB 접속 성공 : oracle.jdbc.driver.T4CConnection@5891e32e

 

InsertMain01

package ko.co.mlec.jdbc;

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

public class InsertMain01 {

	public static void main(String[] args) {

		Connection conn = null; // null 값으로 초기화 .
		Statement stmt = null; 

		try {
			// 1단계 : JDBC 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver"); // checked exception(컴파일 시점의 예외처리)

			// 2단계 : DB 접속 및 Connection 객체 얻어오기
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			conn = DriverManager.getConnection(url, user, password);
			// conn : connection객체 얻어오려고 쓴 변수
			System.out.println(conn);
			/*
			 * oracle.jdbc.driver.T4CConnection@5891e32e 이렇게 출력됐음 JDBC드라이버를 선택하고 연결한 객체를
			 * 출력한거임
			 */
			////db삽입

			// 3단계 : SQL 실행 객체 얻어오기 & 쿼리 작성
			stmt = conn.createStatement(); // stmt : conn의 실행객체 가져와서 쿼리를 작성하려고 쓴 변수
			String sql = "insert into t_test(id, name) values('park','박길동')";
			// 명령에 대한 것만 수행으로 sql세미콜론 작성 x
			// sql : insert할라구..

			// 4단계 : 쿼리 실행 및 결과 얻어오기
			int cnt = stmt.executeUpdate(sql); // cnt : dbms에 실행
			System.out.println("총 " + cnt + "개 행이 삽입되었습니다.");

			//////.db삽입
			// 틀렸다면 try말고 여기로
		} catch (Exception e) {
			e.printStackTrace(); // 에러난 이유를 알려줌
		}

		// 5단계: DB접속 종료 + 1~4단계에서 에러가 나면 sql문 종료 어렵다. so, finally 문 작성으로 옮겨줘야 함.
		// conn도 같이 쓸 수 있지만 stmt에서 오류가 날 수 있기 때문에 try를 작성 또해
		finally {
			try {
				stmt.close(); //stmt close 하는 이유 : 상태종료시켜줘야하니까
			} catch (SQLException e) { // 왜 여긴 Sql~냐 ?? -->stmt가 sql문이라서
				e.printStackTrace();
			}

			try { // conn의 종료를 위해 try 2번 진행
				conn.close();
			} catch (Exception e) {
                                             //종료하면 오류날일이 ? 
			}
		}

	}

}

 

 

InsertMain02

package ko.co.mlec.jdbc;

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


//용도 : 자바안에서 데이터 insert 
public class InsertMain02 {

	
	public static void main(String[] args) {
	   //다 똑같
		Connection conn = null;
		Statement stmt = null;
		
		
		try {
			//1단계: JDBC 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2단계: DB 접속 및 Connection 객체 얻어오기
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			conn = DriverManager.getConnection(url, user, password);
			
			
			///다른 부분 part 2!!!!!!!
			////// 진짜 하고 싶었던거 
			    
			//3단계: SQL 실행 객체 얻어오기 & 쿼리 작성
			Scanner sc = new Scanner(System.in);
			stmt = conn.createStatement(); // stmt : conn의 실행객체 가져와서 쿼리를 작성하려고 쓴 변수
			            //자바가 db랑 연결할 때 데이터를 작성하게 만들어주는 상태로 변경
			System.out.println("아이디를 입력하세요.");
			String id = sc.nextLine();
			System.out.println("이름을 입력하세요: ");
			String name = sc.nextLine();
			
			//비효율적임
			String sql = "insert into t_test(id,name) values"
					+ "(\'"
					+ id + "\',\'" + name + "\')";
					
			//4단계 : 쿼리 실행 및 결과 얻어오기
			int cnt = stmt.executeUpdate(sql);
			System.out.println("총 " + cnt + "개 행이 삽입되었습니다." );
			
			
			
    
			
			
			
		
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			conn.close();
		}catch (SQLException e) {
			e.printStackTrace();
		}
		
	}		
	}
}

 

콘솔

아이디를 입력하세요.
choi
이름을 입력하세요: 
fff
총 1개 행이 삽입되었습니다.
 

InsertMain03

package ko.co.mlec.jdbc;

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

public class InsertMain03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Connection conn = null;
		PreparedStatement pstmt = null; //statement는 잘안써서 나옴 //상태만들어줌 
		//prepareStatement: 호출할 개체를 만듭니다.* 데이터베이스 저장 프로시저.
		
		try {
			//1. JDBC 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2. DB 접속 및 Connection 객체 얻어오기
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			conn = DriverManager.getConnection(url, user, password);
			
			
			
			/////////////////////////쿼리작성
			
			
			Scanner sc = new Scanner(System.in);
			System.out.println("아이디를 입력하세요. ");
			String id = sc.nextLine();
			System.out.println("이름을 입력하세요. ");
			String name = sc.nextLine();
			//여기까진 아까랑 같아
			
			
			//2번째 방식
			
			//3. 쿼리작성 및 실행객체 얻기
			String sql =  "insert into t_test(id,name) "; //키값을 넣겠다
				   sql +="values(?,?) ";                  //밸류값  
		
			pstmt = conn.prepareStatement(sql);   //pstmt : conn 실행객체 가져와서 쿼리 작성 상태 만듬. 
			
			//sql은 pl아니라 0부터 시작안함
			//set 사용한 이유  : 확장성 좋음 , 직접접근 막음(무결성 ) 
			pstmt.setString(1, id);		//1행엔 id 넣음
			pstmt.setString(2, name);
			
			//4. 실행 및 결과 얻기
			int cnt = pstmt.executeUpdate();
			System.out.println("총 " + cnt + "삽입되었습니다. ");
			
			
        /////////////////////////쿼리작성 
			
			
			
			
		}catch (Exception e) {
			e.printStackTrace();
		}finally {
			//5. 접속 종료
			
			//초기값 위에서 null로 줬는데 null로 들어가면 오류(=아무것도 작성이 안됐음) 그래서 예외처리라는 안전장치를 줬어 
			//null이 아니면
			if(pstmt != null);
			try {
				pstmt.close();  //끝
				}catch(Exception e) {
					e.printStackTrace(); // 안전장치
				}
		}
		if(conn !=null) {
			try {
				conn.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 

콘솔

아이디를 입력하세요. 
lee
이름을 입력하세요. 
이ㅇㅇ
총 1삽입되었습니다.

 

 

UpdateMain01

package ko.co.mlec.jdbc;

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

import ko.co.mlec.util.ConnectionFactory;
import ko.co.mlec.util.JDBCClose;

/*
 * 검색할 ID를 입력하세요: hong
 * 수정할 이름을 입력하세요 : 홍개똥
 * 총 1개의 행이 수정되었습니다.
 * 
 */
public class UpdateMain01 {

	public static void main(String[] args) {
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			//ConnectionFactory factory = new ConnectionFactory();
			//conn = factory.getConnection();
			
			conn = new ConnectionFactory().getConnection();	//인스턴스 메소드 호출
			
			Scanner sc = new Scanner(System.in);
			System.out.println("검색할 ID를 입력하세요: ");
			String id = sc.nextLine();
			System.out.println("수정할 이름을 입력하세요: ");
			String name = sc.nextLine();
			
            
			String  sql = "update t_test";
					sql += " set name = ? ";
					sql += " where id = ? ";
					
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, name);
			pstmt.setString(2, id);
			
			pstmt.executeUpdate();
			System.out.println("총 " + pstmt + "개 행이 수정되었습니다.");
			
		}catch(Exception e) {
			e.printStackTrace();
			
			
			//만약에 다른 클래스에서 또 이렇게까지하면 좀 
			//그 때마다 쓰기싫어서 클래스 하나를 만들어놓고 썼다.
			
		}finally {
			JDBCClose.close(pstmt, conn);	//묵시적 형변환 사용, 앞의 내용 넘 길어서 짧게 가자
		}
		

	}

}

 

콘솔출력

검색할 ID를 입력하세요: 
choi
수정할 이름을 입력하세요: 
최
총 oracle.jdbc.driver.OraclePreparedStatementWrapper@68567e20개 행이 수정되었습니다.

 

selectMain

package ko.co.mlec.util;

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

public class SelectMain {

	public static void main(String[] args) {


		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			//원래는 죄다 적었는데 connectionFactory 클래스를 정의해서 짧아짐
	       // 그래서 여기서 . 으로 호출했음 ~
			
			
			
			//2번
			//conn : 객체 불러옴 연결해서 select할라고  
			        //호출하고 싶어서  new 클래스().함수()
			conn = new ConnectionFactory().getConnection();
			
			
						
			//얘낸 번호 안쓰고 바로 삽입 3.sql 쿼리만을 실행  in developer
			String sql = "select * from t_test ";  //sql : t_test테이블 select 할라고 쓴 문자열형 변수
				   sql  += "order by name asc"; //오름차순으로 정렬하겠다  내림차순 desc
					
			pstmt = conn.prepareStatement(sql);
			
			
			
		    //4.자바에서 sql 출력
		    //쿼리값 다 출력하려고 ResultSet 쓴듯
			ResultSet rs = pstmt.executeQuery();
			
			//rs를 next하면서 하나하나 다출력함 rs끝나면 while문 빠져나가 
			while(rs.next()) {
				//sql문 출력할려고..
				String id = rs.getString("id");  //rs  id 행의  열의 값 가져와
				String name = rs.getString("name");
				System.out.println("id: " + id + ", name : " + name);
				
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally{
			JDBCClose.close(pstmt,conn);
		}

	}
}

 

콘솔

id: park, name : 박길동
id: id, name : 아라
id: iphone, name : 아이폰
id: cup, name : 종이컵
id: choi, name : 최현
id: hong, name : 홍길동

 

ConnectionFactory

ConnectionFactory

package ko.co.mlec.util;

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

public class ConnectionFactory {

	public Connection getConnection() {
		Connection conn = null;
		
		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);
		}catch(Exception e) {
			e.printStackTrace();
			
		}
		return conn;
	}

}

 

JDBCClose

package ko.co.mlec.util;

import java.sql.Connection;
import java.sql.Statement;

public class JDBCClose {

	public static void close(Statement stmt,Connection conn) {	
		// static으로 close만 사용 
		if(stmt != null) {
			try {
				stmt.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		if(conn != null) {
			try {
				conn.close();
				
			}catch (Exception e) {
				e.printStackTrace();
			}
		}	
		
	}

}