JAVA
selectOne
public BoardVO selectOne(int idx) {
// 1) 오라클 연결 - 싱글톤을 이용한 객체생성
DBConn = DBConnection.getInstance();
// 2) getConnection() 메소드를 통해서 오라클 연결
conn = DBConn.getConnection();
// 3) SQL 쿼리문 작성 - ?는 매개변수 갯수
String SELECTONE_SQL = "select idx, title, name from board where idx = ?";
BoardVO vo = null;
try {
// conn.createStatement() : 변수로 값 받아 사용할때 (옛날 방식)
// conn.prepareStatement() : ? 파라미터 받을 때 주로 사용 (현재 방식)
// conn.prepareCall() : 프로시져 사용
pstmt = conn.prepareStatement(SELECTONE_SQL);
pstmt.setInt(1, idx);
rs = pstmt.executeQuery();
// 다음이 있으면 참 동작
if(rs.next()) {
vo = new BoardVO();
vo.setIdx(rs.getInt("idx"));
vo.setTitle(rs.getString("title"));
vo.setName(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBConn.close2(rs,pstmt, conn);
}
return vo;
}
MAIN
package board2;
public class TestMain {
public static void main(String[] args) {
BoardService service = new BoardServiceImpl();
// SELECTONE
// 해당 IDX 값 선택
BoardVO m = service.selectOne(36);
System.out.println("번호 : " +m.getIdx());
System.out.println("제목 : " +m.getTitle());
System.out.println("이름 : " +m.getName());
게시판 목록의 하나의 레코드를 불러오는 코드이다.
select 일때는 쿼리문을 실행시킬때 excuteQuery를 사용한다.
selectAll
public List<BoardVO> selectAll() {
DBConn = DBConnection.getInstance();
conn = DBConn.getConnection();
String SELECTALL_SQL = "select * from board";
BoardVO vo = null;
List<BoardVO> li = new ArrayList<BoardVO>();
try {
pstmt = conn.prepareStatement(SELECTALL_SQL);
rs = pstmt.executeQuery();
if (rs.next()) {
do {
vo = new BoardVO();
vo.setIdx(rs.getInt("idx"));
vo.setTitle(rs.getString("title"));
vo.setName(rs.getString("name"));
li.add(vo);
}while(rs.next());
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBConn.close2(rs,pstmt, conn);
}
return li;
}
MAIN
package board2;
import java.util.List;
public class TestMain {
public static void main(String[] args) {
BoardService service = new BoardServiceImpl();
// SELECTONE
BoardVO m = service.selectOne(36);
System.out.println("번호 : " +m.getIdx());
System.out.println("제목 : " +m.getTitle());
System.out.println("이름 : " +m.getName());
// SELECTALL
List<BoardVO> li = service.selectAll();
for(BoardVO k : li) {
// 일부값만 출력(idx, title)
int idx = k.getIdx();
String title = k.getTitle();
System.out.println(idx + " : " + title);
}
전체 레코드를 출력하도록 동작하는 코드이다.
현재 코드는 IDX와 TITLE만 출력되도록 배열값으로 불러온 뒤 IDX, TITLE만 따로 매개변수를 지정하여 호출을 한뒤 출력했다.
COUNT
BoardDAOImpl
@Override
public int count() {
// 1) 오라클 연결 - 싱글톤을 이용한 객체생성
DBConn = DBConnection.getInstance();
// 2) getConnection() 메소드를 통해서 오라클 연결
conn = DBConn.getConnection();
// 3) SQL 쿼리문 작성 - ?는 매개변수 갯수
String COUNT_SQL = "select count(*) AS tc from board";
int tc = 0;
try {
// conn.createStatement() : 변수로 값 받아 사용할때 (옛날 방식)
// conn.prepareStatement() : ? 파라미터 받을 때 주로 사용 (현재 방식)
// conn.prepareCall() : 프로시져 사용
pstmt = conn.prepareStatement(COUNT_SQL);
// select 일때 사용
rs = pstmt.executeQuery();
// 다음이 있으면 참 동작
if(rs.next()) { tc = rs.getInt("tc");}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBConn.close2(rs,pstmt, conn);
}
return tc;
}
serviceImpl
@Override
public int count() {
return dao.count();
}
main
package board2;
public class TestMain {
public static void main(String[] args) {
BoardService service = new BoardServiceImpl();
int tc = service.count();
System.out.println("전체 레코드 수 : " + tc);
select 문의 Count를 접하여 레코드 갯수를 출력하는 코드이다.
쿼리문의 Count 별칭 이름을 동일하게 호출해주어여 에러를 발생하지 않을 수 있다.
UPDATE
BoardDAOImpl
public void update(BoardVO vo) {
DBConn = DBConnection.getInstance();
conn = DBConn.getConnection();
String UPDATE_SQL = "update board set title = ?, name = ? where idx = ?";
try {
pstmt = conn.prepareStatement(UPDATE_SQL);
pstmt.setString(1, vo.title);
pstmt.setString(2, vo.name);
pstmt.setInt(3, vo.idx);
int k = pstmt.executeUpdate();
if (k > 0) {
System.out.println("수정성공");
}else {
System.out.println("수정실패");
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBConn.close1(pstmt, conn);
}
}
ServiceImpl
@Override
public void update(BoardVO vo) {
dao.update(vo);
}
main
package board2;
public class TestMain {
public static void main(String[] args) {
BoardService service = new BoardServiceImpl();
BoardVO vo =new BoardVO();
// UPDATE
vo.setTitle("리라쿠마 게시판1");
vo.setName("쿠마몬1");
vo.setIdx(27);
service.update(vo);
테이블에 존재하는 레코드의 값을 변경시켜주는 UPDATE 이다.
쿼리문에서 매개 변수를 받아오는 ?와 .set데이터형과 값을 입력해주고 메인에서 호출하여 레코드 값을 변경 할 수있다.
다소 복잡하지만 하나를 확실히 하면 쿼리문을 사용해 다양한 활용성이 있으니 구문의 형식을 꼭 암기하고 이해해서 기억하도록 하자.
boardDaoImpl
public List<BoardVO> selectSearch(String search, String str) {
DBConn = DBConnection.getInstance();
conn = DBConn.getConnection();
BoardVO vo = null;
List<BoardVO> li = new ArrayList<BoardVO>();
try {
if (search.equals("title") ) {
String SELECTSEARCH_SQL = "select * from board where title like ?";
pstmt = conn.prepareStatement(SELECTSEARCH_SQL);
pstmt.setString(1, "%"+str+"%");
}else if(search.equals("name")){
String SELECTSEARCH_SQL = "select * from board where title like ?";
pstmt = conn.prepareStatement(SELECTSEARCH_SQL);
pstmt.setString(1, "%"+str+"%");
}else {
String SELECTSEARCH_SQL = "select * from board";
pstmt = conn.prepareStatement(SELECTSEARCH_SQL);
}
rs = pstmt.executeQuery();
if (rs.next()) {
do {
vo = new BoardVO();
vo.setIdx(rs.getInt("idx"));
vo.setTitle(rs.getString("title"));
vo.setName(rs.getString("name"));
li.add(vo);
}while(rs.next());
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBConn.close2(rs,pstmt, conn);
}
return li;
}
이름과 타이틀의 입력시 선택한 글자가 검색되도록 쿼리문을 실행해주도록 하는 코드이다.
boardServiceImpl
public List<BoardVO> selectSearch(String search, String title) {
// TODO Auto-generated method stub
return dao.selectSearch(search, title);
}
메인의 값 dao.selectSearch의 search,title 값을 리턴하도록 오버라이딩한다.
main
// SELECTSEARCH
List<BoardVO> li = service.selectSearch("name","마");
for(BoardVO k : li) {
int idx = k.getIdx();
String title = k.getTitle();
String name = k.getName();
System.out.println(idx+ " : " +title+ " : " +name);
}
}
메인의 search 값을 받아 오고 데이터 베이스를 거쳐 반환된 쿼리문의 값이 출력되도록 프린트 해준다.
두개의 값을 받아 특정 레코드를 출력하는 코드
ExamVO vo = new ExamVO();
vo.setCh1("sname"); // sno 또는 sname 둘중 입력
vo.setCh2("이"); // 값
List<ExamVO> li = service.selectAll(vo);
System.out.println("===================================");
System.out.println(" 학번 | 이름 | 국어 | 영어 | 수학 | 역사 | 총점 | 평균");
System.out.println("===================================");
for (ExamVO m : li) {
String sno = m.getSno();
String sname = m.getSname();
int kor = m.getKor();
int eng = m.getEng();
int math = m.getMath();
int hist = m.getHist();
int sum = kor+eng+math+hist;
double avg = sum / 4.0;
System.out.println(sno + sname+ " " + kor+ " " + eng+ " " + math+
" " + hist+ " " + sum+ " " + avg);
}
SelectAll의 값이 Null 일때에는 전체 레코드를 출력 하려면
입력값 selectAll의 vo가 어디서 반환되는지 확인한다.
ExamDaoImpl
package examtbl;
import java.sql.*;
import java.util.*;
public class ExamDaoImpl implements ExamDao{
DBConnection DBConn = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
@Override
public List<ExamVO> selectAll(ExamVO vo) {
DBConn = DBConnection.getInstance();
conn = DBConn.getConnection();
String SEARCHALL_SQL = "";
if (vo == null) {
SEARCHALL_SQL = "select * from examtbl";
}else if(vo.ch1.equals("sno")) {
SEARCHALL_SQL = "select * from examtbl where sno like ?";
}else if(vo.ch1.equals("sname")) {
SEARCHALL_SQL = "select * from examtbl where sname like ?";
}
List<ExamVO> li = new ArrayList<ExamVO>();
try {
if (vo == null) {
SEARCHALL_SQL = "select * from examtbl";
pstmt= conn.prepareStatement(SEARCHALL_SQL);
}else if(vo.ch1.equals("sno")) {
SEARCHALL_SQL = "select * from examtbl where sno like ?";
pstmt= conn.prepareStatement(SEARCHALL_SQL);
pstmt.setString(1, "%" + vo.ch2 +"%");
}else if(vo.ch1.equals("sname")) {
SEARCHALL_SQL = "select * from examtbl where sname like ?";
pstmt= conn.prepareStatement(SEARCHALL_SQL);
pstmt.setString(1, "%" + vo.ch2 +"%");
}
rs = pstmt.executeQuery();
ExamVO m = null;
while(rs.next()) {
m = new ExamVO();
m.setSno(rs.getString("sno"));
m.setSname(rs.getString("sname"));
m.setKor(rs.getInt("kor"));
m.setEng(rs.getInt("eng"));
m.setMath(rs.getInt("math"));
m.setHist(rs.getInt("hist"));
// 테스트
// System.out.println("==> " + m);
li.add(m);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBConn.close2(rs, pstmt, conn);
}
return li;
}
}
vo 값이 들어오는 곳을 확인하니 null값으로 변경되어 들어올때 조건문을 추가하여 Null값일때 모든 레코드를 출력하는 쿼리문을 추가할 수 있다.
조건문을 사용할때 입력되는 값이 NULL일 경우를 가장 먼저 고려하면서 조건문의 처음에 사용할 수있도록 한다.