mybatisPlus实现多对多查询
时间: 2023-08-09 19:05:03 浏览: 95
Mybatis多对多关联查询
Mybatis-Plus 实现多对多查询需要用到中间表,中间表用于存储两个表的关联关系。以下是实现多对多查询的步骤:
1. 创建中间表
在数据库中创建中间表,中间表用于存储两个表的关联关系。例如,我们要查询 user 表和 role 表的信息,可以创建一个名为 user_role 的中间表,用于存储 user 表和 role 表的关联关系。
2. 创建实体类
创建 user、role 和 user_role 三个实体类,并在实体类中定义关联关系,例如:
```java
public class User {
private Long id;
private String name;
private List<Role> roles;
// getter 和 setter 方法
}
public class Role {
private Long id;
private String name;
private List<User> users;
// getter 和 setter 方法
}
public class UserRole {
private Long userId;
private Long roleId;
// getter 和 setter 方法
}
```
3. 创建 Mapper 接口
创建 user、role 和 user_role 三个 Mapper 接口,并在 Mapper 接口中定义多对多查询的方法,例如:
```java
public interface UserMapper extends BaseMapper<User> {
List<User> selectByRoleId(Long roleId);
}
public interface RoleMapper extends BaseMapper<Role> {
List<Role> selectByUserId(Long userId);
}
public interface UserRoleMapper extends BaseMapper<UserRole> {
// 无需定义方法
}
```
4. 创建 Service 接口和实现类
创建 user、role 和 user_role 三个 Service 接口和实现类,并在 Service 实现类中调用 Mapper 接口中定义的多对多查询的方法,例如:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private UserRoleMapper userRoleMapper;
@Override
public List<User> selectByRoleId(Long roleId) {
List<UserRole> userRoles = userRoleMapper.selectList(new QueryWrapper<UserRole>().eq("role_id", roleId));
List<Long> userIds = userRoles.stream().map(UserRole::getUserId).collect(Collectors.toList());
List<User> users = userMapper.selectBatchIds(userIds);
users.forEach(user -> {
List<Role> roles = roleMapper.selectByUserId(user.getId());
user.setRoles(roles);
});
return users;
}
}
@Service
public class RoleServiceImpl implements RoleService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private UserRoleMapper userRoleMapper;
@Override
public List<Role> selectByUserId(Long userId) {
List<UserRole> userRoles = userRoleMapper.selectList(new QueryWrapper<UserRole>().eq("user_id", userId));
List<Long> roleIds = userRoles.stream().map(UserRole::getRoleId).collect(Collectors.toList());
List<Role> roles = roleMapper.selectBatchIds(roleIds);
roles.forEach(role -> {
List<User> users = userMapper.selectByRoleId(role.getId());
role.setUsers(users);
});
return roles;
}
}
```
以上就是使用 Mybatis-Plus 实现多对多查询的步骤,其中关键是要定义中间表和实体类的关联关系,并在 Service 实现类中调用 Mapper 接口中定义的多对多查询的方法。
阅读全文