과자와 회사 정보 모두 가져오기 + 과자 하나 상세보기(join) (resources)

2024. 6. 20. 13:59JSP+Spring Boot

snackAndCompany.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        
<!-- mapper 로 insert select update delete 감싸서 보낼 Mapper.java 경로 설정 -->

<mapper namespace="com.khmall.mapper.SCMapper">
	<!-- 제품과 회사명 모두 보는 join select 문 -->
	<select id="getAllSC" resultType="com.khmall.dto.SC">
		SELECT s.snack_id,  s.snack_name, s.price, c.company_name, c.company_phone, c.company_address
		FROM snacks s, company c
		WHERE s.company_id = c.company_id
	</select>

	<select id="getSnackById" resultType="com.khmall.dto.SC" parameterType="int">
		SELECT * FROM snacks
		WHERE SNACK_ID = #{snack_id} 
		<!--  소비자가 원하는 제품 상세페이지를 클릭하면 해당하는 제품의 아이디값을 가져와서 
				아이디값과 일치하는 데이터를 모두 가져옴
		 -->
	</select>
	
	<!-- 
	SELECT s.snack_id,  s.snack_name, s.price, c.company_name, c.company_phone, c.company_address
	FROM snacks s, company c
	WHERE s.company_id = c.company_id
	AND SNACK_ID = #{snack_id} 
		   
	join과 where을 통해 어떤 값을 찾을 때 AND 문을 사용할 수 있다.
	
	
	 -->
</mapper>

 

**제품 상세페이지에 보여줄 select 문 
where 문을 사용해서 특정 변수값을 가지고 올 때  변수값이 String인지 int인지 float 등 어떤 타입인지를 지정하고 알려줘야 함.사용자한테 값을 전달받아 db에서 확인하거나 db에 저장할 때는 parameterType 이라는 것을 사용


resultMap 사용하게 되면 parameterType 사용하지 않아도 됨.

 -> DTO와 DB가 각각 어떤 타입을 가지고 변수명을 사용하는지 서로 매칭시켜놓은 공간이 있기 때문

 

--------------------------------------------------------------------------------------------------------------------------

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>join 문을 활용해서 select 하기</title>
</head>
<body>
	<h1>Join을 활용해서 select 하기</h1>

	 <table border="1">
	 	<thead>
	 		<tr>
	 			<th>과자명</th>
	 			<th>가격</th>
	 			<th>회사명</th>
	 			<th>회사번호</th>
	 			<th>회사주소</th>
	 			<th>과자상세페이지로이동하기</th>
	 		</tr>
	 	</thead>
	 	<tbody>
	 		<tr th:each=" sac   :    ${snackAndCompany}">
	 			<td th:text="${sac.snack_name}"></td>
	 			<td th:text="${sac.price}"></td>
	 			<td th:text="${sac.company_name}"></td>
	 			<td th:text="${sac.company_phone}"></td>
	 			<td th:text="${sac.company_address}"></td>
	 			<td>
	 				<a th:href="@{'/snack/' + ${sac.snack_id}}"> 이동하기</a>
	 				<!--  sql에서 시작하는 id값이 1번부터인데 0이 뜬다. 
	 					  값을 가져오지 못한 것 0 = null
	 				 -->
	 			</td>
	 		</tr>
	 	
	 	
	 	</tbody>
	 
	 </table>
</body>
</html>

 

Mapper.xml 파일에 sql에서 정상적으로 작동하는 join문을 xml 파일에 ";" 을 제외하고 그대로 추가하면 정상적으로 작동이 가능
select의 경우에는 값을 sql db에서 정상적으로 가져오지 않아도 에러가 발생하거나 select에서 가져오는 db 내용물만 보이지 않을 뿐이지 왜 안보이는지 알 수 없으므로 controller에서 Slf4j 어노테이션과 dto에서 toString 어노테이션을 활용해서 값을 정상적으로 가져오는지 확인할 수 있음

 

--------------------------------------------------------------------------------------------------------------------

 

snackDetail.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>과자 상세페이지</title>
</head>
<body>
	<h1>index에서 제품리스트를 클릭했을 때 넘어오는 상세 페이지</h1>
	<div>
		<h1>제품 상세정보에 조인 회사 정보</h1>
		<h3 th:text="${snack.snack_name}"></h3>
		<h3 th:text="${snack.price}"></h3>
		<!--  join 문 활용해서 회사정보도 상세페이지에서 함께 보여주기 -->
	</div>
</body>
</html>

 

-------------------------------------------------------------------------------------------------------------------