1、前言
在使用mybatis-plus开发需求的时候会发现对于大部分的业务场景来说都会使用到join来进行联表查询,但是mybatis-plus封装的 mapper 不支持 join,如果需要支持就需要自己手动去实现,给大家推荐一个好用的插件(mybatis-plus-join)。
2、介绍
mybatis-plus-join(简称 mpj)是一个 mybatis-plus的增强工具,在 mybatis-plus 的基础上只做增强不做改变,为简化开发、提高效率而生。
3、特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 无感引入, 支持mp风格的查询, 您会mp就会mpj, 无需额外的学习成本
- 兼容mp的别名、逻辑删除、枚举列、typehandle列等特性
- 支持注解形式一对一、一对多和连表查询形式的一对一和一对多
4、使用
引依赖
需要 mybatis-plus version >= 3.4.0
<dependency>
<groupid>com.github.yulichang</groupid>
<artifactid>mybatis-plus-join-boot-starter</artifactid>
<version>1.4.7.2</version>
</dependency>继承
- (必须)mapper继承mpjbasemapper
public interface carillegalmapper extends mpjbasemapper<carillegal>
{
}
- (可选)service继承mpjbaseservice
public interface icarillegalservice extends mpjbaseservice<carillegal>{}
- (可选)serviceimpl继承mpjbaseserviceimpl
@service
public class carillegalserviceimpl extends mpjbaseserviceimpl<carillegalmapper, carillegal> implements icarillegalservice
{}开始使用
现有一张car_illegal(车辆违章)表和一张attachments_file(附件)表,其关联关系是每辆违章车数据可能对应着一条或多条的违章图片(附件),以这两张表为例来进行一对一和一对多测试。
一对一
说明
- carillegaldto.class 查询结果返回类(resulttype)
- selectall() 查询指定实体类的全部字段
- select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
- selectas() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
leftjoin() 参数说明
- 第一个参数: 参与连表的实体类class
- 第二个参数: 连表的on字段,这个属性必须是第一个参数实体类的属性
- 第三个参数: 参与连表的on的另一个实体类属性
默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
- selectassociation()一对一查询
- selectcollection()一对多查询
@springboottest(classes = dexinapplication.class, webenvironment = springboottest.webenvironment.random_port)
@runwith(springrunner.class)
@slf4j
class dexinapplicationtests {
@autowired
private carillegalmapper carillegalmapper;
@test
public void testselect() {
mpjlambdawrapper wrapper = new mpjlambdawrapper<carillegaldto>()
.selectall(carillegaldto.class)
.selectassociation(attachmentsfile.class,carillegaldto::getattachmentsfile)
.leftjoin(attachmentsfile.class,attachmentsfile::gettargetid,carillegal::getid);
list<carillegaldto> carillegaldtolist = carillegalmapper.selectjoinlist(carillegaldto.class,wrapper);
}
}返回的实体类
@data
public class carillegaldto extends carillegal
{
attachmentsfile attachmentsfile;
list<attachmentsfile> attachmentsfilelist;
}
查询结果

一对多
@test
public void testselect() {
mpjlambdawrapper wrapper = new mpjlambdawrapper<carillegaldto>()
.selectall(carillegaldto.class)
.selectcollection(attachmentsfile.class,carillegaldto::getattachmentsfilelist)
.leftjoin(attachmentsfile.class,attachmentsfile::gettargetid,carillegal::getid);
list<carillegaldto> carillegaldtolist = carillegalmapper.selectjoinlist(carillegaldto.class,wrapper);
system.out.println(1);
}结果

分页查询
连表分页查询返回所有命中记录(请启用mybatis-plus分页插件)
import com.baomidou.mybatisplus.core.metadata.ipage;
@test
public void testselect() throws ioexception {
mpjlambdawrapper wrapper = new mpjlambdawrapper<carillegaldto>()
.selectall(carillegaldto.class)
.selectas(attachmentsfile::getid,carillegaldto::getcarno)
.selectcollection(attachmentsfile.class,carillegaldto::getattachmentsfilelist)
.leftjoin(attachmentsfile.class,attachmentsfile::gettargetid, carillegal::getid);
ipage<carillegaldto> carillegaldtolist = carillegalmapper.selectjoinpage(new page<>(1, 10),carillegaldto.class,wrapper);
system.out.println(carillegaldtolist);
}结果

5、mpjlambdawrapper所有方法说明
select
- 查询指定字段
select(attachmentsfile::getname)
- 支持可变参数
select(attachmentsfile::getname,attachmentsfile::getenterpriseid)
- 自定义字符串查询,需要对查询的表命名别名
select("file.id");
select("file.id as 'pid'");
select("file.id", "file.name");
//需要对表进行别名
.leftjoin(attachmentsfile.class,"file",attachmentsfile::gettargetid,carillegal::getid);selectall
- 查询指定类的全部字段
.selectall(carillegaldto.class)
注意事项:
- 一般一次查询只建议调用一次selectall(), 因为不同表之间可能会存在相同的字段, 比如id,create_time等通用字段, 多次调用会导致字段名重复, 除非能保证字段不重复
- 所以一次查询推荐只使用一次, 并且通常是对主表使用, 其他表字段通过其他方式查询, 比如select, selectas, selectasclass等
selectas
- 别名查询
.selectas(attachmentsfile::getid,carillegaldto::getcarno) //对应sql t.id as carno
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论