예제) 데이터를 저장하는 학생관리 프로그램


Main

더보기
import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		//1. 신규 정보 입력
		//2. 학생 목록 보기
		//3. 학생 정보 검색
		//4. 학생 정보 삭제
		//5. 학생 정보 수정
		//6. 시스템 종료
		StudentManager manager = new StudentManager();
		Scanner sc = new Scanner(System.in);

		while(true) {
			System.out.println("=== 학생 관리 프로그램 ===");
			System.out.println("1. 신규 정보 입력");
			System.out.println("2. 학생 목록 보기");
			System.out.println("3. 학생 정보 검색");
			System.out.println("4. 학생 정보 삭제");
			System.out.println("5. 학생 정보 수정");
			System.out.println("6. 시스템 종료");
			System.out.print("선택 > ");
			String menu = sc.nextLine();


			if(menu.contentEquals("1")) {
				//1. 신규 정보 입력
				System.out.println("이름을 입력하세요 : ");
				String sname = sc.nextLine();
				System.out.println("국어 점수를 입력하세요 : ");
				int kor = Integer.parseInt(sc.nextLine());
				System.out.println("영어 점수를 입력하세요 : ");
				int eng = Integer.parseInt(sc.nextLine());
				System.out.println("수학 점수를 입력하세요 : ");
				int math = Integer.parseInt(sc.nextLine());


				try {
					int result = manager.insert(sname, kor, eng, math);
					if(result>0) {
						System.out.println("성공적으로 입력되었습니다.");
					}else {
						System.out.println("알 수 없는 이유로 입력에 실패했습니다.");
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("입력의 오류가 발생했습니다.");
				}


			}else if(menu.contentEquals("2")) {
				//2. 학생 목록 보기 - 석차 오름차순
				System.out.println(" ===== 학생 정보 목록 ===== ");
				try {
					List<Student> sdt = manager.select();
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										tmp.getAvg()
								);
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

			}else if(menu.contentEquals("3")) {
				//3. 학생 정보 검색 - 이름으로 검색, 중복 모두 표시
				System.out.println("이름 입력 : ");
				String sname = sc.nextLine();
				try {
					List<Student> sdt = manager.searchByName(sname);
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(	
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										tmp.getAvg());
					}


				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

			}else if(menu.contentEquals("4")) {
				//4. 학생 정보 삭제 -목록 보여주고 학번으로 삭제
				try {
					List<Student> sdt = manager.select();
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										tmp.getAvg()
								);
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

				System.out.println("삭제할 학생의 학번을 입력하세요 : ");
				int sid = Integer.parseInt(sc.nextLine());
				try {
					int result = manager.delete(sid);
					if(result>0) {
						System.out.println("성공적으로 삭제되었습니다.");
					}else {
						System.out.println("알 수 없는 이유로 입력에 실패했습니다.");
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("입력의 오류가 발생했습니다.");
				}

			}else if(menu.contentEquals("5")) {
				//5. 학생 정보 수정 - 목록을 보여주고 학번으로 수정

				System.out.println(" ===== 학생 정보 목록 ===== ");
				try {
					List<Student> sdt = manager.select();
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										tmp.getAvg()
								);
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

				System.out.println("수정할 학생의 학번을 입력하세요 : ");
				int sid = Integer.parseInt(sc.nextLine());
				System.out.println("변경할 이름을 입력하세요 : ");
				String sname = sc.nextLine();
				System.out.println("변경할 국어 점수를 입력하세요 : ");
				int kor = Integer.parseInt(sc.nextLine());
				System.out.println("변경할 영어 점수를 입력하세요 : ");
				int eng = Integer.parseInt(sc.nextLine());
				System.out.println("변경할 수학 점수를 입력하세요 : ");
				int math = Integer.parseInt(sc.nextLine());
				try {
					int result = manager.update(sid,sname,kor,eng,math);
					if(result>0) {
						System.out.println("성공적으로 변경되었습니다.");
					}else {
						System.out.println("알 수 없는 이유로 입력에 실패했습니다.");
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("입력의 오류가 발생했습니다.");

				}

			}else if(menu.contentEquals("6")) {
				//6. 시스템 종료
				System.out.println("시스템을 종료합니다.");
				System.exit(0);	
			}

		}
	}
}

 

StudentManager

더보기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class StudentManager {

	public Connection makeConnection() throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String loginId = "kh";
		String loginPw = "kh";
		Connection con = DriverManager.getConnection(url, loginId, loginPw);
		return con;
	}
	
	public int insert(String sname, int kor, int eng, int math) throws Exception {
		Connection con = makeConnection();
		Statement stat = con.createStatement();
		String sql = 
				"insert into student values(student_seq.nextval,'"+sname+"',"+kor+","+eng+","+math+")";
		int result = stat.executeUpdate(sql);
		con.commit();
		con.close();
		return result;
	}
	
	public List<Student> select() throws Exception {

		Connection con = makeConnection();
		Statement stat = con.createStatement();
		String sql = "select * from student order by (kor+eng+math) desc";
// 정확한 석차가 필요하다면
//		String sql =
//				"select sid,sname,kor,eng,math, RANK() over (order by(kor+eng+math) desc ) from student";
		ResultSet rs = stat.executeQuery(sql);
		List<Student> sdt = new ArrayList<>();
		while(rs.next()) {
			int sid = rs.getInt("sid");
			String sname = rs.getString("sname");
			int kor = rs.getInt("kor");
			int eng = rs.getInt("eng");
			int math = rs.getInt("math");
			sdt.add(new Student(sid,sname,kor,eng,math));
		}
		con.close();
		return sdt;
	}
	
	public List<Student> searchByName(String sname) throws Exception {
		Connection con = this.makeConnection();
		Statement stat = con. createStatement();
		String sql = "select * from student where sname ='"+sname+"'";
		ResultSet rs = stat.executeQuery(sql);
		List<Student> sdt = new ArrayList<>();
		
		while(rs.next()) {
			int sid = rs.getInt("sid");
			String name =rs.getString("sname");
			int kor = rs.getInt("kor");
			int eng = rs.getInt("eng");
			int math = rs.getInt("math");
			
			sdt.add(new Student(sid,name,kor,eng,math));		
		}
		con.close();
		return sdt;
	}
	
	public int delete(int sid) throws Exception {
		Connection con = makeConnection();
		Statement stat = con.createStatement();
		String sql = "delete from student where sid="+sid;
		int result = stat.executeUpdate(sql);
		con.commit();
		con.close();
		return result;
	}
	
	
	
	public int update(int sid, String sname, int kor, int eng, int math) throws Exception {
		Connection con = makeConnection();
		Statement stat = con.createStatement();
		String sql = 
				"update student set sname = '"+sname+"' , kor="+kor+", eng="+eng+", math="+math+"  where sid="+sid;
		int result = stat.executeUpdate(sql);
		con.commit();
		con.close();
		return result;
	}
	
}

 

