MyBatis-Plus多表关联查询

MyBatis-Plus两种方式进行多表关联查询:

1.使用MyBatis-Plus的SQL构建器 ( MPJLambdaWrapper )

还可以使用MyBatis-Plus的SQL构建器进行多表关联查询,例如:

下面详细举一个,联表查询产品和厂商的例子:

(1)引入相关依赖项




    com.github.yulichang
    mybatis-plus-join
    1.2.4


implementation 'com.github.yulichang:mybatis-plus-join:1.2.4'

(2)相关实体类

/**
 * 产品实体
 */
@Data
@TableName(value = "t_product")
public class Product implements Serializable {
    private static final long serialVersionUID = 1L;
    /** 本表id */
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    /** 产品编码code */
    private String code;
    /** 产品名称 */
    private String name;
    /** 厂商编码code */
    private String factoryCode;
}

/**
 * 厂商实体
 */
@Data
@TableName(value = "t_factory")
public class Factory implements Serializable{
    private static final long serialVersionUID = 1L;
    /** 本表id */
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    /** 厂商编码code */
    private String code;
    /** 厂商名称 */
    private String name;
}
/**
 * 联表查询结果类
 */
@Data
public class ProductVO implements Serializable {
    /** 产品编码code */
    private String code;
    /** 产品名称 */
    private String name;
    /** 厂商编码code */
    private String factoryCode;
    /** 厂商名称 */
    private String factoryName;
}

(3)以产品为为主的Mapper层

特别注意集成 MPJBaseMapper,泛型为 Product 实体

/**
 * @Description: Mapper层
 * @Author: XuWei_Yao 2023/6/18 11:10
 */
@Repository
public interface ProductMapper extends MPJBaseMapper {

}

(4)业务逻辑实现层进行相关查询及逻辑处理

不做更多查询条件约束,数据库内产品表共10条数据,测试普通查询以及联表查询

注意联表查询时,selectJoinList()方法第一个参数为查询结果集映射的实体类,本处为ProductVO.class

/**
 * @Description: 产品相关业务逻辑实现层
 * @Author: XuWei_Yao 2023/6/18 11:14
 */
@Slf4j
@Service
public class ProductService {

    @Autowired
    private ProductMapper productMapper;

    public List getProductInfo() {

        // 测试单表查询
        List one = productMapper.selectList(null);
        log.debug("单表查询,查询返回结果为:{}", one);

        // 测试联表查询
        List two = productMapper.selectJoinList(ProductVO.class,
                new MPJLambdaWrapper()
                        .select(Product::getCode, Product::getName)
                        .selectAs(Factory::getCode, ProductVO::getFactoryCode)
                        .selectAs(Factory::getName, ProductVO::getFactoryName)
                        .leftJoin(Factory.class, Factory::getCode, Product::getFactoryCode)
        );
        log.debug("联表查询,查询返回结果为:{}", two);

        return null;
    }
}
// 其他方面
selectAll() // 可以查全部参数;
select()    // 查询字段,一个括号内仅能查一个实体,如需要查询多个表的字段,将有多个select();
selectAs()  // 相当于取别名,为了数据表内字段名称和结果集实体名称一致;
leftJoin()  //联结多个表,将有多个leftJoin(),方法3个参数:联入表实体,联入表关系字段,原表关系字段;

(5)查询结果

单表查询:

MyBatis-Plus多表关联查询_第1张图片

MyBatis-Plus多表关联查询_第2张图片

联表查询 :

MyBatis-Plus多表关联查询_第3张图片

MyBatis-Plus多表关联查询_第4张图片

2.使用@TableName注解和@JoinQuery注解

在实体类中使用@TableName注解来指定对应数据库中的表名,并使用@JoinQuery注解来指定与

之关联的另外一个表。例如:

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    @JoinQuery(tableName = "dept", joinColumn = "id", 
                targetJoinColumn = "dept_id", type = JoinType.LEFT_JOIN)
    private String deptName;
}

在上面的示例中,我们将User实体类映射到数据库中的user表,同时使用@JoinQuery注解指定它与dept表的关联关系,这里使用LEFT JOIN连接。

然后就可以使用MyBatis-Plus提供的wrapper进行关联查询操作,例如:

QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user.id", 1L);
List> list = userMapper.selectMaps(queryWrapper);

这样就可以得到一个List>类型的结果集。

总之,MyBatis-Plus提供了丰富的API和便捷的操作方式来进行多表关联查询。

你可能感兴趣的:(mybatis,java,mysql)