遇到這種情況的實體類,需要在mapper.xml檔案裡使用
resultMap标簽以及其他子标簽.
先貼代碼:
實體類:
UserEntity類:
private Long id;// 使用者id
private String username;// 使用者名
private String password;// 密碼
private List<Role> userRoles;// 使用者角色集合
Role類:
public class Role {
private Integer id; //角色id
private String roleName; //角色名稱
}
sql檔案:
t_user:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '使用者id',
`username` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '使用者名',
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '密碼',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, '123', 'admin');
INSERT INTO `t_user` VALUES (2, '456', 'admin');
SET FOREIGN_KEY_CHECKS = 1;
t_role:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_role
-- ----------------------------
DROP TABLE IF EXISTS `t_role`;
CREATE TABLE `t_role` (
`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '角色id',
`role_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '角色名稱',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_role
-- ----------------------------
INSERT INTO `t_role` VALUES (1, 'ROLE_USER');
INSERT INTO `t_role` VALUES (2, 'ROLE_ADMIN');
SET FOREIGN_KEY_CHECKS = 1;
t_user_roles:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user_roles
-- ----------------------------
DROP TABLE IF EXISTS `t_user_roles`;
CREATE TABLE `t_user_roles` (
`id` int(8) NOT NULL AUTO_INCREMENT COMMENT '使用者角色對照ID',
`user_id` int(8) NULL DEFAULT NULL COMMENT '使用者ID',
`role_id` int(8) NULL DEFAULT NULL COMMENT '角色ID',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_user_roles
-- ----------------------------
INSERT INTO `t_user_roles` VALUES (1, 1, 1);
INSERT INTO `t_user_roles` VALUES (2, 2, 2);
SET FOREIGN_KEY_CHECKS = 1;
application.yml :
spring:
datasource:
url: jdbc:mysql://localhost:3306/db03?characterEncoding=UTF-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
logging:
level:
com.example.bdatabaserole.mapper: debug # 列印sql語句
mybatis:
mapper-locations: classpath:mapper/*.xml
Mapper 接口
@Mapper
public interface UserMapper {
List<UserEntity> getUserByUsername(@Param("username") String username);
}
UserMapper .xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.test.mapper.UserMapper">
<!-- 按住Ctrl+Alt+C可以擷取全限定類名 -->
<resultMap id="userRoleMap" type="com.example.test.entity.UserEntity">
<id property="uid" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
<collection property="userRoles" ofType="com.example.test.entity.Role">
<id property="id" column="id"/>
<result property="roleName" column="role_name"></result>
</collection>
</resultMap>
<select id="getUserByUsername" resultMap="userRoleMap" parameterType="java.lang.String">
SELECT u.id, u.username, u.`password`, r.role_name,r.id
FROM `t_role` r,
t_user u,
t_user_roles ur
WHERE r.id = ur.role_id
AND u.id = ur.user_id
AND u.username = #{username}
</select>
</mapper>
UserService 接口
public interface UserService {
List<UserEntity> getUserByUsername(String username);
}
UserServiceImpl 實作類
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public List<UserEntity> getUserByUsername(String username) {
return userMapper.getUserByUsername(username);
}
}
UserController 類
@RestController
@RequestMapping("/User")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/getUserByUsername")
List<UserEntity> getUserByUsername(String username){
return userService.getUserByUsername(username);
}
}
結果:
[
{
"uid": 1,
"username": "123",
"password": "admin",
"userRoles": [
{
"id": 1,
"roleName": "ROLE_USER"
}
]
}
]
telnet