Student

더보기
public class Student {

	private int sid;
	private String sname;
	private int kor;
	private int eng;
	private int math;
	

	public Student(int sid, String sname, int kor, int eng, int math) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.kor = kor;
		this.eng = eng;
		this.math = math;		
	}
	
	public int getSum() {
		return this.kor  + this.eng + this.math;
	}

	public double getAvg() {
		return getSum() / 3.0;
	}
	
	
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
}

 

SQL

더보기
-- SQL

Create table Student(
    sid number primary key,
    sname varchar(30),
    kor number,
    eng number,
    math number
);

create sequence student_seq
start with 1001
increment by 1
nomaxvalue
nocache;

--insert into student values(student_seq.nextval,'영희',1,2,3);
--drop table student;

--select * from student;
--select * from student where sname = '덕만';
--select * from student order by (kor+eng+math);

--drop sequence student_seq;

 

 

PreparedStatement


 

// Statement
// 인자값을 쿼리문에 조립 -> 인자값이 많아지면? 조립도 불편해짐

	public int insert(String sname, int kor, int eng, int math) throws Exception {
		Connection con = makeConnection();
        
		Statement stat = con.createStatement();
		String sql = 
				"insert into student values(student_seq.nextval,'"+sname+"',"+kor+","+eng+","+math+")";
		int result = stat.executeUpdate(sql);	
        
		con.commit();
		con.close();
		return result;
	}
// PreparedStatement
//Statement를 쓰지말고 PreparedStatement
//sql 들어가는 위치 달라짐
// ? 로케이션홀더

