FrontPage > - MyBatisの覚書

Mapper XMLファイル

1. 自動マッピング

検索結果とそれを格納するjavaオブジェクトとの自動マッピングについて。

  • カラム名(別名可)とresultTypeのプロパティ名が同じ場合、resultTypeがHashMapの場合は自動マッピングされる。
  • mybatis-config.xmlのsettingsでmapUnderscoreToCamelCaseをtrueにセットすれば、
    A_COLUMNのようなカラムは自動でaColumnプロパティにマッピングされる。

    例) mybatis-config.xml
    ・・・
    <configuration>
        ・・・
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        ・・・
  • resultMapで指定されていないカラムは可能であれば自動マッピングされる。

2. <resultMap>

  • 検索結果のJavaオブジェクトに対するマッピングを指定する。
    例)
     <resultMap id="BaseResultMap" type="com.ziqoo.mybatisSample.entity.Emp" >
       <id column="emp_no" property="empNo" jdbcType="INTEGER" />
       <result column="e_name" property="eName" jdbcType="VARCHAR" />
       <result column="job" property="job" jdbcType="VARCHAR" />
       <result column="mgr" property="mgr" jdbcType="INTEGER" />
       <result column="hire_date" property="hireDate" jdbcType="DATE" />
       <result column="sal" property="sal" jdbcType="NUMERIC" />
       <result column="comm" property="comm" jdbcType="NUMERIC" />
       <result column="dept_no" property="deptNo" jdbcType="INTEGER" />
     </resultMap>
  • extends属性を使用して他のresultMapを継承することが出来る。
    例)
    <resultMap id="carResult" type="Car" extends="vehicleResult">
      <result property="doorCount" column="door_count" />
    </resultMap>

2.1 id, result

  • resultの代わりにidを使用すると、識別子プロパティとして使用される。
    通常、主キーに当たるものをid指定しておけばよい。
  • 指定可能な属性
    property、column、javaType、jdbcType、typeHandler

2.2 constructor

  • コンストラクタインジェクションを使用して値を設定する
    例)
    <resultMap id="detailedBlogResultMap" type="Blog">
      <constructor>
        <idArg column="id" javaType="int"/>
        <arg column="username" javaType="String"/>
      </constructor>
      ・・・

2.3 association

  • 以下のような"対1"関連のクラスに対するマッピングを指定する。
    spring32.png

2.3.1 ネストされたselectによる検索結果のマッピング

  • 下記2つのselectを使用する。
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
    	select
    	  emp_no, e_name, job, mgr, hire_date, sal, comm, dept_no,
    	from emp
    	where emp_no = #{empNo}
    </select>
    <select id="selectDept" resultMap="DeptResultMap" parameterType="java.lang.Integer">
    	select
    	  dept_no, d_name, loc
    	from dept
    	where dept_no = #{deptNo}
    </select>
  • resultMapは以下のようになる。DeptResultMapは省略
    <resultMap id="BaseResultMap" type="com.ziqoo.mybatisSample.entity.Emp">
    	<id column="emp_no" property="empNo" jdbcType="INTEGER" />
    	<result column="e_name" property="eName" jdbcType="VARCHAR" />
    	・・・
    	<association property="dept" column="dept_no" javaType="Dept" select="selectDept"/>
    </resultMap>
  • column属性には2つ目のselectに引数として渡される列名を指定する。
    複数指定するにはcolumn="{prop1=col1,prop2=col2}のように記述する。

