你还在手写 join 联表查询?MyBatis-Plus 这样写太香了!

打印 上一主题 下一主题

主题 901|帖子 901|积分 2703

使用方法

安装

Maven
  1. <dependency>
  2.     <groupId>com.github.yulichang</groupId>
  3.     <artifactId>mybatis-plus-join</artifactId>
  4.     <version>1.2.4</version>
  5. </dependency>
复制代码
Gradle
  1. implementation 'com.github.yulichang:mybatis-plus-join:1.2.4'
复制代码
或者clone代码到本地执行 mvn install, 再引入以上依赖
注意: mybatis plus version >= 3.4.0
推荐一个开源免费的 Spring Boot 最全教程:
https://github.com/javastacks/spring-boot-best-practice
使用


  • mapper继承MPJBaseMapper (必选)
  • service继承MPJBaseService (可选)
  • serviceImpl继承MPJBaseServiceImpl (可选)
核心类 MPJLambdaWrapper和MPJQueryWrapper

MPJLambdaWrapper用法

简单的三表查询
  1. class test {
  2.     @Resource
  3.     private UserMapper userMapper;
  4.     void testJoin() {
  5.         List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
  6.                 new MPJLambdaWrapper<UserDO>()
  7.                         .selectAll(UserDO.class)
  8.                         .select(UserAddressDO::getTel)
  9.                         .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
  10.                         .select(AreaDO::getProvince, AreaDO::getCity)
  11.                         .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
  12.                         .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
  13.                         .eq(UserDO::getId, 1)
  14.                         .like(UserAddressDO::getTel, "1")
  15.                         .gt(UserDO::getId, 5));
  16.     }
  17. }
复制代码
对应sql
  1. SELECT
  2.     t.id,
  3.     t.name,
  4.     t.sex,
  5.     t.head_img,
  6.     t1.tel,
  7.     t1.address AS userAddress,
  8.     t2.province,
  9.     t2.city
  10. FROM
  11.     user t
  12.     LEFT JOIN user_address t1 ON t1.user_id = t.id
  13.     LEFT JOIN area t2 ON t2.id = t1.area_id
  14. WHERE (
  15.     t.id = ?
  16.     AND t1.tel LIKE ?
  17.     AND t.id > ?)
复制代码
说明:

  • UserDTO.class 查询结果返回类(resultType)
  • selectAll() 查询指定实体类的全部字段
  • select() 查询指定的字段,支持可变参数,同一个select只能查询相同表的字段
    故将UserAddressDO和AreaDO分开为两个select()
  • selectAs() 字段别名查询,用于数据库字段与业务实体类属性名不一致时使用
  • leftJoin() 参数说明
    第一个参数:  参与连表的实体类class
    第二个参数:  连表的ON字段,这个属性必须是第一个参数实体类的属性
    第三个参数:  参与连表的ON的另一个实体类属性
  • 默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3....
  • 条件查询,可以查询主表以及参与连接的所有表的字段,全部调用mp原生的方法,正常使用没有sql注入风险
分页查询
  1. class test {
  2.     @Resource
  3.     private UserMapper userMapper;
  4.     void testJoin() {
  5.         IPage<UserDTO> iPage = userMapper.selectJoinPage(new Page<>(2, 10), UserDTO.class,
  6.                 new MPJLambdaWrapper<UserDO>()
  7.                         .selectAll(UserDO.class)
  8.                         .select(UserAddressDO::getTel)
  9.                         .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
  10.                         .select(AreaDO::getProvince, AreaDO::getCity)
  11.                         .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
  12.                         .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId));
  13.     }
  14. }
复制代码
对应sql
  1. SELECT
  2.     t.id,
  3.     t.name,
  4.     t.sex,
  5.     t.head_img,
  6.     t1.tel,
  7.     t1.address AS userAddress,
  8.     t2.province,
  9.     t2.city
  10. FROM
  11.     user t
  12.     LEFT JOIN user_address t1 ON t1.user_id = t.id
  13.     LEFT JOIN area t2 ON t2.id = t1.area_id
  14. LIMIT ?,?
复制代码
MPJQueryWrapper

简单的3表查询
  1. class test {
  2.     @Resource
  3.     private UserMapper userMapper;
  4.     void testJoin() {
  5.         List<UserDTO> list = userMapper.selectJoinList(UserDTO.class,
  6.                 new MPJQueryWrapper<UserDO>()
  7.                         .selectAll(UserDO.class)
  8.                         .select("addr.tel", "addr.address", "a.province")
  9.                         .leftJoin("user_address addr on t.id = addr.user_id")
  10.                         .rightJoin("area a on addr.area_id = a.id")
  11.                         .like("addr.tel", "1")
  12.                         .le("a.province", "1"));
  13.     }
  14. }
复制代码
对应sql
[code]SELECT     t.id,    t.name,    t.sex,    t.head_img,    addr.tel,    addr.address,    a.provinceFROM     user t    LEFT JOIN user_address addr on t.id = addr.user_id    RIGHT JOIN area a on addr.area_id = a.idWHERE (    addr.tel LIKE ?    AND a.province
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表