好的,假设我们有 userrole 和 user_role 三张表,它们各自的 bean 对象可以定义如下:

/**
 * 用户表
 */
@Data
@TableName("user")
public class User {
    @TableId(type= IdType.AUTO)
    private Long id;

    private String username;

    private String password;

    private String name;

    private Integer age;

    private String email;

    @TableField(exist = false)
    private List<Role> roles; // 存储用户所拥有的角色信息
}
//加上注解后,Mybatis Plus 就会忽略这个字段,不会尝试将其映射到数据库表中。这样,我们就可以使用 //setRoles() 方法将查询出来的角色信息设置到 User 对象中,并在业务中使用了。

// 角色表
@Data
@TableName("role")
public class Role {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private String description;
}

// 用户角色关联表  ,其实这个用不到
@Data
@TableName("user_role")
public class UserRole {
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long userId;
    private Long roleId;
}

其中,@TableName 注解用于指定实体类对应的数据库表名,@TableId 注解用于指定主键字段的属性名和类型。这些注解在 Mybatis Plus 中是非常常用的。

使用 Entity 实体类进行多表联接查询时,我们可以先查询某个实体类,并将其存入缓存中,然后再通过 selectList() 方法查询与其关联的实体类信息。例如,要查询某个用户所拥有的角色信息,可以使用如下代码:

public User getUserWithRoles(Long userId) {
    // 查询用户信息,并将其存储到缓存中
    User user = userMapper.selectById(userId);
    // 查询用户对应的角色信息,并将其存储到缓存中
    List<Role> roles = roleMapper.selectList(
            Wrappers.<Role>lambdaQuery()
                    .inSql(Role::getId,
                            "SELECT role_id FROM user_role WHERE user_id = " + userId));

    // 将角色信息设置到用户对象中,并返回用户对象
    user.setRoles(roles);
    return user;
}

其中,通过 Wrappers.<Role>lambdaQuery() 创建了一个 LambdaQueryWrapper 对象,然后使用 .inSql(Role::getId, ...) 方法指定关联查询的条件。最后,将查询结果存储到缓存中,并将角色信息设置到用户对象中。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