• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

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객체, 값, ... );

01

@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>

02

  • 이름을 클릭해서 상세정보로 이동하는 페이지를 만들 것
    • 위 상태에서 지역, 출신고를 제거(도메인, 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>
...

03

  • 한행을 조회하더라도 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>

04



Java EESpring