MyBatis-Plus-Join 多表查询的扩展
文章目录
- 网站
- 使用方法
- 安装
- 使用
- Lambda形式用法(MPJLambdaWrapper)
- 简单的连表查询
- 一对多查询
网站
- 官方网站:https://mybatisplusjoin.com/
- Github地址:https://github.com/yulichang/mybatis-plus-join
- Gitee地址:https://gitee.com/best_handsome/mybatis-plus-join
使用方法
安装
-
Maven
<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId><version>1.4.5</version> </dependency>
-
Gradle
implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.5'
或者clone代码到本地执行 mvn install, 再引入以上依赖
注意: mybatis plus version >= 3.3.0
使用
- mapper继承MPJBaseMapper (必选)
- service继承MPJBaseService (可选)
- serviceImpl继承MPJBaseServiceImpl (可选)
Lambda形式用法(MPJLambdaWrapper)
简单的连表查询
class test {@Resourceprivate UserMapper userMapper;void testJoin() {//和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class).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);//连表查询 返回自定义ResultTypeList<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper);//分页查询 (需要启用 mybatis plus 分页插件)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() 参数说明
第一个参数: 参与连表的实体类class
第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数: 参与连表的ON的另一个实体类属性 - 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
- 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
一对多查询
class test {@Resourceprivate UserMapper userMapper;@Testvoid testResultMap() {MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<>(User.class).selectAll(UserDO.class)//对多查询.selectCollection(AddressDO.class, UesrDTO::getAddressList)//对一查询.selectAssociation(AddressDO.class, UesrDTO::getAddress).leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId);List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);//关于对多分页查询//由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。}
}
MPJLambdaWrapper其他功能
- 一对一,一对多使用
- 简单的SQL函数使用
- ON语句多条件支持
- 其他全部功能请参考使用文档