56일차_JAVA

서창민·2023년 5월 30일
0

JAVA

목록 보기
9/21
post-thumbnail

23.05.30 화 56일차

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 값을 받아 오고 데이터 베이스를 거쳐 반환된 쿼리문의 값이 출력되도록 프린트 해준다.

  • NULL 값 조건 추가하기
두개의 값을 받아 특정 레코드를 출력하는 코드
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일 경우를 가장 먼저 고려하면서 조건문의 처음에 사용할 수있도록 한다.

profile
Back-end Developer Preparation Students

0개의 댓글