遇到一个问题 我们的业务是获取多张表的数据 ,所有的表都有一个共同的字段 但是表比较多 我不想一张一张的查 有什么办法能一次性查出来呢 我现在的做法是将这些实体类全部放在一个实体类中 但是又不知道怎么查 用的是mybatis-plus,一般馊出来的都是都是一对多或者多对多
比如有A,B,C,D四张表,四张表都有相同的字段sno_id,其中a.* 代表A表中的所有字段,可以根据需要写具体的字段。
select a., b., c., d. from A a left join B b ON a.sno_id = b.sno_id left join C c ON b.sno_id = c.sno_id left join D d ON c.sno_id = d.sno_id ;
https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611
在 MyBatis-Plus 中,可以使用 @TableField
注解的 exist
属性,将一个实体类的属性与数据库表中的某个字段关联起来,从而实现多表联查的功能。这种方式常用于查询多张表中的数据,而这些表之间都存在某个共同的字段。
例如,假设有多张表,分别是 table1
、table2
、table3
,它们都包含一个字段 common_field
,我们需要同时查询这三个表中的数据。我们可以定义一个实体类 CommonEntity
,包含三个属性 table1Field
、table2Field
和 table3Field
,然后在 CommonEntity
中使用 @TableField
注解的 exist
属性,将这三个属性与 common_field
字段关联起来,代码如下:
public class CommonEntity {
@TableField(exist = true, value = "common_field")
private String table1Field;
@TableField(exist = true, value = "common_field")
private String table2Field;
@TableField(exist = true, value = "common_field")
private String table3Field;
// getter 和 setter 略
}
然后使用 MyBatis-Plus 的 BaseMapper
接口中的 selectList()
方法,传入一个 Wrapper
对象,即可实现多表联查。Wrapper
对象中可以使用 leftJoin()
、rightJoin()
、innerJoin()
等方法来指定不同的联接方式,具体使用方法可以参考 MyBatis-Plus 的官方文档。
例如,如果我们需要按照 common_field
字段进行内连接查询,可以使用以下代码:
Wrapper<CommonEntity> wrapper = new QueryWrapper<CommonEntity>()
.eq("table1.common_field", "xxx")
.eq("table2.common_field", "yyy")
.eq("table3.common_field", "zzz")
.select("table1.table1Field", "table2.table2Field", "table3.table3Field")
.last("limit 10");
List<CommonEntity> result = commonEntityMapper.selectList(wrapper);
其中,eq()
方法用于指定查询条件,select()
方法用于指定查询结果中需要返回的列,last()
方法用于追加 SQL 语句(例如 limit
、order by
等),selectList()
方法用于执行查询操作并返回结果。
除了以上方法,MyBatis-Plus 还提供了一些其他的查询方法,例如 selectMaps()
(查询结果映射为 Map)、selectObjs()
(查询结果映射为 Object)、selectCount()
(查询结果的数量)等,可以根据具体的业务需求选择合适的方法。