MyBatisのいくつかの関連クエリー構成
9060 ワード
前言
本文
これはmybatisクエリー関連の構成です.上から見ると、sqlの関連クエリーを通じて2つのテーブルに必要なフィールドをクエリーしました.次に必要なのは、クエリーのフィールドを返されるオブジェクトに一致させることです.ここで返されるオブジェクトはLogonのjavaBeanです.
id、logonname、passwordはlogonテーブルの中で、このマッチングは簡単で、肝心なのはListがどのようにクエリーしたフィールドに関連しているかです.リストは集合であるためresultMap構成ではというラベルを使用しており、1つのエンティティークラスオブジェクトであればラベルを使用しており、2つの使用方法の差は少ない
対応するresultMap構成
具体的にはの構成を見てみましょう.selectでクエリーされたフィールドを戻りオブジェクトに一致させるためには、クエリーされたフィールドを戻りオブジェクトの属性に一つ一つ対応させなければなりません.
上のコード注釈から分かるように、別名がある場合、別名はcolumnであり、別名がない場合、columnの各テーブルのフィールド名である.ここで、t.idおよびt 1.idが別名を使用しない場合、columnはidであり、曖昧さが生じる.
関連表から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は、クエリされた各ローのデータとエンティティークラスマッピングの関係を説明するだけです
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
<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 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に関連付けます:
resultMapの利点は、クエリされたcolumn(別名またはテーブルフィールド名)の値が、返されたオブジェクトのpropertyと一致することです.hibernateでhibernateTemplateを使用してsqlクエリーを作成するには、setResultTransformerを使用してエンティティクラスをバインドする必要があります.また、エンティティクラスのプロパティと一致するように別名(column)を使用する必要があります.
もちろん、関連クエリーではcollectionでselect(n+1の問題がある)、resultMap(コード重複を減らす)を使用することもできます.
2つのデータがクエリされた場合、resultMapの戻りオブジェクトがLogonである場合、どのようにして1つのセットを返すことができますか?インタフェースの戻り値をList