//문자열에 따옴표 자동으로 붙여줌
//1. 쿼리문 조립 쉬움
//2. 보안성 뛰어남 //sql인젝션
//3. 성능이 더 뛰어남

	public int insert(String sname, int kor, int eng, int math) throws Exception {
		Connection con = makeConnection();

		String sql = "insert into student values(student_seq.nextval,?,?,?,?)";
		PreparedStatement pstat = con.prepareStatement(sql);
		pstat.setString(1, sname);
		pstat.setInt(2, kor);
		pstat.setInt(3, eng);
		pstat.setInt(4, math);
		int result = pstat.executeUpdate();

		con.commit();
		con.close();
		return result;
	}

 

 

PreparedStatement가 보안성이 뛰어난 이유


아이디 : ' or 1 = 1--
해커의 공격

'를 다 없애고 자기가 넣어줌 

 

시큐어 코딩

 

PreparedStatement를 적용한 StudentManager

더보기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class StudentManager {

	public Connection makeConnection() throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String loginId = "kh";
		String loginPw = "kh";
		Connection con = DriverManager.getConnection(url, loginId, loginPw);
		return con;
	}
	
	//인자값을 쿼리문에 조립 -> 인자값이 많아지면? 조립도 불편해짐
	//Statement를 쓰지말고 PreparedStatement
	//sql 들어가는 위치 달라짐
	// ? 로케이션홀더
	public int insert(String sname, int kor, int eng, int math) throws Exception {
		Connection con = makeConnection();
//		Statement stat = con.createStatement();
//		String sql = 
//				"insert into student values(student_seq.nextval,'"+sname+"',"+kor+","+eng+","+math+")";
//		int result = stat.executeUpdate(sql);
	
		//문자열에 따옴표 자동으로 붙여줌
		//1. 쿼리문 조립 쉬움
		//2. 보안성 뛰어남 //sql인젝션
		//3. 성능이 더 뛰어남
		String sql = "insert into student values(student_seq.nextval,?,?,?,?)";
		PreparedStatement pstat = con.prepareStatement(sql);
		pstat.setString(1, sname);
		pstat.setInt(2, kor);
		pstat.setInt(3, eng);
		pstat.setInt(4, math);
		int result = pstat.executeUpdate();
		
		
		
		con.commit();
		con.close();
		return result;
	}
	
	public List<Student> selectRank() throws Exception {

		Connection con = makeConnection();
//		Statement stat = con.createStatement();
		String sql = "select * from student order by (kor+eng+math) desc";
		PreparedStatement pstat = con.prepareStatement(sql);
//		String sql =
//				"select sid,sname,kor,eng,math, ROW_NUMBER() over(order by(kor+eng+math) desc ) from student";
		ResultSet rs = pstat.executeQuery();
		List<Student> sdt = new ArrayList<>();
		while(rs.next()) {
			int sid = rs.getInt("sid");
			String sname = rs.getString("sname");
			int kor = rs.getInt("kor");
			int eng = rs.getInt("eng");
			int math = rs.getInt("math");
			sdt.add(new Student(sid,sname,kor,eng,math));
		}
		con.close();
		return sdt;
	}
	
	public List<Student> select() throws Exception {

		Connection con = makeConnection();
		String sql = "select * from student";
		PreparedStatement pstat = con.prepareStatement(sql);
		ResultSet rs = pstat.executeQuery();
		List<Student> sdt = new ArrayList<>();
		while(rs.next()) {
			int sid = rs.getInt("sid");
			String sname = rs.getString("sname");
			int kor = rs.getInt("kor");
			int eng = rs.getInt("eng");
			int math = rs.getInt("math");
			sdt.add(new Student(sid,sname,kor,eng,math));
		}
		con.close();
		return sdt;
	}
	
	public List<Student> searchByName(String sname) throws Exception {
		Connection con = this.makeConnection();
//		Statement stat = con. createStatement();
		String sql = "select * from student where sname = ?";
		PreparedStatement pstat = con.prepareStatement(sql);
		pstat.setString(1, sname);
		
		ResultSet rs = pstat.executeQuery();
		List<Student> sdt = new ArrayList<>();
		
		while(rs.next()) {
			int sid = rs.getInt("sid");
			String name =rs.getString("sname");
			int kor = rs.getInt("kor");
			int eng = rs.getInt("eng");
			int math = rs.getInt("math");
			
			sdt.add(new Student(sid,name,kor,eng,math));		
		}
		con.close();
		return sdt;
	}
	
	public int delete(int sid) throws Exception {
		Connection con = makeConnection();
//		Statement stat = con.createStatement();
		String sql = "delete from student where sid = ?";
		PreparedStatement pstat = con.prepareStatement(sql);
		pstat.setInt(1, sid);
		int result = pstat.executeUpdate();
		con.commit();
		con.close();
		return result;
	}
	
	
	
	public int update(int sid, String sname, int kor, int eng, int math) throws Exception {
		Connection con = makeConnection();
//		Statement stat = con.createStatement();
		String sql = 
				"update student set sname = ? , kor=?, eng=?, math=?  where sid= ?";
		PreparedStatement pstat = con.prepareStatement(sql);
		pstat.setString(1, sname);
		pstat.setInt(2, kor);
		pstat.setInt(3, eng);
		pstat.setInt(4, math);
		pstat.setInt(5, sid);
		int result = pstat.executeUpdate();
		con.commit();
		con.close();
		return result;
	}
	
}

 

