예제) 데이터를 저장하는 학생관리 프로그램
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;
}
}
}
'디지털 컨버전스 > JDBC' 카테고리의 다른 글
[JDBC] DBCP - DataBase Connection Pool , Singleton Pattern , Thread 동기화 (0) | 2020.03.30 |
---|---|
[JDBC] 네트워크 회원가입 & 재고 관리 예제 (0) | 2020.03.27 |
[JDBC] 네트워크 회원가입 (0) | 2020.03.26 |
[JDBC] Encryption (0) | 2020.03.26 |
[JDBC] OJDBC, forName, Connection, Statement, executeUpdate, executeQuery (0) | 2020.03.24 |