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其他版本,如果各位等不了呢,也可以把源碼下載下來,放進你的項目中改一下里面的東西。
