赞
踩
mybatis-plus-join是一款开源的支持连表查询的mybatis-plus插件,支持mybatis-plus风格的连表操作,提供leftJoin、rightJoin、innerJoin连表操作
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join-boot-starter</artifactId>
<version>1.4.11</version>
</dependency>
implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.11'
class test { @Resource private UserMapper userMapper; void testJoin() { //和Mybatis plus一致,MPJLambdaWrapper的泛型必须是主表的泛型,并且要用主表的Mapper来调用 MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>() .selectAll(UserDO.class)//查询user表全部字段 .select(UserAddressDO::getTel)//查询user_address tel 字段 .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)//别名 t.address AS userAddress .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); //连表查询 返回自定义ResultType List<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 > ?)
说明:
class test {
@Resource
private UserMapper userMapper;
@Test
void testResultMap() {
MPJLambdaWrapper<UserDO> wrapper = new MPJLambdaWrapper<UserDO>()
.selectAll(UserDO.class)
//一对多查询
.selectCollection(AddressDO.class, UesrDTO::getAddressList)
.leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId);
List<UserDTO> dtoList = userMapper.selectJoinList(UserDTO.class, wrapper);
}
}
等效于ResultMap
<resultMap id="xxxxxxxx" type="com.github.yulichang.join.dto.UserDTO">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--其他属性省略-->
<collection property="addressList" javaType="java.util.List"
ofType="com.github.yulichang.join.entity.UserAddressDO">
<id property="id" column="mpj_id"/>
<result property="address" column="address"/>
<result property="userId" column="user_id"/>
<!--其他属性省略-->
</collection>
</resultMap>
MPJLambdaWrapper其他功能
class test { @Resource private UserMapper userMapper; void testJoin() { MPJQueryWrapper wrapper = new MPJQueryWrapper<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") .like("addr.tel", "1") .le("a.province", "1"); //列表查询 List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, wrapper); //分页查询 (需要启用 mybatis plus 分页插件) List<UserDTO> listPage = userMapper.selectJoinPage(new Page<>(1, 10), UserDTO.class, wrapper); } }
对应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 (
addr.tel LIKE ?
AND a.province <= ?)
说明:
class test { @Resource private UserMapper userMapper; void testJoin() { List<UserDTO> list = userMapper.selectJoinList(UserDTO.class, new MPJQueryWrapper<UserDO>() .selectAll(UserDO.class) .select("addr.tel", "addr.address") //行列转换 .select("CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex") //求和函数 .select("sum(a.province) AS province") //自定义数据集 .leftJoin("(select * from user_address) addr on t.id = addr.user_id") .rightJoin("area a on addr.area_id = a.id") .like("addr.tel", "1") .le("a.province", "1") .orderByDesc("addr.id")); } }
对应sql
SELECT t.id, t.name, t.sex, t.head_img, addr.tel, addr.address, CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex, sum(a.province) AS province FROM user t LEFT JOIN (select * from user_address) addr on t.id = addr.user_id RIGHT JOIN area a on addr.area_id = a.id WHERE ( addr.tel LIKE ? AND a.province <= ?) ORDER BY addr.id DESC
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。