dev-sian / meetings

잡다구리
0 stars 0 forks source link

쿼리 매핑 방법 공유 #11

Open ybkim-dev opened 2 years ago

ybkim-dev commented 2 years ago

MyBatis는 Entity에 DB에서 가져온 결과를 자동 매핑외에 resultMap을 사용해서 수동으로 매핑 지원

<?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 namespace="sample.mybatis">
    <resultMap id="testTableResultMap" type="sample.mybatis.TestTable">
         <id property="id" column="id" />
         <result property="value" column="value" /> 
    </resultMap> 
    <select id="selectTest" resultMap="testTableResultMap"> 
            select * from test_table
    </select> 
</mapper>

resultMap 태그를 사용해서 검색 결과와 Java Class 간의 매핑을 정의

id 태그로 식별자 속성을 정의

result 태그로 각 column의 매핑을 정의

Has One 관계 매핑

<?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 namespace="sample.mybatis">
     <resultMap type="sample.mybatis.TestTable" id="testTableResultMap">
         <id property="id" column="id" /> 
         <result property="string" column="string" />
         <association property="embedded" javaType="sample.mybatis.Embedded"> 
             <result property="number" column="number" />
         </association> 
     </resultMap>
     <select id="selectTest" resultMap="testTableResultMap">
             select * from test_table
     </select>
</mapper>

association 태그를 사용해서 애트리뷰트가 클래스인 경우 매핑 정의

property 태그는 Entity의 property, 태그는 Database의 column

Has Many 관계 매핑

<?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 namespace="sample.mybatis">
     <resultMap type="sample.mybatis.Foo" id="fooResultMap">
         <id property="id" column="id" /> <!-- collection 태그를 사용한다. --> 
         <collection property="barList" ofType="sample.mybatis.Bar">
             <id property="id" column="bar_id" /> 
         </collection>
     </resultMap> 
     <select id="selectFoo" resultMap="fooResultMap"> 
            select foo.id ,bar.id bar_id from foo_table foo ,bar_table bar where bar.foo_id = foo.id 
     </select> 
</mapper>

collection 태그를 사용해서 List 표현

ofType 속성으로 리스트가 될 클래스 설정

상속 관계에 있는 클래스 동일 데이터베이스에서 매핑하기

스크린샷 2022-05-11 오후 11 23 45

<?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 namespace="sample.mybatis">

  <resultMap type="sample.mybatis.Base" id="baseResultMap">
    <id property="id" column="id" />
    <result property="commonValue" column="common_value" />

    <discriminator javaType="int" column="type">
      <case value="1" resultType="sample.mybatis.Hoge">
        <result property="value" column="hoge_value" />
      </case>
      <case value="2" resultType="sample.mybatis.Fuga">
        <result property="value" column="fuga_value" />
      </case>
    </discriminator>
  </resultMap>

  <select id="selectBase" resultMap="baseResultMap">
    select * from base_table
  </select>
</mapper>

discriminator, case 태그를 사용해서 조건을 지정할 column을 설정하고(type), 특정 조건에 따라 상속받은 클래스를 resultType으로 지정

case 식에 존재하지 않는 조건 값의 경우 부모 클래스의 애트리뷰트들만 매핑됨