ホーム > Java > MyBatis > Mapperの作成

Mapperの作成

1. 対象SQL

以下の様なSQLを発行するMapperを作成する。 検索条件は指定されたものだけを条件とするようにする。 テーブル間の関連は1:1:1である。

    select
     p.id, p.kind_id, p.maker_id, p.product_name, p.create_at, p.update_at, p.version,
     k.id k_id, k.kind_name, k.create_at k_create_at, k.update_at k_update_at, k.version k_version,
     m.id m_id, m.maker_name, m.create_at m_create_at, m.update_at m_update_at, m.version m_version
    from product p
     join kind_mst k on k.id = p.kind_id
     join maker_mst m on m.id = p.maker_id
    where
        p.id = #{id}
        and p.maker_id = #{prod.makerId}
        and p.product_name = #{productName}
    order by p.id

2. 検索結果

検索結果を以下のクラスに格納する。

src/main/java/com/ziqoo/demo/dao/query/model/ProductQueryModel.java

package com.ziqoo.demo.dao.query.model;

import com.ziqoo.demo.dao.table.model.KindMst;
import com.ziqoo.demo.dao.table.model.MakerMst;
import com.ziqoo.demo.dao.table.model.Product;

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = true)
public class ProductQueryModel extends Product {
    private MakerMst makerMst;
    private KindMst kindMst;
}

3. Mapper

Mapperは以下の通り。

src/main/java/com/ziqoo/demo/dao/query/mapper/ProductQueryMapper.java

package com.ziqoo.demo.dao.query.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.ziqoo.demo.dao.query.model.ProductQueryModel;
import com.ziqoo.demo.dao.table.model.Product;

public interface ProductQueryMapper {
    List<ProductQueryModel> selectByProduct(@Param("prod") Product prod);
}

4. XML

XMLファイルは以下の通り

src/main/resources/com/ziqoo/demo/dao/query/mapper/ProductQueryMapper.xml

<?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="com.ziqoo.demo.dao.query.mapper.ProductQueryMapper">

  <resultMap id="resultMap" type="com.ziqoo.demo.dao.query.model.ProductQueryModel">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="kind_id" jdbcType="INTEGER" property="kindId" />
    <result column="maker_id" jdbcType="INTEGER" property="makerId" />
    <result column="product_name" jdbcType="VARCHAR" property="productName" />
    <result column="create_at" jdbcType="TIMESTAMP" property="createAt" />
    <result column="update_at" jdbcType="TIMESTAMP" property="updateAt" />
    <result column="version" jdbcType="INTEGER" property="version" />
    <association property="kindMst" javaType="com.ziqoo.demo.dao.table.model.KindMst">
      <id column="k_id" jdbcType="INTEGER" property="id" />
      <result column="kind_name" jdbcType="VARCHAR" property="kindName" />
      <result column="k_create_at" jdbcType="TIMESTAMP" property="createAt" />
      <result column="k_update_at" jdbcType="TIMESTAMP" property="updateAt" />
      <result column="k_version" jdbcType="INTEGER" property="version" />
    </association>
    <association property="makerMst" javaType="com.ziqoo.demo.dao.table.model.MakerMst">
      <id column="m_id" jdbcType="INTEGER" property="id" />
      <result column="maker_name" jdbcType="VARCHAR" property="makerName" />
      <result column="m_create_at" jdbcType="TIMESTAMP" property="createAt" />
      <result column="m_update_at" jdbcType="TIMESTAMP" property="updateAt" />
      <result column="m_version" jdbcType="INTEGER" property="version" />
    </association>
  </resultMap>

  <select id="selectByProduct" parameterType="com.ziqoo.demo.dao.table.model.Product" resultMap="resultMap">
    select
     p.id, p.kind_id, p.maker_id, p.product_name, p.create_at, p.update_at, p.version,
     k.id k_id, k.kind_name, k.create_at k_create_at, k.update_at k_update_at, k.version k_version,
     m.id m_id, m.maker_name, m.create_at m_create_at, m.update_at m_update_at, m.version m_version
    from product p
     join kind_mst k on k.id = p.kind_id
     join maker_mst m on m.id = p.maker_id
    <where>
        <if test="prod.id != null">
        p.id = #{prod.id}
        </if>
        <if test="prod.makerId != null">
        and p.maker_id = #{prod.makerId}
        </if>
        <if test="prod.productName != null">
        and p.product_name = #{prod.productName}
        </if>
    </where>
    order by p.id
  </select>

</mapper>

テーブル関連が1:nの場合は上記resultMapのassociationをcollectionタグに変更する。

例)

    <collection oftype="com.ziqoo.demo.dao.table.model.MakerMst" property="makerList">
      ...
    </collection>

リンク

コーポレートサイトにちょうどいいCMS、baserCMS