본문 바로가기

자바 DB 연동

Statement - 자바에서 오라클 쿼리 실행

===========================================================scoreDAO=================================================================


package com.score1;


import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.ArrayList;

import com.util.DBConn;


/*

 * 오라클 DB연동 할 때 순서

 * 1. DriverManager.getConnection()를 이용하여 Connection 객체구함. => 클래스 객체로 만듬

 * 2. Connection의 createStatement() 메소드를 이용하여 Statement 객체 구함

 * -- Statement : 쿼리를 실행하는 역활을 한다.

 * 3. Statement의 메소드를 이용하여 쿼리를 실행한다.

 * 2,3번 설명 

 * => 메소드 안에서 Statement=null;로 선언만 하고 실행문 다음(try catch 다음)에 stmt=conn.createStatement();

 * executeUpdate() : INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, 등의 구문 실행

 * executeQuery() : SELECT 구문 실행( 셀렉트만 제외 하면 모두 executeUpdate() 쓴다)

 * -- SELECT만 리턴값이 resultset

 */


public class ScoreDAO {

private Connection conn=DBConn.getConnection();

public int insertScore(ScoreDTO dto) {

int result=0;

Statement stmt=null;

StringBuffer sb=new StringBuffer();

try{

sb.append("INSERT INTO score(");

sb.append("hak, name, birth, kor,eng,mat)");

sb.append("VALUES('"+dto.getHak()+"'");

sb.append(",'"+dto.getName()+"'");

sb.append(",'"+dto.getBirth()+"'");

sb.append(","+dto.getKor());

sb.append(","+dto.getEng());

sb.append(","+dto.getMat());

sb.append(")");

stmt=conn.createStatement();

// INSERT, UPDATE, DELETE, CREATE 문등을 실행

// INSERT 인 경우 INSERT한 개수를 리턴

// UPDATE 인 경우 UPDATE 한 개수를 리턴

// INSERT ~INTO는  한번에 하나의 테이블에 하나의 레코드만 추가 할 수 있으므로 성공하면 1을 리턴

result=stmt.executeUpdate(sb.toString());

stmt.close();

}catch(Exception e){

System.out.println(e.toString());

}

return result;

}


public int updateScore(ScoreDTO dto){

int result=0;

Statement stmt=null;

StringBuffer sb=new StringBuffer();

try{

sb.append("UPDATE score SET name='"+ dto.getName()+"',");

sb.append(" birth='"+ dto.getBirth()+"',");

sb.append(" kor="+ dto.getKor()+",");

sb.append(" eng="+ dto.getEng()+",");

sb.append(" mat="+ dto.getMat());

sb.append(" WHERE hak='"+ dto.getHak()+"'");


stmt=conn.createStatement();

result=stmt.executeUpdate(sb.toString());

stmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}

public int deleteScore(String hak){

int result=0;

Statement stmt=null;

String sql;

try{

sql="DELETE FROM score WHERE hak='"+hak+"'";

stmt=conn.createStatement();

result=stmt.executeUpdate(sql);

stmt.close();

} catch (Exception e) {

System.out.println(e.toString());

}

return result;

}


public ScoreDTO readScore(String hak){ // hak은 pk라 유일한 값을 가져서 어레이리스트 안씀

ScoreDTO dto=null;

Statement stmt=null;

ResultSet rs=null;

StringBuffer sql=new StringBuffer();

try{

sql.append("SELECT hak, name, birth, kor, ");

sql.append("eng,mat,(kor+eng+mat) tot, ");

sql.append("(kor+eng+mat)/3 ave");

sql.append(" FROM score");

sql.append(" WHERE hak='"+hak+"'");

stmt=conn.createStatement();

rs=stmt.executeQuery(sql.toString());

//기본키 조건에 만족하는 데이터는 최대 하나이므로 WHILE() 문을 사용할 필요가 없다.

// 조건에 만족하는 데이터가 없으면 dto는 null

if(rs.next()){

dto=new ScoreDTO();

dto.setHak(rs.getString("hak"));

dto.setName(rs.getString("name"));

dto.setBirth(rs.getString("birth"));

dto.setKor(rs.getInt("kor"));

dto.setEng(rs.getInt("eng"));

dto.setMat(rs.getInt("mat"));

dto.setTot(rs.getInt("tot"));

dto.setAve(rs.getInt("ave"));

}

rs.close();

stmt.close();

} catch (Exception e){

System.out.println(e.toString());

}

return dto;

}


public ArrayList<ScoreDTO> listScore() {

ArrayList<ScoreDTO> list=new ArrayList<ScoreDTO>();

Statement stmt=null;

ResultSet rs=null; //SELECT 문이기 때문에 ResultSet으로 리턴값을 선언하였다. 159번줄

StringBuffer sb=new StringBuffer();

try {

sb.append("SELECT hak, name,"); // append 뒤에 계속해서 입력된 데이터를 붙여준다.

sb.append(" TO_CHAR(birth,'YYYY-MM-DD') birth, ");

sb.append(" kor, eng, mat, ");

sb.append(" (kor+eng+mat) tot,");

sb.append(" (kor+eng+mat)/3 ave,");

sb.append(" RANK() OVER(ORDER BY(kor+eng+mat) DESC) rank");

sb.append(" FROM score"); //실수로 괄호안에 ;세미콜론 붙이면 안된다.

stmt=conn.createStatement();

// excuteQuery() : SELECT 문

rs=stmt.executeQuery(sb.toString()); //executeQuery는 String만 받는다. 그래서 145번줄의 스트링버퍼를 스트링으로 변환 시켜주었다.

while(rs.next()){ // 전체출력을 위해서 반복문 while을 사용함

ScoreDTO dto=new ScoreDTO();

dto.setHak(rs.getString(1));

// dto.setHak(rs.getString("hak")); 오라클의 인데스는 1부터 시작하여 1을 적어줬다.

dto.setName(rs.getString(2));

// dto.setName(rs.getString("name")); 

dto.setBirth(rs.getString("birth"));

dto.setKor(rs.getInt("kor"));

dto.setEng(rs.getInt("eng"));

dto.setMat(rs.getInt("mat"));

dto.setTot(rs.getInt("tot"));

dto.setAve(rs.getInt("ave"));

dto.setRank(rs.getInt("rank"));

list.add(dto);

}

} catch (Exception e){

System.out.println(e.toString());

}

return list;

}

public ArrayList<ScoreDTO> listNameScore(String name) { // name은 중복될 수도 있기 때문에 어레이리스트로 불러옴

ArrayList<ScoreDTO> list=new ArrayList<ScoreDTO>();

Statement stmt=null;

ResultSet rs=null;

StringBuffer sb=new StringBuffer();

try {

sb.append("SELECT hak, name,");

sb.append(" TO_CHAR(birth,'YYYY-MM-DD') birth, ");

sb.append(" kor, eng, mat, ");

sb.append(" (kor+eng+mat) tot,");

sb.append(" (kor+eng+mat)/3 ave");

sb.append(" FROM score"); 

sb.append(" WHERE name LIKE'"+name+"%'"); // % => 한글자만 동일해도  출력됨

stmt=conn.createStatement();

rs=stmt.executeQuery(sb.toString());

while(rs.next()){ // 전체출력을 위해서 반복문 while을 사용함

ScoreDTO dto=new ScoreDTO();

dto.setHak(rs.getString(1));

// dto.setHak(rs.getString("hak")); 오라클의 인덱스는 1부터 시작하여 1을 적어줬다.

dto.setName(rs.getString(2));

// dto.setName(rs.getString("name"));  컬럼명을 적어줘도 무방하다.

dto.setBirth(rs.getString("birth"));

dto.setKor(rs.getInt("kor"));

dto.setEng(rs.getInt("eng"));

dto.setMat(rs.getInt("mat"));

dto.setTot(rs.getInt("tot"));

dto.setAve(rs.getInt("ave"));

list.add(dto);

}

} catch (Exception e){

System.out.println(e.toString());

}

return list;

}

}


===========================================================scoreDTO=================================================================


package com.score1;


public class ScoreDTO {

private String hak, name, birth;

private int kor, eng, mat, tot, ave, rank;

public String getHak() {

return hak;

}

public void setHak(String hak) {

this.hak = hak;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getBirth() {

return birth;

}

public void setBirth(String birth) {

this.birth = birth;

}

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 getMat() {

return mat;

}

public void setMat(int mat) {

this.mat = mat;

}

public int getTot() {

return tot;

}

public void setTot(int tot) {

this.tot = tot;

}

public int getAve() {

return ave;

}

public void setAve(int ave) {

this.ave = ave;

}

public int getRank() {

return rank;

}

public void setRank(int rank) {

this.rank = rank;

}

}


===========================================================score=================================================================


package com.score1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Score {
private ScoreDAO dao = new ScoreDAO();
private Scanner sc = new Scanner(System.in);

public void insertData() {
ScoreDTO dto = new ScoreDTO();

try {
System.out.println("\n >>> 자료 입력 <<<");
System.out.print("학번?");
dto.setHak(sc.next());
System.out.print("이름?");
dto.setName(sc.next());
System.out.print("생년월일[yyyy-mm-dd]?");
dto.setBirth(sc.next());
System.out.print("국어?");
dto.setKor(sc.nextInt());
System.out.print("영어?");
dto.setEng(sc.nextInt());
System.out.print("수학?");
dto.setMat(sc.nextInt());

int n = dao.insertScore(dto);
if (n == 1)
System.out.println("추가 성공!!!");
else
System.out.println("추가 실패!!!!");
System.out.println();

} catch (Exception e) {
System.out.println("입력 오류!!!");
}
}

public void updateData() {
ScoreDTO dto = new ScoreDTO();

try {
System.out.println("\n >>> 자료 입력 <<<");
System.out.print("학번?");
dto.setHak(sc.next());
System.out.print("이름?");
dto.setName(sc.next());
System.out.print("생년월일[yyyy-mm-dd]?");
dto.setBirth(sc.next());
System.out.print("국어?");
dto.setKor(sc.nextInt());
System.out.print("영어?");
dto.setEng(sc.nextInt());
System.out.print("수학?");
dto.setMat(sc.nextInt());

int n = dao.updateScore(dto);
if (n == 1)
System.out.println("수정 성공!!!");
else
System.out.println("수정 실패!!!!");
System.out.println();

} catch (Exception e) {
System.out.println("입력 오류!!!");
}
}

public void deleteHak() {
String hak;
System.out.println("\n삭제할 학번?");
hak = sc.next();

int n = dao.deleteScore(hak);
if (n >= 1) {
System.out.println("삭제성공!!!.");
} else {
System.out.println("등록된것이 업습니다.");
}
this.listAllData();
}
public void searchHak() {
String hak;
System.out.println("\n검색할 학번?");
hak = sc.next();

ScoreDTO dto = dao.readScore(hak);
if (dto == null) {
System.out.println("등록된 자료가 아닙니다.");
return;
}

System.out.println(dto.getHak() + "\t" + dto.getName() + "\t"
+ dto.getBirth() + "\t" + dto.getKor() + "\t" + dto.getEng()
+ "\t" + dto.getMat() + "\t" + dto.getTot() + "\t"
+ dto.getAve());

}

public void listAllData() {
ArrayList<ScoreDTO> list = dao.listScore();

System.out.println("\n>>>전체리스트<<<");

Iterator<ScoreDTO> it = list.iterator();
while (it.hasNext()) {
ScoreDTO dto = it.next();
System.out.println(dto.getHak() + "\t" + dto.getName() + "\t"
+ dto.getBirth() + "\t" + dto.getKor() + "\t"
+ dto.getEng() + "\t" + dto.getMat() + "\t" + dto.getTot()
+ "\t" + dto.getAve() + "\t" + dto.getRank());
}
System.out.println();
}
public void listNameData() {
String name;
System.out.print("검색할 이름 ? ");
name=sc.next();
ArrayList<ScoreDTO> list = dao.listNameScore(name);

System.out.println("\n>>>이름 검색 <<<");

Iterator<ScoreDTO> it = list.iterator();
while (it.hasNext()) {
ScoreDTO dto = it.next();
System.out.println(dto.getHak() + "\t" + dto.getName() + "\t"
+ dto.getBirth() + "\t" + dto.getKor() + "\t"
+ dto.getEng() + "\t" + dto.getMat() + "\t" + dto.getTot()
+ "\t" + dto.getAve() + "\t" + dto.getRank());
}
System.out.println();
}

}


===========================================================scoreMain=================================================================


package com.score1;


import com.util.DBConn;


public class ScoreMain {

public static void main(String[] args) throws Exception {

char ch;

Score score=new Score();

while(true){

do{

System.out.print("1.입력 2.수정 3.삭제 4.학번검색 5.이름검색 6.전체출력 7.종료 ==>");

ch=(char)System.in.read();

System.in.skip(2);

} while (ch<'1' || ch>'7');

switch (ch){

case '1': score.insertData();break;

case '2': score.updateData();break;

case '3': score.deleteHak();break;

case '4': score.searchHak();break;

case '5': score.listNameData();break;

case '6': score.listAllData();break;

case '7': DBConn.close();

System.exit(0);

}

}


}


}