세련된 SQL map (iBATIS)
현재 어플리케이션에서 XML파일에 있는 SQL문들 중에서 find관련 SQL문들 입니다.
[#M_ more.. | less.. |
<!-- find -->
<select id="findByName" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE name = #name#;
</select>
<select id="findByMessengerId" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE messengerId = #messengerId#;
</select>
<select id="findByEmail" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE email = #email#;
</select>
<select id="findByBlugAddress" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE blugAddress = #blugAddress#;
</select>
<select id="findByPhone" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE phone = #phone#;
</select>
_M#]
얼핏보면 전부 같아 보이지만 다들 매~우 조금씩 다릅니다. 좀더 세련되게 고치기 위해서 다음과 같이 코드를 수정합니다.
[#M_ more.. | less.. |
<select id="find" resultMap="memberMap">
SELECT id, name, messengerId, email, blugAddress, phone
FROM Member
WHERE
<isNotNull property="phone">phone = #phone#</isNotNull>
<isNotNull property="blugAddress">blugAddress = #blugAddress#</isNotNull>
<isNotNull property="email">email = #email#</isNotNull>
<isNotNull property="messengerId">messengerId = #messengerId#</isNotNull>
<isNotNull property="name">name = #name#</isNotNull>
</select>
_M#]
그리고 SqlmapMemberDao 클래스의 코드를 다음과 같이 맵을 사용하도록 수정합니다.
[#M_ more.. | less.. |
public List<Member> findByPhone(String phone) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("phone", phone);
return getSqlMapClientTemplate().queryForList("Member.find", params);
}
_M#]
이전의 SqlmapMemberDao 클래스에 있던 코드는 다음과 같았습니다.
[#M_ more.. | less.. |
public List<Member> findByPhone(String phone) {
return getSqlMapClientTemplate().queryForList("Member.findByPhone", phone);
}
_M#]
코드에서의 차이는 각 메소드마다 구체적인 findByXXX와 같은 SQL문을 부르다가 좀더 추상적인 find라는 SQL을 부르게 바뀌었습니다. 이것도 이 전에 썼던 메소드 추상화와 비슷한 특징이 있는 것 아닌가 생각해봅니다.