Liuzengホイ先生は最近、「マスターへのエントリからMyBatisの、」本を読んであなたを助けるために、光栄として書籍、やりがいので、ブログ形式で自分出力の学習プロセスは、間違っている場合、私を修正してください!
1.マルチテーブルクエリ
パートのブログ、我々は2つの単一テーブルのクエリは、クエリされた例がありますが、実際のビジネスシーンは間違いなく、このような需要がある今のように、クエリ、テーブルマルチする必要があります。
ユーザーが所有しているすべてのロールを発見。これはsys_user、sys_user_role、sys_role 3つのテーブルを関与させる必要があり、どのようにそれを達成するには?
まず、この方法はSysUserMapperインタフェースで定義されています。
/**
* 根据用户id获取角色信息
*
* @param userId
* @return
*/
List<SysRole> selectRolesByUserId(Long userId);
SysUserMapper.xmlは、その後、該当するファイルを開くには、次のSELECTステートメントを追加します。
<select id="selectRolesByUserId" resultType="com.zwwhnly.mybatisaction.model.SysRole">
SELECT r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime
FROM sys_user u
INNER JOIN sys_user_role ur ON u.id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.id
WHERE u.id = #{userId}
</select>
我々はマルチテーブルクエリに使用しますが、まだ情報のみの文字テーブルが含まれているresultTypeと単一のテーブルに設定されているものの、慎重な読者は、見つけることがあります。
私がしたい場合は、このクエリを返すには、フィールドSYSUSERをUSER_NAME resultTypeとを設定する方法、それを見て?
方法1:ユーザー名フィールドは直接SysRoleエンティティクラスを追加しました。
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
変更せずにこのポイントresultTypeとで。
方法2:クラスのユーザー名フィールドの拡張機能を追加することによって拡張作成します。
package com.zwwhnly.mybatisaction.model;
public class SysRoleExtend extends SysRole {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
この時点で、resultTypeとに修正する必要がありますcom.zwwhnly.mybatisaction.model.SysRoleExtendを。
このアプローチは、より適切なフィールドには、いくつかの余分なシーンを必要です。あなたが他のテーブルの多数をフィールドする必要がある場合は、3または4の方法を使用することができ、個人的にはモード4を使用することをお勧めします。
方法3: SYSUSERタイプフィールドSysRoleのエンティティクラスを追加します。
private SysUser sysUser;
public SysUser getSysUser() {
return sysUser;
}
public void setSysUser(SysUser sysUser) {
this.sysUser = sysUser;
}
変更せずにこのポイントresultTypeとで。
方法4(推奨):クラスの新しい拡張は、クラスが拡張タイプフィールドSYSUSERで添加されます。
ブックエンティティクラスは、一般的なツールによって生成されているので、私は個人的に、より良い方法だと思う4の方法は、自動的にフィールドを追加し、フォローアップにつながることは忘れがちである、3ウェイで推奨されていますが上書きされます。
package com.zwwhnly.mybatisaction.model;
public class SysRoleExtend extends SysRole {
private SysUser sysUser;
public SysUser getSysUser() {
return sysUser;
}
public void setSysUser(SysUser sysUser) {
this.sysUser = sysUser;
}
}
この時点で、resultTypeとに修正する必要がありますcom.zwwhnly.mybatisaction.model.SysRoleExtendを。
次のようにこの時点で、XMLクエリ文です。
<select id="selectRolesByUserId" resultType="com.zwwhnly.mybatisaction.model.SysRoleExtend">
SELECT r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_name "sysUser.userName",
u.user_email "sysUser.userEmail"
FROM sys_user u
INNER JOIN sys_user_role ur ON u.id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.id
WHERE u.id = #{userId}
</select>
次のSysUserMapperTestテストコードを追加します。
@Test
public void testSelectRolesByUserId() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
List<SysRole> sysRoleList = sysUserMapper.selectRolesByUserId(1L);
Assert.assertNotNull(sysRoleList);
Assert.assertTrue(sysRoleList.size() > 0);
} finally {
sqlSession.close();
}
}
入力ログとして、テストメソッドを実行します。
sysUser.userEmail」u.user_email SELECT r.idを、r.role_nameのroleName、r.enabled、r.create_by createBy、r.create_time CREATETIME、u.user_nameは "sysUser.userName"、:==>準備 - DEBUG [メイン] 「sys_user FROM Uはインナーsys_user_role UR ON u.id = ur.user_id内部結合sys_role R ON ur.role_id = r.id WHERE u.id =をJOIN?
DEBUG [メイン] - ==>パラメータ:1(ロング)
TRACE [メイン] - <==列:ID、のroleName、有効、createBy、CREATETIME、sysUser.userName、sysUser.userEmail
TRACE [メイン] - <==行:1、管理者、1、1、2019年6月27日18:21:12.0、管理、[email protected]
TRACE [メイン] - <==行:2、普通のユーザ、1、1、2019年6月27日18:21:12.0、管理、[email protected]
DEBUG [メイン] - <==合計:2
2.複数のインタフェースパラメータを使用
2.1パラメータタイプはプリミティブであります
今まで、私たちは一つのパラメータのみ、そのようselectById(ロングID)などの基本的なパラメータ、一種類のみのいずれかを定義している方法;。
パラメータとしてのみオブジェクトのどちらか、1つのオブジェクトにマージされた複数のパラメーターについてです。
しかし、このような2つのパラメータのみなど、いくつかのシナリオで、それは我々が今の状態と役割に基づいてユーザのユーザIDは、その後、どのようにそれを使用するすべてのロールを取得する必要があるような、これら2つのパラメータは必要ありませんし、新しいオブジェクトを作成しますか?
まず、インターフェイスSysUserMapperを添加する方法。
/**
* 根据用户id和角色的enabled状态获取用户的角色
*
* @param userId
* @param enabled
* @return
*/
List<SysRole> selectRolesByUserIdAndRoleEnabled(Long userId,Integer enabled);
その後、該当するファイルを開き、次のコードを追加しますSysUserMapper.xml。
<select id="selectRolesByUserIdAndRoleEnabled" resultType="com.zwwhnly.mybatisaction.model.SysRole">
SELECT r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime
FROM sys_user u
INNER JOIN sys_user_role ur ON u.id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.id
WHERE u.id = #{userId} AND r.enabled = #{enabled}
</select>
SysUserMapperTestテストクラスでは、次の試験方法を追加します。
@Test
public void testselectRolesByUserIdAndRoleEnabled() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
List<SysRole> sysRoleList = sysUserMapper.selectRolesByUserIdAndRoleEnabled(1L, 1);
Assert.assertNotNull(sysRoleList);
Assert.assertTrue(sysRoleList.size() > 0);
} finally {
sqlSession.rollback();
sqlSession.close();
}
}
この試験方法を実行し、次のエラー報告が見つかりました。
エラーメッセージは、パラメータのユーザーIDは言うが見つかりませんでした、利用可能なパラメータは以下のように、我々はコードを変更することを意味[0,1、PARAM1、PARAM2]、以下のとおりです。
WHERE u.id = #{0} AND r.enabled = #{1}
または、次のように改正:
WHERE u.id = #{param1} AND r.enabled = #{param2}
だから、テストが、そのような使用を使用することにより、コードがそれを読むのに十分な友好的ではないので、したがって、使用することをお勧めしません。
次のように、@Paramインターフェイスメソッドのパラメータの前に注釈を追加することをお勧めします:
/**
* 根据用户id和角色的enabled状态获取用户的角色
*
* @param userId
* @param enabled
* @return
*/
List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);
試験方法は、単に次のように出力ログは、テストに合格し、追加で実行されます。
DEBUG [メイン] - ==>準備:SELECT r.id、r.role_nameのroleName、r.enabled、r.create_by createBy、r.create_time CREATETIME sys_user FROM U INNER JOIN sys_user_role UR ON u.id = ur.user_id内部結合sys_role R ON ur.role_id = r.id WHERE u.id =?AND = r.enabled?
DEBUG [メイン] - ==>パラメータ:1(長く)、1(整数)
[メイン] TRACE - <==列:ID、のroleNameは、createBy、CREATETIMEを有効
TRACE [メイン] - <==行:1、管理者、1、1、2019-06-2718:21:12.0
TRACE [メイン] - <==行:2、普通のユーザ、1、1、2019-06-2718:21:12.0
DEBUG [メイン] - <==合計:2
2.2パラメータタイプはオブジェクトであります
パラメータの型は、オブジェクトを使用することを実証するために、我々は、インタフェースSysUserMapperに次のメソッドを追加します。
/**
* 根据用户id和角色的enabled状态获取用户的角色
*
* @param user
* @param role
* @return
*/
List<SysRole> selectRolesByUserAndRole(@Param("user") SysUser user, @Param("role") SysRole role);
このとき、ステートメントのxmlに対応します:
<select id="selectRolesByUserAndRole" resultType="com.zwwhnly.mybatisaction.model.SysRole">
SELECT r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime
FROM sys_user u
INNER JOIN sys_user_role ur ON u.id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.id
WHERE u.id = #{user.id} AND r.enabled = #{role.enabled}
</select>
3.ソース
ソースアドレス:https://github.com/zwwhnly/mybatis-action.git、ダウンロードして歓迎。
4.リファレンス
Liuzengホイ「マスターへのエントリからMyBatisの。」