还可以使用MyBatis-Plus的SQL构建器进行多表关联查询,例如:
下面详细举一个,联表查询产品和厂商的例子:
com.github.yulichang
mybatis-plus-join
1.2.4
implementation 'com.github.yulichang:mybatis-plus-join:1.2.4'
/**
* 产品实体
*/
@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;
}
特别注意集成 MPJBaseMapper,泛型为 Product 实体
/**
* @Description: Mapper层
* @Author: XuWei_Yao 2023/6/18 11:10
*/
@Repository
public interface ProductMapper extends MPJBaseMapper {
}
不做更多查询条件约束,数据库内产品表共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个参数:联入表实体,联入表关系字段,原表关系字段;
单表查询:
联表查询 :
在实体类中使用@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
总之,MyBatis-Plus提供了丰富的API和便捷的操作方式来进行多表关联查询。