mybatis plus join は mybatis plus テーブル接続プラグインに基づいています

プロジェクトアドレス

ギティ| ギットハブ

ドキュメント WIKI

手順

インストール

  • メイビン

<dependency>
    <groupId>com.github.yulichang</groupId>
    <artifactId>mybatis-plus-join-boot-starter</artifactId>
    <version>1.4.5</version>
</dependency>

使用

  • マッパーは MPJBaseMapper を継承します (必須)

  • サービスは MPJBaseService から継承します (オプション)

  • serviceImpl は MPJBaseServiceImpl から継承します (オプション)

Lambda フォームの使用法 (MPJLambdaWrapper)

単純な結合テーブルクエリ

class test {
    @Resource
    private UserMapper userMapper;
    void testJoin() {
        MPJLambdaWrapper wrapper = new MPJLambdaWrapper<UserDO>()
                .selectAll(UserDO.class)//查询user表全部字段
                .select(UserAddressDO::getTel)//查询user_address tel 字段
                .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
                .select(AreaDO::getProvince, AreaDO::getCity)
                .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
                .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
                .eq(UserDO::getId, 1)
                .like(UserAddressDO::getTel, "1")
                .gt(UserDO::getId, 5);
        //连表查询
        List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);
        //分页查询 (这个方法需要启用 mybatis plus 分页插件,或者用PageHelper调用上面那个方法)
        Page<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class, wrapper);
    }
}

SQLに対応する

SELECT  
    t.id, t.name, t.sex, t.head_img, 
    t1.tel, t1.address AS userAddress,
    t2.province, t2.city 
FROM 
    user t 
    LEFT JOIN user_address t1 ON t1.user_id = t.id 
    LEFT JOIN area t2 ON t2.id = t1.area_id 
WHERE (
    t.id = ? 
    AND t1.tel LIKE ? 
    AND t.id > ?)

例証します:

  • UserDTO.class クエリ結果の戻りクラス (resultType)

  • selectAll() 指定されたエンティティ クラスのすべてのフィールドをクエリします

  • select() 指定されたフィールドをクエリします。変数パラメーターをサポートします。同じ select は同じテーブルのフィールドのみをクエリできます。

  • selectAs() フィールド エイリアス クエリ。データベース フィールドがビジネス エンティティ クラスのプロパティ名と一致しない場合に使用されます。

  • leftJoin() パラメータの説明

最初のパラメータ: テーブル接続に参加しているエンティティ クラス

2 番目のパラメータ: リンク テーブルの ON フィールド。この属性は最初のパラメータのエンティティ クラスの属性である必要があります。

3 番目のパラメータ: リンク テーブルの ON に関与する別のエンティティ クラス属性

  • デフォルトのメインテーブルの別名は t で、他のテーブルの別名は呼び出し順に t1、t2、t3 を使用します。

  • 条件付きクエリ。メイン テーブルと接続に参加しているすべてのテーブルのフィールドをクエリでき、すべて mp のネイティブ メソッドを呼び出します。通常の使用では SQL インジェクションのリスクはありません。

1対多のクエリ

class test {
    @Resource
    private UserMapper userMapper;
    @Test
    void testResultMap() {
        MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
                .selectAll(UserDO.class)
                //一对多查询
                .selectCollection(AddressDO.class, UesrDTO::getAddressList)
                .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId);
        List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);
    }
}

ResultMapと同等

<resultMap id="xxxxxxxx" type="com.github.yulichang.join.dto.UserDTO">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!--其他属性省略-->
    <collection property="addressList" javaType="java.util.List"
                ofType="com.github.yulichang.join.entity.UserAddressDO">
        <id property="id" column="mpj_id"/>
        <result property="address" column="address"/>
        <result property="userId" column="user_id"/>
        <!--其他属性省略-->
    </collection>
</resultMap>

MPJLambdaWrapperのその他の関数

文字列形式の使用法 (MPJQueryWrapper)

単純な結合テーブルクエリ

class test {
    @Resource
    private UserMapper userMapper;
    void testJoin() {
        MPJQueryWrapper wrapper = new MPJQueryWrapper<UserDO>()
                .selectAll(UserDO.class)
                .select("addr.tel", "addr.address", "a.province")
                .leftJoin("user_address addr on t.id = addr.user_id")
                .rightJoin("area a on addr.area_id = a.id")
                .like("addr.tel", "1")
                .le("a.province", "1");
        //列表查询
        List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);
        //分页查询 (需要启用 mybatis plus 分页插件)
        List<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, wrapper);
    }
}

SQLに対応する

SELECT 
    t.id,
    t.name,
    t.sex,
    t.head_img,
    addr.tel,
    addr.address,
    a.province
FROM 
    user t
    LEFT JOIN user_address addr on t.id = addr.user_id
    RIGHT JOIN area a on addr.area_id = a.id
WHERE (
    addr.tel LIKE ?
    AND a.province <= ?)

例証します:

  • UserDTO.class クエリ結果クラス (resultType)

  • selectAll(UserDO.class) メイン テーブル (メイン テーブル エンティティ クラス) のすべてのフィールドをクエリします。デフォルトのメイン テーブル エイリアス "t"

  • select() mp の選択戦略はカバーすることであり、前回を条件として、ここでの戦略は追加することであり、いつでも選択できます

メイン テーブルのフィールドはラムダを使用でき、テーブルのエイリアスは自動的に追加されます。メイン テーブルのエイリアスはデフォルトでは t であり、メイン テーブル以外のフィールドはエイリアスを使用してクエリする必要があります。

  • leftJoin() rightJoin() innerJoin() SQL フラグメント形式 (テーブル + エイリアス + アソシエーション条件) を渡す

  • 条件付きクエリ。メイン テーブルと接続に参加しているすべてのテーブルのフィールドをクエリでき、すべて mp のネイティブ メソッドを呼び出します。通常の使用では SQL インジェクションのリスクはありません。

これはまだ実行できますが、お勧めできません

class test {
    @Resource
    private UserMapper userMapper;
    void testJoin() {
        List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
                new MPJQueryWrapper<UserDO>()
                        .selectAll(UserDO.class)
                        .select("addr.tel", "addr.address")
                        //行列转换
                        .select("CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex")
                        //求和函数
                        .select("sum(a.province) AS province")
                        //自定义数据集
                        .leftJoin("(select * from user_address) addr on t.id = addr.user_id")
                        .rightJoin("area a on addr.area_id = a.id")
                        .like("addr.tel", "1")
                        .le("a.province", "1")
                        .orderByDesc("addr.id"));
    }
}

SQLに対応する

SELECT 
    t.id,
    t.name,
    t.sex,
    t.head_img,
    addr.tel,
    addr.address,
    CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex,
    sum(a.province) AS province
FROM 
    user t
    LEFT JOIN (select * from user_address) addr on t.id = addr.user_id
    RIGHT JOIN area a on addr.area_id = a.id
WHERE (
    addr.tel LIKE ?
    AND a.province <= ?)
ORDER BY
    addr.id DESC

書類

おすすめ

転載: blog.csdn.net/bjdiys/article/details/129456271