mybatis-plus-join


mybatis plus的一個多表插件,上手簡單,只要會用mp就會用這個插件,僅僅依賴了lombok和fastJson,而且是擴展mp的構造器並非更改原本的構造器,不會對原有項目產生一點點影響,相信大多數項目都有這倆插件,四舍五入就是沒依賴。

mybatis-plus-join示例:** gitee: https://gitee.com/mhb0409/mybatis-plus-join-example github: https://github.com/bobo667/mybatis-plus-join-example

注意:目前當前版本只支持3.3.1 - 3.42 以及 3.2.0

maven坐標

mybatis plus:3.2.0版本依賴地址:

 <dependency>
    <groupId>icu.mhb</groupId>
    <artifactId>mybatis-plus-join</artifactId>
    <version>1.2.0</version>
 </dependency>

mybatis plus:3.3.1 - 3.42版本依賴地址:

 <dependency>
    <groupId>icu.mhb</groupId>
    <artifactId>mybatis-plus-join</artifactId>
    <version>1.0.2</version>
 </dependency>

版本對應關系(此處只顯示對應的最新版本)

Mybatis-plus Mybatis-plus-join
3.2.0 1.2.0
3.3.1 - 3.42 1.0.2

廢話不多說,直接看怎么使用

    /**
     * 查詢列表
     *
     * @param wrapper 實體對象封裝操作類(可以為 null)
     * @param <E>     返回泛型
     * @return 返回E 類型的列表
     */
    <EV, E> List<EV> joinList(Wrapper<E> wrapper, Class<EV> clz);

    /**
     * 查詢單個對象
     *
     * @param wrapper 實體對象封裝操作類
     * @param clz     返回對象
     * @param <E>     包裝泛型類型
     * @param <EV>    返回類型泛型
     * @return EV
     */
    <E, EV> EV joinGetOne(Wrapper<E> wrapper, Class<EV> clz);


    /**
     * 查詢count
     *
     * @param wrapper 實體對象封裝操作類(可以為 null)
     * @param <E>     返回泛型
     * @return 總數
     */
    <E> int joinCount(Wrapper<E> wrapper);


    /**
     * 翻頁查詢
     *
     * @param page    翻頁對象
     * @param wrapper 實體對象封裝操作類
     */
    <EV, E extends IPage<EV>, C> IPage<EV> joinPage(E page, Wrapper<C> wrapper, Class<EV> clz);

一共是四個方法,分別重寫於mp的

joinList -> list

joinGetOne -> getOne

joinCount -> count

joinPage -> page

注意:這幾個方法,前面倆參數和mp的用法一致,最后一個class類型的是返回類型,這個主要是大多數多表操作都是需要有額外字段,所以需要額外定義,而Wrapper wrapper中的這個需要填寫在需要構建條件的實體,這個實體是任意的,不強制,創建條件構造器的時候定義的那個對象就是主表

基本使用方法

1.mapper繼承 JoinBaseMapper< T>

2.service繼承 JoinIService< T>

3.impl 繼承 JoinServiceImpl<M,T>

4.注入mp自定義方法,主要是繼承JoinDefaultSqlInjector

package com.fk.zws.app.config;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.fk.zws.toolkit.mp.injector.CustomizeSqlInjector;
import com.fk.zws.toolkit.mp.plugIn.injector.JoinDefaultSqlInjector;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class MyBatisPlusConfig extends JoinDefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 自己的自定義方法
        return methodList;
    }

}

然后就可以愉快的使用了

下面來看構造器的使用:

// 第一步new 一個JoinLambdaWrapper構造參數是主表的實體對象(如果在service中直接使用joinLambdaWrapper()方法即可獲得)
JoinLambdaWrapper<Users> wrapper = new JoinLambdaWrapper<>(Users.class);

// 第二步 使用leftJoin方法創建一個左連接
/*
	有三個方法可以使用 
	leftJoin 左聯
	rightJoin 右聯
	innerJoin 內聯
*/

// 這一部分一個參數是join中定義的連接的表,第二個參數是隨意的表,但是是要出現構造器中的
wrapper.leftJoin(UsersAge.class,UsersAge::getId,Users::getAgeId);
// 然后可以設置多表中的查詢條件,這一步和mp一致
wrapper.eq(UserAge::getAgeName,"95")
  		.select(UserAge::getAgeName);
// 最后一步 需要使用end方法結束
wrapper.end();
  

// 完整的就是
JoinLambdaWrapper<Users> wrapper = new JoinLambdaWrapper<>(Users.class);
wrapper.leftJoin(UsersAge.class,UsersAge::getId,Users::getAgeId)
  	.eq(UserAge::getAgeName,"95")
  	.select(UserAge::getAgeName)
  	.end();

usersService.joinList(wrapper,UsersVo.class);

// 執行SQL 
select 
  users.user_id,
  users.user_name,
  users_age.age_name
from users users
  left join users_age users_age on users_age.id = users.age_id
where (
	users_age.age_name = '95'
)

是不是就很簡單,就和mp的原生的比,就是增加了 join方法啥的

加料用法

OK,來點絲滑的加料用法

selectAs() 查詢添加別名