2.3.2 ネストされた結果によるマッピング

  • 以下のselect結果をマッピングする。
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
    	select
    	  emp_no, e_name, job, mgr, hire_date, sal, comm, e.dept_no,
    	  d.dept_no as dept_dept_no, d_name as dept_d_name, loc as dept_loc
    	from emp e
    	  join dept d on d.dept_no = e.dept_no
    	where emp_no =
    	  #{empNo}
    </select>
  • resultMapは以下のようになる。
    <resultMap id="BaseResultMap" type="com.ziqoo.mybatisSample.entity.Emp">
    	<id column="emp_no" property="empNo" jdbcType="INTEGER" />
    	<result column="e_name" property="eName" jdbcType="VARCHAR" />
    	・・・
    	<association property="dept" javaType="com.ziqoo.mybatisSample.entity.Dept">
    		<id column="dept_dept_no" property="deptNo" jdbcType="INTEGER" >
    		<result column="dept_d_name" property="dName" jdbcType="VARCHAR" />
    		<result column="dept_loc" property="loc" jdbcType="VARCHAR" />
    	</association>
    </resultMap>
  • associationのresultMapを分けて記述することも出来る。
    <resultMap id="BaseResultMap" type="com.ziqoo.mybatisSample.entity.Emp">
    	<id column="emp_no" property="empNo" jdbcType="INTEGER" />
    	<result column="e_name" property="eName" jdbcType="VARCHAR" />
    	・・・
    	<association property="dept" resultMap="DeptResultMap"/>
    </resultMap>
    <resultMap id="DeptResultMap" type="com.ziqoo.mybatisSample.entity.Dept">
    	<id column="dept_dept_no" property="deptNo" jdbcType="INTEGER" >
    	<result column="dept_d_name" property="dName" jdbcType="VARCHAR" />
    	<result column="dept_loc" property="loc" jdbcType="VARCHAR" />
    </resultMap>
  • 上記はまた以下のようにcolumnPrefixを使用して記述することも出来る。
    こうするとresultMap"DeptResultMap"の再利用性が高まる。
    <resultMap id="BaseResultMap" type="Emp">
    	<id column="emp_no" property="empNo" jdbcType="INTEGER" />
    	<result column="e_name" property="eName" jdbcType="VARCHAR" />
    	・・・
    	<association property="dept" resultMap="DeptResultMap" columnPrefix="dept_"/>
    </resultMap>
    <resultMap id="DeptResultMap" type="Dept">
    	<id column="dept_no" property="deptNo" jdbcType="INTEGER" >
    	<result column="d_name" property="dName" jdbcType="VARCHAR" />
    	<result column="loc" property="loc" jdbcType="VARCHAR" />
    </resultMap>

2.4 collection

  • 以下のような"対多"関連をマッピングする。
    spring33.png

2.4.1 ネストされたselectによる検索結果のマッピング

  • 下記2つのselectを使用する。
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
    	select
    	  dept_no, d_name, loc
    	from dept
    	where dept_no = #{deptNo}
    </select>
    <select id="selectEmp" resultMap="EmpResultMap" parameterType="java.lang.Integer">
    	select
    	  emp_no, e_name, job, mgr, hire_date, sal, comm, dept_no
    	from emp
    	where dept_no = #{deptNo}
    </select>
  • resultMapは以下のようになる。EmpResultMapは省略
    <resultMap id="BaseResultMap" type="com.ziqoo.mybatisSample.entity.Dept">
    	<id column="dept_no" property="deptNo" jdbcType="INTEGER" />
    	<result column="d_name" property="dName" jdbcType="VARCHAR" />
    	<result column="loc" property="loc" jdbcType="VARCHAR" />
    	<collection property="empList" javaType="ArrayList" column="dept_no" ofType="Emp" select="selectEmp" />
    </resultMap>

2.4.2 ネストされた結果によるマッピング

  • 以下のselect結果をマッピングする。
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
    	select
    	  d.dept_no, d.d_name, d.loc,
    	  e.emp_no as e_emp_no, e.e_name as e_e_name, e.job as e_job, e.mgr as e_mgr,
    	  e.hire_date as e_hire_date, e.sal as e_sal, e.comm as e_comm, e.dept_no e_dept_no
    	from dept d
    	  join emp e on e.dept_no = d.dept_no
    	where d.dept_no = #{deptNo}
    </select>
  • resultMapは以下のようになる。
    <resultMap id="BaseResultMap" type="com.ziqoo.mybatisSample.entity.Dept">
    	<id column="dept_no" property="deptNo" jdbcType="INTEGER" />
    	<result column="d_name" property="dName" jdbcType="VARCHAR" />
    	<result column="loc" property="loc" jdbcType="VARCHAR" />
    	<collection property="empList" ofType="Emp" resultMap="EmpResultMap" columnPrefix="e_"/>
    </resultMap>
    <resultMap id="EmpResultMap" type="com.ziqoo.mybatisSample.entity.Emp">
    	<id column="emp_no" property="empNo" jdbcType="INTEGER" />
    	<result column="e_name" property="eName" jdbcType="VARCHAR" />
    	<result column="job" property="job" jdbcType="VARCHAR" />
    	<result column="mgr" property="mgr" jdbcType="INTEGER" />
    	<result column="hire_date" property="hireDate" jdbcType="DATE" />
    	<result column="sal" property="sal" jdbcType="NUMERIC" />
    	<result column="comm" property="comm" jdbcType="NUMERIC" />
    	<result column="dept_no" property="deptNo" jdbcType="INTEGER" />
    </resultMap>

2.5 discriminator

  • 検索結果により使用するresultMapを切り替える。
    例) vehicle_typeカラムの値によりresultMapを選択する。
    caseで一致する値がない場合は外側で指定されているresultMap"vehicleResult"が適用される。
    <resultMap id="vehicleResult" type="Vehicle">
        <id property="id" column="id" />
        <result property="vin" column="vin"/>
        <result property="year" column="year"/>
        <result property="make" column="make"/>
        <result property="model" column="model"/>
        <result property="color" column="color"/>
        <discriminator javaType="int" column="vehicle_type">
            <case value="1" resultMap="carResult"/>
            <case value="2" resultMap="truckResult"/>
            <case value="3" resultMap="vanResult"/>
            <case value="4" resultMap="suvResult"/>
        </discriminator>
    </resultMap>

3. <sql>、<include>

  • 他のステートメントから参照することができる再利用可能なSQL文字列。
    例)
     <sql id="Base_Column_List" >
       emp_no, e_name, job, mgr, hire_date, sal, comm, dept_no
     </sql>
  • <include>を使用してインクルードする。
    例)
     <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
       select
           <include refid="Base_Column_List" />
       from emp
       where emp_no = #{empNo,jdbcType=INTEGER}
     </select>

4. <select>, <insert>, <update>, <delete>

4.1 select

  • 例)
     <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
       select
       <include refid="Base_Column_List" />
       from emp
       where emp_no = #{empNo,jdbcType=INTEGER}
     </select>

4.2 insert

  • 例)
    	<insert id="insert" parameterType="com.ziqoo.mybatisSample.entity.Emp">
    		insert into emp (
    			emp_no, e_name, job, mgr,
    			hire_date, sal, comm, dept_no
    		) values (
    			#{empNo,jdbcType=INTEGER}, #{eName,jdbcType=VARCHAR}, #{job,jdbcType=VARCHAR}, #{mgr,jdbcType=INTEGER},
    			#{hireDate,jdbcType=DATE}, #{sal,jdbcType=NUMERIC}, #{comm,jdbcType=NUMERIC}, #{deptNo,jdbcType=INTEGER}
    		)
    	</insert>

4.3 update

  • 例)
    	<update id="updateByPrimaryKey" parameterType="com.ziqoo.mybatisSample.entity.Emp">
    		update emp set 
    			e_name = #{eName,jdbcType=VARCHAR}, job = #{job,jdbcType=VARCHAR},
    			mgr = #{mgr,jdbcType=INTEGER}, hire_date = #{hireDate,jdbcType=DATE},
    			sal = #{sal,jdbcType=NUMERIC}, comm = #{comm,jdbcType=NUMERIC},
    			dept_no = #{deptNo,jdbcType=INTEGER}
    		where emp_no = #{empNo,jdbcType=INTEGER}
    	</update>

4.4 delete

  • 例)
    	<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    		delete from emp
    		where emp_no = #{empNo,jdbcType=INTEGER}
    	</delete>

