📢 [mybatis] sql 문의 부등호 사용시 오류 해결 방법 


🙌 mybatis내의 sql 문 사용예제입니다. (ms-sql server sql 문을 이용한 예제입니다.)

    <select id="verifySms" parameterType="String" resultType="String">
        select 'Y'
        from verifyTelephone
        where authCode = #{authCode}
        and datediff(hour, createDate, GETDATE()) = 1
    </select>

 

🙌  하지만, 부등호가 사용되면 오류가 발생합니다. 

    <select id="verifySms" parameterType="String" resultType="String">
        select 'Y'
        from verifyTelephone
        where authCode = #{authCode}
        and datediff(hour, createDate, GETDATE()) <= 1
    </select>

 

🙌  MyBatis에서 <(작다), >(크다) 같은 부등호를 사용할 때는 XML의 특성상 엔티티 코드로 변환해야 합니다.   

🚨 오류 원인

XML에서는 <와 >를 태그로 인식하기 때문에, 직접 사용하면 파싱 오류가 발생합니다.

✅ 해결 방법: &lt;, &gt; 사용

< → &lt;
> → &gt;

🙌 아래와 같이 사용하면 오류가 발생하지 않습니다.

    <select id="verifySms" parameterType="String" resultType="String">
        select 'Y'
        from verifyTelephone
        where authCode = #{authCode}
        and datediff(hour, createDate, GETDATE()) &lt;= 1
    </select>

 

 

 

 

 

 

📢 mybatis parameter가 2개 이상일 경우 사용방법

💡 parameterType="map"를 이용하면 된다.

    <select id="findById" parameterType="map" resultType="Member">
        SELECT
        <include refid="memberColumns" />
        FROM member
        WHERE id = #{id, jdbcType=BIGINT}
          and member_id = #{memberId, jdbcType=VARCHAR}
    </select>


@Param 이용 

Controller

memberService.findById(Long id, String memberId)

Service

memberMapper.findById(Long id, String memberId)

Mapper

Member findById(@Param("id") Long id, @Param("memberId") Long memberId);


Map 이용 

Controller

Map<String, Object> param = new HashMap<>();
param.put("id", id);
param.put("memberId", memberId);

memberService.findById(id, memberId);

✔ Service

memberMapper.findById(Map<String, Object> param)

Mapper

Member findById(Map<String, Object> param)

 

📌 [mybatis] resultType이 String인 경우 경고 메시지가 뜨네요


Mybatis에서 DB정보를 이용하여 가공된 텍스트값을 받으려고 합니다. 

    <select id="getInfo" resultType="String">
        select 'abc'
    </select>


그런데 mapper interface에서 다음과 같은 경고메세지가 빨간줄과 함께 표시됩니다.

@Mapper 
public interface InfoMapper {
	String getInfo();
}

===============================================
Result type not match for select id="getInfo" 

srcType: java. lang. String 
targetType: java. lang. String
===============================================

분명 같은 타입인데도 말이죠. 

MyBatis에서 resultType="String"을 지정하면 "Result Maps collection does not have a type handler for result object" 또는 비슷한 경고 메시지가 발생할 수 있습니다. 이는 MyBatis가 반환할 데이터 타입을 명확하게 매핑하는 과정에서 발생하는 경고입니다.

📝 해결 방법

resultType="java.lang.String"으로 명시

경고가 단순한 매핑 이슈라면 resultType="java.lang.String"처럼 패키지명을 명확하게 적어주는 것만으로도 해결되는 경우가 있습니다. 

    <select id="getInfo" resultType="java.lang.String">
        select 'abc'
    </select>

이 방법으로 해결이 안된다면..

✅ resultType="String" 대신 resultMap 사용

MyBatis의 resultMap을 정의하고, 이를 select 문에서 참조하는 방식으로 해결할 수 있습니다.

<resultMap id="StringResultMap" type="java.lang.String"/>
<select id="getInfo" resultMap="StringResultMap">
    select 'abc'
</select>

저는 이방법으로 해결했습니다.  🤔

 

 

📌 [mariadb / mysql / mybatis ] Like문 사용방법 

회원테이블에서 김씨 성을 검색하는 방법입니다. 

select *
  from 회원테이블
 where member_id like '김%'

 Mybatis에서 변수로 처리하기 위해서 검색부분을 분리하면 검색이 안됩니다. 

select *
  from 회원테이블
 where member_id like '김' + '%'

concat 함수를 이용하여 분리해야 합니다. 

select *
  from 회원테이블
 where member_id like concat('김', '%')

✅ 이제 Mybatis에서 parameter로 검색어를 받아서 조회할 수 있습니다. 

    <select id="findByMember" parameterType="String" resultType="Member">
        select member_id, member_name
        from member
        where member_name like concat(#{searchTxt},'%')
    </select>

 

+ Recent posts