mjeongriver
article thumbnail
Published 2022. 11. 22. 17:46
day37-DB: sql TIL/SQL

1. jdbc 다운로드

- 오라클 홈페이지 → jdbc 검색한 후 다운로드

- 다운받은 파일을 이클립스에서 폴더 생성 후 옮기기

- 이클립스에서 build path 들어가기

 

- JDBC insert 

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

public class JDBCInsert {

	public static void main(String[] args) {

		//insert

		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr"; //계정
		String upw = "hr"; //비밀번호

		String sql = "insert into auth values(seq_auth.nextval,?,?)";
		//첫번째 값 nextval, 두번째 값에는 name
		
		Connection conn = null;
		PreparedStatement pstmt = null;


		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			//connection 객체 생성, = 앞에 connection 인터페이스
			conn = DriverManager.getConnection(url, uid, upw);

			System.out.println(conn);

			//statement 객체
			//conn.createStatement(); 도 사용 가능
			//함수 호출하고 객체 타입 반환
			pstmt = conn.prepareStatement(sql);

			//3. ?값을 세팅하기 - 첫번째부터 1번 순서
			//(setString, setInt, setDate, setTimeStamp-날짜 형식)
			//밑에 두 줄이 물음표(2,3번째) 값으로 들어감
			pstmt.setString(1, "홍길동");
			pstmt.setString(2, "프로그래머");

			//4. sql 실행
			//(select 문은 query 문장 실행, insert, delete, update문은 update 메서드로 실행)
			int result = pstmt.executeUpdate(); //위에 sql 들어가 있으니까 매개변수 없는 걸로 사용
			//성공과 실패를 반환
			
			if(result == 1) {
				System.out.println("성공");
			} else {
				System.out.println("실패");
			}

		} catch (Exception e) {
			e.printStackTrace(); //에러 로그를 봐야하니까
		} finally { //(connection 해제 필수)
			try {
				conn.close(); //finally 안에 try-catch문
				pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
				System.out.println("close 에러");
			}
		}


	}

}

 

- JDBC select

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

public class JDBCSelect {
	