4.5 属性

  • 属性selectinsertupdatedelete説明
    parameterTypeこのステートメントに渡される引数の型。
    resultType---このステートメントから返されるオブジェクトの型。コレクションを返す場合は、コレクションに含まれるオブジェクトの型を指定。
    resultMap---resultMapを指定。resultTypeとresultMap のどちらか一方のみ指定可能。
    flushCachetrue:ステートメント実行時にローカルキャッシュおよび2次キャッシュがフラッシュされる。selectの場合、デフォルト:false。insert, update, deleteの場合デフォルト:true。
    useCache---true:ステートメントの結果が2次キャッシュに保存される。selectの場合、デフォルト:true。
    timeouttimeout最大待機時間(単位:秒)デフォルト:未設定(ドライバー依存)。
    fetchSize---内部的に使用するキャッシュサイズ。デフォルト:未指定(ドライバー依存)
    statementTypeStatementの種類を指定。設定可能な値は STATEMENT, PREPARED, CALLABLE。デフォルト:PREPARED。
    resultSetType---FORWARD_ONLY, SCROLL_SENSITIVE, SCROLL_INSENSITIVE。デフォルト:未指定(ドライバー依存)
    databaseId???databaseIdProviderが設定されている場合、databaseId 属性が指定されていないステートメントおよび現在の設定と一致する databaseId 属性を持ったステートメントをロードする。 同じステートメントで、databaseId 属性が指定されているものと指定されていないものが両方定義されていた場合、指定がないステートメントは無視される。
    useGeneratedKeys---JDBCのgetGeneratedKeysメソッドを使ってデータベース側で自動生成されたキーを取得するよう指示。デフォルト:false
    keyProperty---useGeneratedKeysがtrueの場合、自動生成されたキーの設定先プロパティを指定。
    keyColumn---テーブル内で自動生成が設定されている列の名前を指定。この設定は、特定のデータベース(例えば PostgreSQL)で、テーブルの先頭以外の列にキーの自動生成が設定されている場合にのみ必要。
  • databaseIdProvider設定例
    mybatis-config.xmlに以下を記述する。
    <databaseIdProvider type="VENDOR" />

    DatabaseMetaData#getDatabaseProductName() から返される製品名の文字列が「現在の databaseIdとなる。
    この文字列を短い文字列に変換してdatabaseIdとするには以下のようにする。
    例)
    <databaseIdProvider type="VENDOR">
      <property name="SQL Server" value="sqlserver"/>
      <property name="DB2" value="db2"/>
      <property name="Oracle" value="oracle" />
    </databaseIdProvider>
  • useGeneratedKeys使用例
    <insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys="true" keyProperty="id">
     insert into Author (username,password,email,bio)
     values (#{username},#{password},#{email},#{bio})
    </insert>

4.6 selectKey

  • 主キーの自動生成に対応していないデータベースやドライバー用
    例) idをinsert時に自動設定
    <insert id="insertAuthor" parameterType="domain.blog.Author">
     <selectKey keyProperty="id" resultType="int" order="BEFORE">
         id取得用SQL
     </selectKey>
     insert into Author
       (id, username, password)
     values
       (#{id}, #{username}, #{password})
    </insert>

    orderBEFORE:最初にselectKeyを実行。AFTER:insert後にselectKeyステートメントを実行。Oracleのようにinsertの中にsequenceの呼び出しを含むようなケースで良く使われる。
    statementTypeStatementの種類を指定。設定可能な値は STATEMENT, PREPARED, CALLABLE。デフォルト:PREPARED。

5. パラメータ

  • #{引数}のように指定する。
    parameterTypeがintやStringなどの場合、引数名は何でもよい。
    オブジェクトの場合はプロパティを指定する。
    例)
    	<insert id="insert" parameterType="com.ziqoo.mybatisSample.entity.Emp">
    		insert into emp (
    			emp_no, e_name
    		) values (
    			#{empNo}, #{eName}
    		)
    	</insert>
  • jdbcType, javaType等も指定できる。
    例)
    #{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler},
    #{department, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=departmentResultMap}
  • parameterTypeがHashMapの場合はjavaTypeが必須
    例)
    #{height,javaType=double}
  • null値が設定可能な列ではjdbcTypeが必須
    例)
    #{eName,jdbcType=VARCHAR}

5.1 文字列置換

  • ${引数}と記述することで、引数の文字列がそのままSQL文に挿入される。
    例) columnNmae = "emp_no, e_name"
    ORDER BY ${columnName}

6 cache

  • グローバルな2次キャッシュを有効にする。
    例)
    <cache/>
  • ステートメント単位にキャッシュの有効無効を設定する。
    例) 以下はデフォルト値
    <select ... flushCache="false" useCache="true"/>
    <insert ... flushCache="true"/>
    <update ... flushCache="true"/>
    <delete ... flushCache="true"/>

7. その他

7.1 Java タイプに対する短縮名(typeAliases)

  • mybatis-config.xmlのtypeAliasesでJava タイプに対する短縮名を設定できる。
    例)
    <typeAliases>
    	<typeAlias alias="Emp" type="com.ziqoo.mybatisSample.entity.Emp" />
    	・・・
  • パッケージを指定することも出来る。
    例)
    <typeAliases>
    	<package name="com.ziqoo.mybatisSample.entity" />
    	 ・・・
  • 使用例
     <resultMap id="BaseResultMap" type="Emp" >





添付ファイル: filespring33.png 1114件 [詳細] filespring32.png 1424件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-09-15 (土) 04:10:14 (2412d)