/* 
  selectAs(List<As<T>> columns) 
  selectAs(SFunction<T, ?> column, String alias)
  查詢並添加別名
*/
// 拿起來我們上面用的哪個實例。我現在需要給ageName給個別名 user_age_name
JoinLambdaWrapper<Users> wrapper = new JoinLambdaWrapper<>(Users.class);
wrapper.leftJoin(UsersAge.class,UsersAge::getId,Users::getAgeId)
  	.eq(UserAge::getAgeName,"95")
  	.selectAs(UserAge::getAgeName,"user_age_name")
  	.end();
// 執行查詢
usersService.joinList(wrapper);

// 執行SQL 
select 
  users.user_id,
	users.user_name,
	users_age.age_name as user_age_name
from users users
  left join users_age users_age on users_age.id = users.age_id
where (
	users_age.age_name = '95'
)
    
// 現在來個高級需求,我需要查詢出users_age表中的兩個字段並且需要加一個固定值

JoinLambdaWrapper<Users> wrapper = new JoinLambdaWrapper<>(Users.class);
wrapper.join(UsersAge.class)
  	.leftJoin(UsersAge::getId,Users::getAgeId)
  	.eq(UserAge::getAgeName,"95")
    .selectAs((cb) -> {
      cb.add(UserAge::getAgeName,"user_age_name")
        .add(UserAge::getAgeDoc)
        .add("mp永遠滴神","mpnb");
    }).end();
// 執行查詢
usersService.joinList(wrapper,UsersVo.class);
 
// 執行SQL 
select 
  users.user_id,
	users.user_name,
	users_age.age_name as user_age_name,
	users_age.age_doc,
	'mp永遠滴神' as mpnb
from users users
  left join users_age users_age on users_age.id = users.age_id
where (
	users_age.age_name = '95'
)

 
/*
	這里需要注意啊,如果selectAs那個地方因為是函數接口,所以值是不可以改變的,如果是可變的那么可以采用
	selectAs(Arrays.asList(
			new As(UserAge::getAgeName,"user_age_name"),
			new As(UserAge::getAgeDoc)
	))
*/
    

selectAll() 查詢全部

// selectAll()方法,查詢出當前表所有的子段
JoinLambdaWrapper<Users> wrapper = new JoinLambdaWrapper<>(Users.class);
wrapper.leftJoin(UsersAge.class,UsersAge::getId,Users::getAgeId)
  	.eq(UserAge::getAgeName,"95")
  	.selectAll().end();
// 執行查詢
usersService.joinList(wrapper,UsersVo.class);
 
// 執行SQL 
select 
  users.user_id,
	users.user_name,
	users_age.age_name,
	users_age.age_doc,
	users_age.id
from users users
  left join users_age users_age on users_age.id = users.age_id
where (
	users_age.age_name = '95'
)

joinAnd() join添加條件

   
/*
		相信有很多情況需要限制join的表的限制條件那么就需要 
    joinAnd(SFunction<T, Object> field, Object val, int index)
*/

JoinLambdaWrapper<Users> wrapper = new JoinLambdaWrapper<>(Users.class);
wrapper.leftJoin(UsersAge.class,UsersAge::getId,Users::getAgeId)
  	.joinAnd(UsersAge::getId,1,0) // 需要注意啊,這個最后一個下標是指的第幾個join,因為有時候會出現多個連接,附表連接主表,附表的附表連接附表這樣子
  	.eq(UserAge::getAgeName,"95")
  	.selectAs((cb) -> {
      cb.add(UserAge::getAgeName,"user_age_name")
        .add(UserAge::getAgeDoc)
        .add("mp永遠滴神","mpnb");
    }).end();
// 執行查詢
usersService.joinList(wrapper,UsersVo.class);

// 執行SQL 
select 
  users.user_id,
	users.user_name,
	users_age.age_name as user_age_name,
	users_age.age_doc,
	'mp永遠滴神' as mpnb
from users users
  left join users_age users_age on users_age.id = users.age_id and users_age.id = 1
where (
	users_age.age_name = '95'
)
 

同個接口返回任意實體

// 這個就不得不說了,大多數情況下,一個接口是返回一個實體類型的,但是很多情況下,我們有不同的業務需求,所返回的對象也是不一樣的,全部加在一個對象中又太臃腫不好維護,所以就需要這個返回任意定制類型
// 使用方法 在最后一個參數中增加上自己的實體類型就行了
List<UsersVo> usersVoList = usersService.joinList(wrapper,UsersVo.class);

自定義別名 TableAlias

/*
	這個自定義別名是某些業務下,比如說在項目中構建了SQL啊,之類的,但是構建的SQL別名一般都是固定的達到通用,
	所以需要在實體中增加別名使用@TableAlias注解就行了,如果沒有添加別名 就默認使用表名作為別名 
*/
@TableName("app_users")
@TableAlias("users")
public class Users implements Serializable {
  
}

用法注意

1.在使用 join service 一系列方法的時候,所有參數都不能傳null

2.這個條件構造器啊,你在join的時候就相當於創建一個新的構造器,你要在這個新的構造器中實現你所有的操作,包括查詢,和條件,排序之類的,這樣的好處在於,維護好一些,畢竟都放在一起的話,到時候容易迷。

3.您的start是作者更新的動力,如果用的人多的話,可以留言,我會繼續更新並適配mp其他版本,如果各位等不了呢,也可以把源碼下載下來,放進你的項目中改一下里面的東西。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM