MyBatisのマスターへのエントリから(III):テーブル、クエリと同じくらい基本的な使用MyBatisのXMLの道

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の。」

おすすめ

転載: www.cnblogs.com/zwwhnly/p/11124577.html