Java EE 정리 43
26 Apr 2019
Reading time ~3 minutes
Java EE 정리 43 - Spring JDBC(3)
Spring JDBC를 사용한 조회
- 조회는 RowMapper interface 사용 * 조회된 결과를 VO(Domain)에 저장하는 일
- 한행 조회
Object o = JdbcTemplate.queryForObject("sql문", RowMapper객체, 값, ... );
- 여러행 조회
List l = JdbcTemplate.query("sql문", RowMapper객체, 값, ... );
@Component
class DAO {
@Autowired
JdbcTemplate jt;
public List<DeptDomain> selectAllDept() throws DataAccessExcpetion {
List<DeptDomain> list = null;
// 조회결과를 Domain에 저장토록 설정, anonymous inner class 생성
RowMapper<DeptDomain> rm = new RowMapper<DeptDomain>(){
@Override
public DeptDomain mapRow(ResultSet rs, int rowNum) {
DeptDomain dd = new DeptDomain(
rs.getInt("deptno"), rs.getString("dname"),
rs.getString("loc"))
return dd;
}
}
// 쿼리문 생성
String selectDept = "..." ;
// 실행
list = jt.query(selectDept, rm);
return list;
}
}
Spring JDBC를 사용한 조회 예
- spring_jdbc 프로젝트 이어서 작업
<!-- index.jsp -->
...
<ul>
<li><a href="add_form.do">정보추가</a></li>
<li><a href="search_member.do">정보조회</a></li>
</ul>
...
package kr.co.sist.domain;
public class Member {
private String name, loc, highschool, img;
private int num;
// 기본, 인자있는 생성자, getter, setter
...
@Component
public class JdbcDAO {
@Autowired(required=false)
private JdbcTemplate jt;
...
public List<Member> selectAllMember() throws DataAccessException {
List<Member> list = null;
// 조회결과를 Domain에 저장하는 객체 생성(RowMapper)
RowMapper<Member> rm = new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
Member member = new Member(rs.getString("name"), rs.getString("loc"),
rs.getString("highschool"), rs.getString("img"), rs.getInt("num"));
return member;
}
};
// SQL문 작성
String selectMember = "SELECT name, loc, highschool, img, num FROM test_like";
// 실행
list = jt.query(selectMember, rm);
return list;
}
}
@Component
public class JdbcService {
@Autowired(required=false)
private JdbcDAO jdao;
...
public List<Member> searchAllMember() {
List<Member> list = null;
try {
list = jdao.selectAllMember();
} catch (DataAccessException dae) {
dae.printStackTrace();
}
return list;
}
}
@Controller
public class JdbcController {
@Autowired
private JdbcService js;
...
@RequestMapping(value="/search_member.do", method=GET)
public String searchAllMember(Model model) {
List<Member> list = js.searchAllMember();
model.addAttribute("memberList", list);
return "member/member_list";
}
}
<!-- member/member_list.jsp -->
...
<div>
<c:forEach var="ml" items="${ requestScope.memberList }">
<table>
<tr>
<td rowspan="4">
<img src="http://localhost:8080/spring_jdbc/upload/${ ml.img }" width="100" height="100"/>
</td>
</tr>
<tr>
<td width="80">이름</td>
<td>
<input type="text" value="${ ml.name }" class="inputBox" readonly="readonly"/>
</td>
</tr>
<tr>
<td width="80">지역</td>
<td>
<input type="text" value="${ ml.loc }" class="inputBox" readonly="readonly"/>
</td>
</tr>
<tr>
<td width="80">출신고</td>
<td>
<input type="text" value="${ ml.highschool }" class="inputBox" readonly="readonly"/>
</td>
</tr>
</table>
</c:forEach>
<c:if test="${ empty memberList }">
조회된 회원이 존재하지 않습니다. 회원정보를 추가해주세요.<br/>
<div>
<ul>
<li><a href="add_form.do">정보추가</a></li>
<li><a href="search_member.do">정보조회</a></li>
</ul>
</div>
</c:if>
</div>
-
이름을 클릭해서 상세정보로 이동하는 페이지를 만들 것
- 위 상태에서 지역, 출신고를 제거(도메인, DAO 내용 변경)
<!-- member/member_list.jsp -->
...
<tr>
<td width="80">이름</td>
<td>
<a href="detail_member.do?num=${ ml.num }"><c:out value="${ ml.name }"/></a>
</td>
</tr>
...
- 한행을 조회하더라도 RowMapper를 사용하는건 동일
// JdbcDAO
...
public DetailMember selectOneMember(int num) throws DataAccessException {
DetailMember dm = null;
RowMapper<DetailMember> rm = new RowMapper<DetailMember>() {
@Override
public DetailMember mapRow(ResultSet rs, int rowNum) throws SQLException {
DetailMember dm = new DetailMember(rs.getString("name"),
rs.getString("img"), rs.getString("loc"), rs.getString("highschool"));
return dm;
}
};
String selectOneMember = "SELECT name, img, loc, highschool FROM test_like WHERE num=?";
dm = jt.queryForObject(selectOneMember, rm, num);
return dm;
}
}
// JdbcService
...
public DetailMember searchOneMember(int num) {
DetailMember dm = null;
try {
dm = jdao.selectOneMember(num);
} catch (DataAccessException dae) {
dae.printStackTrace();
}
return dm;
}
}
// JdbcController
...
@RequestMapping(value="/detail_member.do", method=GET)
public String detailMember(@RequestParam(defaultValue="0") int num, Model model) {
DetailMember dm = js.searchOneMember(num);
model.addAttribute("detailMember", dm);
return "member/detail_member";
}
}
<!-- member/detail_member.jsp -->
...
<c:choose>
<c:when test="${ empty detailMember }">
<h2>조회된 회원이 존재하지 않습니다.</h2>
</c:when>
<c:otherwise>
<table border="1" style="text-align:center;">
<tr>
<th colspan="3"><h2>상세 회원정보</h2></th>
</tr>
<tr>
<td width="100">이미지</td>
<td width="100">이름</td>
<td width="100">
<c:out value="${ detailMember.name }"/>
</td>
</tr>
<tr>
<td rowspan="4">
<img id="img" src="/spring_jdbc/upload/${ detailMember.img }" style="width:100px; height:100px;"/>
</td>
</tr>
<tr>
<td>지역</td>
<td><c:out value="${ detailMember.loc }"/></td>
</tr>
<tr>
<td>출신고</td>
<td>
<c:out value="${ detailMember.highschool }" class="inputBox"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" onclick="history.back()" value="뒤로가기" class="btn"/>
</td>
</tr>
</table>
</c:otherwise>
</c:choose>