MyBatisのいくつかの関連クエリー構成

9060 ワード

前言
       MyBatis         

本文
<select id="getLogonByCondition" parameterType="withoutspring.TestDTO" resultMap="logons">
        select t.id as logon_id,
               t.logonname,
               t.password,
               t.userid,
               t1.id as user_id,
               t1.displayname,
               t1.logon
        from logon t,user1 t1
        where t.userid = t1.id
        <if test="userid != null">
            and t.userid = #{userid}
        </if>
        <if test="displayname != null and displayname != '' ">
            and t1.displayname = #{displayname}
        </if>   
    </select>

これはmybatisクエリー関連の構成です.上から見ると、sqlの関連クエリーを通じて2つのテーブルに必要なフィールドをクエリーしました.次に必要なのは、クエリーのフィールドを返されるオブジェクトに一致させることです.ここで返されるオブジェクトはLogonのjavaBeanです.
    private Integer id;
    private String logonname;
    private String password;
    private List<User> user;

id、logonname、passwordはlogonテーブルの中で、このマッチングは簡単で、肝心なのはListがどのようにクエリーしたフィールドに関連しているかです.リストは集合であるためresultMap構成ではというラベルを使用しており、1つのエンティティークラスオブジェクトであればラベルを使用しており、2つの使用方法の差は少ない
 <select id="getLogonByCondition" parameterType="withoutspring.TestDTO" resultMap="logons">
        select t.id as logon_id,
               t.logonname,
               t.password,
               t.userid,
               t1.id as user_id,
               t1.displayname,
               t1.logon
        from logon t,user1 t1
        where t.userid = t1.id
        <if test="userid != null">
            and t.userid = #{userid}
        </if>
        <if test="displayname != null and displayname != '' ">
            and t1.displayname = #{displayname}
        </if>   
    </select>

対応するresultMap構成
<resultMap id="logons" type="withoutspring.Logon">
        <id property="id" column="logon_id" />
        <result property="logonname" column="logonname"/>
        <result property="password" column="password"/>
        <!--     ,    association   collection-->
        <!--   select(n+1),   resultmap( ,sql    ,    ),   collection        -->
        <!-- column   sql     ,         -->
        <collection property="user" javaType="list" ofType="withoutspring.User">
            <id property="id" column="user_id" />
            <result property="display" column="displayname"/>
            <result property="logon" column="logon"/>
        </collection>
    </resultMap>

具体的にはの構成を見てみましょう.selectでクエリーされたフィールドを戻りオブジェクトに一致させるためには、クエリーされたフィールドを戻りオブジェクトの属性に一つ一つ対応させなければなりません.
select t.id as logon_id,  //column logon_id
               t.logonname, //column logonname
               t.password, //column password
               t.userid,   //column userid
               t1.id as user_id, //column  user_id
               t1.displayname,  //displayname
               t1.logon   //displayname

上のコード注釈から分かるように、別名がある場合、別名はcolumnであり、別名がない場合、columnの各テーブルのフィールド名である.ここで、t.idおよびt 1.idが別名を使用しない場合、columnはidであり、曖昧さが生じる.
<collection  property="user" javaType="list" ofType="withoutspring.User">
            <id property="id" column="user_id" />
            <result property="display" column="displayname"/>
            <result property="logon" column="logon"/>
        </collection>

関連表からt 1.id as user_を調べましたid,t 1.displayname,t 1.logonの3つのフィールドをLogonに関連付けます:t 1.displaynameからクエリーされた値は、このUserオブジェクトのdisplay属性に付与され、クエリーされたt 1.logonの値はUserオブジェクトのlogon属性に付与される
resultMapの利点は、クエリされたcolumn(別名またはテーブルフィールド名)の値が、返されたオブジェクトのpropertyと一致することです.hibernateでhibernateTemplateを使用してsqlクエリーを作成するには、setResultTransformerを使用してエンティティクラスをバインドする必要があります.また、エンティティクラスのプロパティと一致するように別名(column)を使用する必要があります.
もちろん、関連クエリーではcollectionでselect(n+1の問題がある)、resultMap(コード重複を減らす)を使用することもできます.
2つのデータがクエリされた場合、resultMapの戻りオブジェクトがLogonである場合、どのようにして1つのセットを返すことができますか?インタフェースの戻り値をListに設定するだけで、プロファイルresultMapは、クエリされた各ローのデータとエンティティークラスマッピングの関係を説明するだけです