PreparedStatement를 적용한 Main

더보기

 

import java.util.List;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		//1. 신규 정보 입력
		//2. 학생 목록 보기
		//3. 학생 정보 검색
		//4. 학생 정보 삭제
		//5. 학생 정보 수정
		//6. 시스템 종료
		StudentManager manager = new StudentManager();
		Scanner sc = new Scanner(System.in);

		while(true) {
			System.out.println("=== 학생 관리 프로그램 ===");
			System.out.println("1. 신규 정보 입력");
			System.out.println("2. 학생 목록 보기");
			System.out.println("3. 학생 정보 검색");
			System.out.println("4. 학생 정보 삭제");
			System.out.println("5. 학생 정보 수정");
			System.out.println("6. 시스템 종료");
			System.out.print("선택 > ");
			String menu = sc.nextLine();


			if(menu.contentEquals("1")) {
				//1. 신규 정보 입력
				System.out.println("이름을 입력하세요 : ");
				String sname = sc.nextLine();
				System.out.println("국어 점수를 입력하세요 : ");
				int kor = Integer.parseInt(sc.nextLine());
				System.out.println("영어 점수를 입력하세요 : ");
				int eng = Integer.parseInt(sc.nextLine());
				System.out.println("수학 점수를 입력하세요 : ");
				int math = Integer.parseInt(sc.nextLine());


				try {
					int result = manager.insert(sname, kor, eng, math);
					if(result>0) {
						System.out.println("성공적으로 입력되었습니다.");
					}else {
						System.out.println("알 수 없는 이유로 입력에 실패했습니다.");
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("입력의 오류가 발생했습니다.");
				}


			}else if(menu.contentEquals("2")) {
				//2. 학생 목록 보기 - 석차 오름차순
				System.out.println(" ===== 학생 정보 목록 ===== ");
				try {
					List<Student> sdt = manager.selectRank();
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										Math.round(tmp.getAvg()*100)/100.0
								);
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

			}else if(menu.contentEquals("3")) {
				//3. 학생 정보 검색 - 이름으로 검색, 중복 모두 표시
				System.out.println("이름 입력 : ");
				String sname = sc.nextLine();
				try {
					List<Student> sdt = manager.searchByName(sname);
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(	
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										Math.round(tmp.getAvg()*100)/100.0
								);
					}


				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

			}else if(menu.contentEquals("4")) {
				//4. 학생 정보 삭제 -목록 보여주고 학번으로 삭제
				try {
					List<Student> sdt = manager.select();
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										Math.round(tmp.getAvg()*100)/100.0
								);
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

				System.out.println("삭제할 학생의 학번을 입력하세요 : ");
				int sid = Integer.parseInt(sc.nextLine());
				try {
					int result = manager.delete(sid);
					if(result>0) {
						System.out.println("성공적으로 삭제되었습니다.");
					}else {
						System.out.println("알 수 없는 이유로 입력에 실패했습니다.");
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("입력의 오류가 발생했습니다.");
				}

			}else if(menu.contentEquals("5")) {
				//5. 학생 정보 수정 - 목록을 보여주고 학번으로 수정

				System.out.println(" ===== 학생 정보 목록 ===== ");
				try {
					List<Student> sdt = manager.select();
					System.out.println("학번\t이름\t국어\t영어\t수학\t합계\t평균");
					for(Student tmp : sdt) {
						System.out.println(
								tmp.getSid()+"\t"+
										tmp.getSname()+"\t"+
										tmp.getKor()+"\t"+
										tmp.getEng()+"\t"+
										tmp.getMath()+"\t"+
										tmp.getSum()+"\t"+
										Math.round(tmp.getAvg()*100)/100.0
								);
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("오류발생");
				}

				System.out.println("수정할 학생의 학번을 입력하세요 : ");
				int sid = Integer.parseInt(sc.nextLine());
				System.out.println("변경할 이름을 입력하세요 : ");
				String sname = sc.nextLine();
				System.out.println("변경할 국어 점수를 입력하세요 : ");
				int kor = Integer.parseInt(sc.nextLine());
				System.out.println("변경할 영어 점수를 입력하세요 : ");
				int eng = Integer.parseInt(sc.nextLine());
				System.out.println("변경할 수학 점수를 입력하세요 : ");
				int math = Integer.parseInt(sc.nextLine());
				try {
					int result = manager.update(sid,sname,kor,eng,math);
					if(result>0) {
						System.out.println("성공적으로 변경되었습니다.");
					}else {
						System.out.println("알 수 없는 이유로 입력에 실패했습니다.");
					}
				}catch(Exception e) {
					e.printStackTrace();
					System.out.println("입력의 오류가 발생했습니다.");

				}

			}else if(menu.contentEquals("6")) {
				//6. 시스템 종료
				System.out.println("시스템을 종료합니다.");
				System.exit(0);	
			}

		}
	}
}

 

 

close()가 되지 않는 문제


예외가 발생하면 그 줄에서 바로 나가버림 -> 밑의 close나 commit 작동 한함

//DB 꺼짐 프로젝트 시연 실패!

 

예전 방식

finally : 예외가 발생했던 안했건 무조건 실행되는 코드 , (try-catch내에서 발생한 경우만)

더보기
	public int insert(String sname, int kor, int eng, int math) throws Exception {
		try {
		Connection con = makeConnection();
		String sql = "insert into student values(student_seq.nextval,?,?,?,?)";
		PreparedStatement pstat = con.prepareStatement(sql);
		pstat.setString(1, sname);
		pstat.setInt(2, kor);
		pstat.setInt(3, eng);
		pstat.setInt(4, math);
		int result = pstat.executeUpdate();
	
		con.commit();
	
		return result;
		}catch(Exception e) {
			e.printStackTrace();
		}finally{
        	try{pstat.close();}
        	catch(Exception e){}
        	try{con.close();}
        	catch(Exception e){}
        }
	}

 

 

try - catch

try - finally

try - catch -finally

 

 

try with resource


	public int insert(String sname, int kor, int eng, int math) throws Exception {
		String sql = "insert into student values(student_seq.nextval,?,?,?,?)";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				) {
			pstat.setString(1, sname);
			pstat.setInt(2, kor);
			pstat.setInt(3, eng);
			pstat.setInt(4, math);
			int result = pstat.executeUpdate();
			con.commit();
			return result;
		}
	}

소괄호 안에 'close가 필요한 인스턴스를 변수에 담는 코드' 포함시켜야

 

 

ResultSet과 try with resource를 동시에 쓰는 경우


try with resource를 이중으로 만들기

	public List<Student> searchByName(String sname) throws Exception {
		String sql = "select * from student where sname = ?";
		try(
				Connection con = this.makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);

				){
			pstat.setString(1, sname);
			try(ResultSet rs = pstat.executeQuery();){
				List<Student> sdt = new ArrayList<>();
				while(rs.next()) {
					int sid = rs.getInt("sid");
					String name =rs.getString("sname");
					int kor = rs.getInt("kor");
					int eng = rs.getInt("eng");
					int math = rs.getInt("math");
					sdt.add(new Student(sid,name,kor,eng,math));		
				}
				return sdt;
			}
		}
	}

+ Recent posts