	public static void main(String[] args) {
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr"; //계정
		String upw = "hr"; //비밀번호
		
		String sql = "select * from auth order by auth_id desc";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		//결과 저장 객체
		ResultSet rs = null; //select 결과를 반환 받을 객체
	
		try {
			//드라이버 로드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//connection 연결
			conn = DriverManager.getConnection(url, uid, upw);
			//stmt
			pstmt = conn.prepareStatement(sql);
			//? 값에 대한 처리
			
			//sql 실행(select의 실행) 
            //select는 반환이 있으니까 rs 필요
			rs = pstmt.executeQuery();
			
			while (rs.next()) { 
				//다음행이 있으면 true를 반환 받아서 while문 실행
				//한 행에 대한 처리(getInt, getString, getDouble, getTimestamp, getDate)
				int auth_id = rs.getInt("auth_id");
				String name = rs.getString("name"); //컬럼명
				String job = rs.getString("job");
				
				System.out.println("번호:" + auth_id + ", 이름:" + name + ", 직업:" + job);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally { //(connection 해제 필수) - 오류가 생기면 꺼지지 않기 때문에 아래 finally에 써줘야 함.
			try {
				conn.close(); //finally 안에 try-catch문
				pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
				System.out.println("close 에러");
			}
		
		
		
	}

}
}

 

- JDBC select 2

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

public class JDBCSelect2 {
	
	public static void main(String[] args) {
		
		/*
		 * 사원 수를 입력 받습니다.
		 * employees, departments 테이블에서 부서별 사원 수가 입력 받은 사원수 보다 큰 데이터를 select 해보세요.
		 * 출력할 컬럼은 부서명, 사원수, 부서 id
		 * null이 아닌 데이터만 출력
		 */
		
		Scanner scan = new Scanner(System.in);
		System.out.println("사원수: ");
		int num = scan.nextInt();
		
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr"; //계정
		String upw = "hr"; //비밀번호
		
		String sql = "select d.department_id,\r\n"
				+ "        d.department_name,\r\n"
				+ "        a.total \r\n"
				+ "from departments d\r\n"
				+ "inner join(select department_id,\r\n"
				+ "                count(*) total\r\n"
				+ "                from employees\r\n"
				+ "                group by department_id) a\r\n"
				+ "on d.department_id = a.department_id\r\n"
				+ "where total > ?";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //select 결과를 반환 받을 객체
	
		try {
			//드라이버 로드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//connection 연결
			conn = DriverManager.getConnection(url, uid, upw);
			
			//stmt
			pstmt = conn.prepareStatement(sql);
			
			//? 값에 대한 처리
			pstmt.setInt(1, num);
			
			//sql 실행(select의 실행) 
			rs = pstmt.executeQuery();
			
			while (rs.next()) { 
				//다음행이 있으면 true를 반환 받아서 while문 실행
				//한 행에 대한 처리(getInt, getString, getDouble, getTimestamp, getDate)
				String department_id = rs.getString("department_id");
				String department_name = rs.getString("department_name"); //컬럼명
				int total = rs.getInt("total");
				
				System.out.println("부서 아이디:" + department_id + ", 부서명:" + department_name + ", total:" + total);
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally { //(connection 해제 필수) - 오류가 생기면 꺼지지 않기 때문에 아래 finally에 써줘야 함.
			try {
				conn.close(); //finally 안에 try-catch문
				pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
				System.out.println("close 에러");
			}
		
		
		
	}
	}

}

db: select d.department_id,
        d.department_name,
        a.total 
from departments d
inner join(select department_id, --null인 데이터는 나오지 않았으면 해서
                count(*) total
                from employees
                group by department_id) a
on d.department_id = a.department_id
where total > 10;

 

- JDBC update

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

public class JDBCUpdate {

	public static void main(String[] args) {

		//update
		//scanner로 auth_id, name, job을 입력 받아서 해당 auth_id의 name, job을 업데이트 하는 구문
		//db에서 commit 해야 함.

		Scanner scan = new Scanner(System.in);
		System.out.println("수정할 auth_id:");
		int auth_id = scan.nextInt();

		System.out.println("수정할 name:");
		String name = scan.next();

		System.out.println("수정할 job:");
		String job = scan.next();

		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String uid = "hr"; //계정
		String upw = "hr"; //비밀번호

		String sql = "update auth set name=? , job=? where auth_id = ?";

		Connection conn = null;
		PreparedStatement pstmt = null;

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			//connection 객체 생성, = 앞에 connection 인터페이스
			conn = DriverManager.getConnection(url, uid, upw);

			System.out.println(conn);

			//statement 객체
			//conn.createStatement(); 도 사용 가능
			//함수 호출하고 객체 타입 반환
			pstmt = conn.prepareStatement(sql);

			//3. ?값을 세팅하기 - 첫번째부터 1번 순서
			//(setString, setInt, setDate, setTimeStamp-날짜 형식)
			//밑에 두 줄이 물음표(2,3번째) 값으로 들어감

			pstmt.setInt(3, auth_id);

			pstmt.setString(1, name);

			pstmt.setString(2, job); //db에서 commit 해야 함.

			//4. sql 실행
			//(select 문은 query 문장 실행, insert, delete, update문은 update 메서드로 실행)
			int result = pstmt.executeUpdate(); //위에 sql 들어가 있으니까 매개변수 없는 걸로 사용
			//성공과 실패를 반환

			if(result == 1) {
				System.out.println("성공");
			} else {
				System.out.println("실패");
			}

		} catch (Exception e) {
			e.printStackTrace(); //에러 로그를 봐야하니까
		} finally { //(connection 해제 필수) - 오류가 생기면 꺼지지 않기 때문에 아래 finally에 써줘야 함.
			try {
				conn.close(); //finally 안에 try-catch문
				pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
				System.out.println("close 에러");
			}
		}


	}
}

 

- 예제(AuthVO, AuthDAO, main)

package jdbc.model;

public class AuthVO {
	
	//특별한 알고리즘을 가진 클래스가 아니라, 조회한 데이터를 저장할 클래스
	//1. 변수는 은닉하고, 테이블이 가지고 있는 멤버 변수를 그대로 사용합니다.
	//2. getter, setter
	private int auth_id;
	private String name;
	private String job;
	
	//생성자 - 기본 생성자, 모든 멤버 변수를 저장하는 생성자
	
	public AuthVO() {}  //ctrl+space+enter
	public AuthVO(int auth_id, String name, String job) {
		super();
		this.auth_id = auth_id;
		this.name = name;
		this.job = job;
	}
	
	//toString 
	@Override
	public String toString() {
		return "AuthVO [auth_id=" + auth_id + ", name=" + name + ", job=" + job + "]";
	}
	
	
	//getter, setter
	public int getAuth_id() {
		return auth_id;
	}
	public void setAuth_id(int auth_id) {
		this.auth_id = auth_id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	
}
package jdbc.model;

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

public class AuthDAO {

	//접근 제한자가 붙은 멤버 변수로 만들어줌
	private String url = Main.url;
	private String uid = Main.uid; //계정
	private String upw = Main.upw; //비밀번호

	//메서드화
	public int insertEx(String name, String job) {


		int result = 0;

		//여기서부터 끝까지 메서드로 만들기
		String sql = "insert into auth values(seq_auth.nextval,?,?)";
		//첫번째 값 nextval, 두번째 값에는 name

		Connection conn = null;
		PreparedStatement pstmt = null;


		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			//connection 객체 생성, = 앞에 connection 인터페이스
			conn = DriverManager.getConnection(url, uid, upw);

			System.out.println(conn);

			//statement 객체
			//conn.createStatement(); 도 사용 가능
			//함수 호출하고 객체 타입 반환
			pstmt = conn.prepareStatement(sql);

			//3. ?값을 세팅하기 - 첫번째부터 1번 순서
			//(setString, setInt, setDate, setTimeStamp-날짜 형식)
			//밑에 두 줄이 물음표(2,3번째) 값으로 들어감
			pstmt.setString(1, name);
			pstmt.setString(2, job);

			//4. sql 실행
			//(select 문은 query 문장 실행, insert, delete, update문은 update 메서드로 실행)
			result = pstmt.executeUpdate(); //위에 sql 들어가 있으니까 매개변수 없는 걸로 사용
			//result를 반환 받아서 가지고 나갈 것이기 때문에 성공, 실패에 대한 것은 없어도 됨.

		} catch (Exception e) {
			e.printStackTrace(); //에러 로그를 봐야하니까
		} finally { //(connection 해제 필수) - 오류가 생기면 꺼지지 않기 때문에 아래 finally에 써줘야 함.
			try {
				conn.close(); //finally 안에 try-catch문
				pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
				System.out.println("close 에러");
			}
		}

		return result;
	}	

	//조회 메서드
	//한 행일때는 arraylist 제외 VO만 사용함. 
	public ArrayList<AuthVO> selectEx(){ //ArrayList<AuthDAO>-반환 타입

		ArrayList<AuthVO> list = new ArrayList<>();
		String sql = "select * from auth order by auth_id desc";

		Connection conn = null;
		PreparedStatement pstmt = null;
		//결과 저장 객체
		ResultSet rs = null; //select 결과를 반환 받을 객체

		try {
			//드라이버 로드
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//connection 연결
			conn = DriverManager.getConnection(url, uid, upw);
			//stmt
			pstmt = conn.prepareStatement(sql);
			//? 값에 대한 처리

			//sql 실행(select의 실행) 
			rs = pstmt.executeQuery();

			while (rs.next()) { 
				//다음행이 있으면 true를 반환 받아서 while문 실행
				//한 행에 대한 처리(getInt, getString, getDouble, getTimestamp, getDate)
				int auth_id = rs.getInt("auth_id");
				String name = rs.getString("name"); //컬럼명
				String job = rs.getString("job");

				//VO에 행 데이터 저장
				//VO를 list에 저장
				AuthVO vo = new AuthVO(auth_id, name, job);
				list.add(vo);
			}


		} catch (Exception e) {
			e.printStackTrace();
		} finally { //(connection 해제 필수) - 오류가 생기면 꺼지지 않기 때문에 아래 finally에 써줘야 함.
			try {
				conn.close(); //finally 안에 try-catch문
				pstmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
				System.out.println("close 에러");
			}

		}
		
		return list;
		
	}
}
package jdbc.model;

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

public class Main {
	
	//상수로 선언
	public static final String url = "jdbc:oracle:thin:@localhost:1521:xe";
	public static final String uid = "hr";
	public static final String upw = "hr";

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		//DAO클래스 선언
		AuthDAO authDAO = new AuthDAO();

		while(true) {

			try {
				System.out.print("메뉴 선택[1.조회, 2.저장] \n>");

				String menu = scan.next();

				switch (menu) {
				case "1": 
				case "조회":
					
					System.out.print("이름>");
					String name = scan.next();
					System.out.print("직업>");
					String job = scan.next();
					
					int result = authDAO.insertEx(name, job);
					
					if(result == 1) {
						System.out.println("정상 입력되었습니다.");
					} else {
						System.out.println("입력 오류 발생");
					}
					
					break;

				case "2":
					ArrayList<AuthVO> list = authDAO.selectEx();
					for(AuthVO vo : list) {
						System.out.println(vo.toString());
					}
					
					break;

				default:
					break;
				}

			} catch (Exception e) {
				e.printStackTrace(); //에러가 나도 멈추지 않음.
			}



		}


	}

}

'TIL > SQL' 카테고리의 다른 글

서브쿼리 정리  (0) 2023.05.18
day38-DB: sql  (0) 2022.11.25
day36-DB: sql  (0) 2022.11.21
day35-DB: sql  (0) 2022.11.18
day34-DB: sql  (0) 2022.11.17
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그