어려웠던 부분

최주영·2023년 7월 5일
0

세미프로젝트

목록 보기
11/11

3개의 테이블을 join 한 데이터 가져오기

  • 하나의 클래스안의 멤버변수에 3개의 객체 클래스를 넣는다
// 클래스 
public class ReportProductMember {
	private Report report; // 하나의 클래스안의 멤버변수에 3개의 객체클래스 넣음
	private Product product;
	private Member member;
 }
// 서블릿
// 반환형은 3개의 객체클래스를 담은 클래스이다
ReportProductMember rpm = new AdminService().reportProductMember(reportNo); 
// 서비스
	public ReportProductMember reportProductMember(String reportNo) {
		Connection conn = getConnection();
		ReportProductMember rpm = dao.reportProductMember(conn, reportNo);
		close(conn);
		return rpm;
	}
// dao
	public ReportProductMember reportProductMember(Connection conn, String reportNo) {
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		ReportProductMember r = null;
		try {
			pstmt = conn.prepareStatement(sql.getProperty("reportProductMember"));
			pstmt.setString(1, reportNo);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				// 필요한 데이터들만 빌더해서 갖고옴
				r = ReportProductMember.builder()
						.report(Report.builder()
								.reportNo(rs.getInt("REPORT_NO")).build())
						.member(Member.builder()
								.userId(rs.getString("USER_ID"))
								.declareCount(rs.getInt("DECLARE_COUNT"))
								.temperature(rs.getDouble("TEMPERATURE")).build()).build();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			close(rs);
			close(pstmt);
		}return r;
	}
reportProductMember =
SELECT * FROM REPORT_BOARD 
JOIN PRODUCT USING(PRODUCT_ID) JOIN USERS USING(USER_ID) WHERE REPORT_NO=?
// REPORT_BOARD 테이블, PRODUCT 테이블, USERS 테이블 -> 총 3가지 테이블을 조인

  • 선택된 아이디들 모두 삭제하는 로직

// jsp 화면
* 아래 코드는 위 출력되는 부분의 일부분 (해당 로우마다 체크박스들의 값들을 가져온 데이터의 게시글넘버로 지정)
<tr>
	<td>
		<input type="checkbox" id="memberChoice" name="deleteCheck" value="<%=b.getBoardNo()%>"/>
	</td>
	<td><%=b.getBoardNo()%></td>
	<td><%=b.getBoardWriter()%></td>
	<td><%=b.getBoardTitle()%></td>
	<td><%=b.getBoardDate()%></td>
</tr>

<button id="userRemoveCheck" type="button" class="btn btn-danger">선택삭제</button>
// js 파일

	$(document).ready(function() {  // 레디함수
	$("#userRemoveCheck").hide(); // 처음에는 선택삭제 버튼이 안보이게함
	$("input:checkbox").on('click', function() { // 체크박스가 클릭되었을 때
		let arr=[];
		const cnt = document.querySelectorAll('input[name="deleteCheck"]:checked').length; 
      		// 클릭된 체크박스 개수를 구함 
				
		if(cnt>=1){  // 체크된 체크박스 개수가 한개이상일때는 선택삭제 버튼만 보이게함
			$("#userRemoveCheck").show();
			$("#userRemoveAll").hide();
			$(".updateBtn").hide();
			$(".deleteBtn").hide();
		}
		else{
			$("#userRemoveCheck").hide();
			$("#userRemoveAll").show();
			$(".updateBtn").show();
			$(".deleteBtn").show();
		}
	    });
	});


		$("#userRemoveCheck").click(e=>{
		let arr = [];
		$("input[name=deleteCheck]:checked").each((index,e)=>{ // 체크박스 클릭될때마다 체크된개수 파악
			arr.push(e.value); // 배열에다 체크된 값들 저장 (ajax로 배열보내야함)
		});

		
		$.ajax({
			url: "deleteCheckBoard",
			data: {"arr": arr},   // 배열자체를 데이터로 보냄
			success: function(result) {
				if(result>=1){
					alert("성공적으로 삭제되었습니다.");
					location.replace("/semi-hifive/boardListAdmin.do");
				}else{
					alert("오류로 인해 삭제가 실패했습니다");
					location.replace("/semi-hifive/boardListAdmin.do");
				}
			},
			error: function() {
				console.log("선택삭제실패");
			}
		})
	})
// 서블릿
		String arr[] = request.getParameterValues("arr[]"); // arr[] -> 배열로 넘기려면 []로 받아야함 
		
		String sql = "";
		for(int i=0; i<arr.length; i++) {
			sql+="'";
			sql+=arr[i];
			sql+="'";
			if(i!=arr.length-1) {
				sql+=",";
			}
		}
		// 쿼리문에서 IN연산자 뒤에 데이터들을 넣기 위해서 각 데이터를 적을때 ,로 구분해줌
		int result = new AdminService().deleteCheckReport(sql);

		response.getWriter().print(result); // ajax의 result값을 반환하기 위해 작성
//dao
	public int deleteCheckReport(Connection conn, String rsql) {
		PreparedStatement pstmt = null;
		int result = 0;
		try {
			pstmt = conn.prepareStatement(sql.getProperty("deleteCheckReport").replace("#data", rsql));
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		return result;
	}
// 쿼리문
deleteCheckReport=DELETE FROM REPORT_BOARD WHERE REPORT_NO IN(#data)

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글