# mybatis-plus-join
* 支持连表查询的[mybatis-plus](https://gitee.com/baomidou/mybatis-plus)
* [演示示例](https://gitee.com/best_handsome/mybatis-plus-join-demo)
## 使用方法
[goto wiki](https://gitee.com/best_handsome/mybatis-plus-join/wikis)
## 通用连表wrapper
[点击跳转至使用方法](https://gitee.com/best_handsome/mybatis-plus-join/tree/master/src/main/java/com/github/yulichang/common)
### 安装
1. 在项目中添加依赖
```xml
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>1.1.1</version>
</dependency>
```
或者clone代码到本地,执行mvn install,再引入以上依赖
<br><br>
2. 添加配置文件
```java
@Configuration
public class MybatisPlusConfig {
/**
* 启用连表拦截器
*/
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//连表插件
interceptor.addInnerInterceptor(new MPJInterceptor());
return interceptor;
}
/**
* sql注入器
*/
@Bean
public MPJSqlInjector mySqlInjector() {
return new MPJSqlInjector();
}
}
```
### 使用
* mapper继承MPJBaseMapper (必选)
* service继承MPJBaseService (可选)
* serviceImpl继承MPJBaseServiceImpl (可选)
1. MPJBaseMapper继承BaseMapper,在原有的方法基础上又添加了以下方法:
* selectJoinOne 连表查询一条记录对象
* selectJoinList 连表查询返回命中记录对象集合
* selectJoinPage 连表分页查询对象集合
* selectJoinMap 连表查询一条记录返回Map
* selectJoinMaps 连表查询返回命中记录Map集合
* selectJoinMapsPage 连表分页查询返回Map集合
2. MPJBaseService 继承了IService,同样添加以上方法
3. MPJBaseServiceImpl 继承了ServiceImpl,同样添加了以上方法
## 核心类 MPJQueryWrapper,MPJLambdaQueryWrapper和MPJJoinLambdaQueryWrapper
|-|MPJQueryWrapper|MPJLambdaQueryWrapper|MPJJoinLambdaQueryWrapper|
|---|---|---|---|
|select(String)|支持|<font color=red>**支持**|不支持|
|select(lambda)|不支持|仅支持主表lambda|所有表lambda|
|join(String)|支持|支持|不支持|
|join(lambda)|不支持|不支持|支持|
|条件String|支持|不支持|不支持|
|条件lambda|不支持|仅支持主表lambda|所有表lambda|
MPJQueryWrapper相当于mp的QueryWrapper
MPJLambdaQueryWrapper相当于mp的LambdaQueryWrapper
两者可以无缝切换
MPJQueryWrapper.lambda() ===> MPJLambdaQueryWrapper
MPJLambdaQueryWrapper.stringQuery() ===> MPJQueryWrapper
## MPJJoinLambdaQueryWrapper用法
#### MPJJoinLambdaQueryWrapper示例
#### 简单的3表查询
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
new MPJJoinLambdaQueryWrapper<UserDO>()
.selectAll(UserDO.class)
.select(UserAddressDO::getTel)
.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(true, UserDO::getId, 1)
.like(true, UserAddressDO::getTel, "1")
.gt(true, UserDO::getId, 5));
}
}
```
对应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只能查询相同表的字段
故将UserAddressDO和AreaDO分开为两个select()
* selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
* leftJoin() 参数说明
第一个参数: 参与连表的实体类class
第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数: 参与连表的ON的另一个实体类属性
* 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3....
* 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
#### 分页查询
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
IPage<UserDTO> iPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class,
new MPJJoinLambdaQueryWrapper<UserDO>()
.selectAll(UserDO.class)
.select(UserAddressDO::getTel)
.selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
.select(AreaDO::getProvince, AreaDO::getCity)
.leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
.leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId));
}
}
```
对应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
LIMIT ?,?
```
## MPJQueryWrapper和MPJLambdaQueryWrapper
### 简单的3表查询
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
new MPJLambdaQueryWrapper<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")
.gt(true, UserDO::getId, 1)
.eq(true, UserDO::getSex, "男")
.stringQuery()
.like(true, "addr.tel", "1")
.le(true, "a.province", "1"));
}
}
```
对应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 (
t.id > ?
AND t.sex = ?
AND addr.tel LIKE ?
AND a.province <= ?)
```
说明:
* UserDTO.class 查询结果类(resultType)
* selectAll(UserDO.class) 查询主表全部字段(主表实体类)
* select() mp的select策略是覆盖,以最后一次为准,这里的策略是追加,可以一直select
主表字段可以用lambda,会自动添加表别名,主表别名默认是 t ,非主表字段必须带别名查询
* leftJoin() rightJoin() innerJoin() 传sql片段 格式 (表 + 别名 + 关联条件)
* stringQuery() lambda查询转string查询
* lambda() string查询转lambda查询
* 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
### 分页查询
```java
class test {
@Resource
private UserMapper userMapper;
void testJoin() {
IPage<UserDTO> page = userMapper.selectJoinPage(new Pag
没有合适的资源?快使用搜索试试~ 我知道了~
mybatis-plus-join:支持连表查询的mybatis-plus,mybatis-plus风格的连表操作提供wrapp...
共44个文件
java:37个
md:4个
xml:2个
需积分: 48 36 下载量 88 浏览量
2021-03-15
10:59:17
上传
评论 5
收藏 58KB ZIP 举报
温馨提示
mybatis加联接 支持连表查询的 使用方法 通用连表包装 安装 在项目中添加依赖 < dependency> < groupId>com.github.yulichang</ groupId> < artifactId>mybatis-plus-join</ artifactId> < version>1.1.1</ version> </ dependency> 或者克隆代码到本地,执行mvn install,再重新以上依赖 添加配置文件 @Configuration public class MybatisPlusConfig { /** * 启用连表拦截器 */ @Bean public MybatisPlusInterceptor paginationInterceptor () {
资源详情
资源评论
资源推荐
收起资源包目录
mybatis-plus-join-master.zip (44个子文件)
mybatis-plus-join-master
src
main
java
com
github
yulichang
method
SelectJoinOne.java 977B
SelectJoinMapsPage.java 1008B
SelectJoinMaps.java 999B
SelectJoinMap.java 997B
SelectJoinList.java 979B
SelectJoinPage.java 979B
MPJAbstractMethod.java 2KB
SqlMethod.java 2KB
wrapper
interfaces
Compare.java 7KB
LambdaJoin.java 1KB
Func.java 8KB
SFunctionQuery.java 2KB
MPJJoinLambdaQueryWrapper.java 9KB
MPJAbstractLambdaWrapper.java 2KB
MPJAbstractWrapper.java 16KB
interfaces
MPJBaseJoin.java 104B
toolkit
StreamUtils.java 825B
ListJoinUtils.java 2KB
BeanUtils.java 899B
LambdaUtils.java 2KB
Wrappers.java 1KB
Constant.java 838B
query
MPJLambdaQueryWrapper.java 9KB
interfaces
MPJJoin.java 1004B
MPJQueryWrapper.java 6KB
injector
MPJSqlInjector.java 790B
common
JoinLambdaWrapper.java 4KB
support
alias
AliasLambdaQueryWrapper.java 1KB
README.md 3KB
AliasQueryWrapper.java 1KB
func
S.java 2KB
F.java 2KB
README.md 4KB
README.md 4KB
JoinAbstractLambdaWrapper.java 2KB
JoinAbstractWrapper.java 16KB
base
MPJBaseMapper.java 2KB
MPJBaseService.java 1KB
MPJBaseServiceImpl.java 1KB
interceptor
MPJInterceptor.java 2KB
LICENSE 11KB
pom.xml 2KB
README.md 10KB
ossrh.xml 5KB
共 44 条
- 1
基础颜究的三亩叔
- 粉丝: 29
- 资源: 4668
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Django和OpenCV的智能车视频处理系统.zip
- (源码)基于ESP8266的WebDAV服务器与3D打印机管理系统.zip
- (源码)基于Nio实现的Mycat 2.0数据库代理系统.zip
- (源码)基于Java的高校学生就业管理系统.zip
- (源码)基于Spring Boot框架的博客系统.zip
- (源码)基于Spring Boot框架的博客管理系统.zip
- (源码)基于ESP8266和Blynk的IR设备控制系统.zip
- (源码)基于Java和JSP的校园论坛系统.zip
- (源码)基于ROS Kinetic框架的AGV激光雷达导航与SLAM系统.zip
- (源码)基于PythonDjango框架的资产管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0