一.多表关联查询
1.1 一对一关系
1.1.2 关联查询
数据库结构:
Member表以及外键;
Users表:
MySQL代码:
-- users
create table users
(
id INT not null comment 'ID',
createDate DATETIME not null comment '创建日期',
modifyDate DATETIME not null comment '最后修改日期',
isEnabled BIT not null comment '是否启用',
isLocked BIT not null comment '是否锁定',
lastLoginDate DATETIME comment '最后登录日期',
lastLoginIp VARCHAR(255) comment '最后登录IP',
lockDate DATETIME comment '锁定日期'
) comment '用户'
alter table users
add constraint PK_users_id primary key (id)
-- role
/*
警告: 表名可能非法 - role
*/
create table `ROLE`
(
id INT not null comment 'ID',
description VARCHAR(255) comment '描述',
name VARCHAR(255) not null comment '名称'
) comment '角色'
alter table `ROLE`
add constraint PK_role_id primary key (id)
-- memberrank
/*
警告: 字段名可能非法 - scale
*/
create table memberrank
(
id INT not null comment 'ID',
createDate DATETIME not null comment '创建日期',
modifyDate DATETIME not null comment '最后修改日期',
amount DOUBLE(23,6) comment '消费金额',
isDefault BIT not null comment '是否默认',
isSpecial BIT not null comment '是否特殊',
name VARCHAR(255) not null comment '名称',
`SCALE` DOUBLE not null comment '优惠比例'
) comment '会员等级'
alter table memberrank
add constraint PK_memberrank_id primary key (id)
-- member
/*
警告: 表名可能非法 - member
*/
create table `MEMBER`
(
id INT not null comment 'ID',
area_id INT comment '地区',
memberRank_id INT not null comment '会员等级',
address VARCHAR(255) comment '地址',
birth DATETIME comment '出生日期',
email VARCHAR(64) not null comment 'E-mail',
encodedPassword VARCHAR(255) not null comment '加密密码',
gender INT comment '性别',
phone VARCHAR(64) comment '手机',
turename VARCHAR(64) comment '姓名',
username VARCHAR(64) not null comment '用户名',
school VARCHAR(64) comment '学校',
image VARCHAR(255) comment '头像'
) comment '成员'
alter table `MEMBER`
add constraint PK_member_id primary key (id)
create index IDX_member_area_id on `MEMBER`(area_id)
create index IDX_memberRank_id on `MEMBER`(memberRank_id)
create unique index IDU_member_email on `MEMBER`(email)
create unique index IDU_member_phone on `MEMBER`(phone)
create unique index IDU_member_username on `MEMBER`(username)
-- permissions
create table permissions
(
Id INT not null comment '编号',
Name VARCHAR(4000) comment '名称',
Memo VARCHAR(4000) comment '注释'
) comment '权限表'
alter table permissions
add constraint PK_permissions_Id primary key (Id)
-- role_permission
create table role_permission
(
role_id INT comment '编号',
permission_id INT comment '父编号'
) comment '数据表12'
alter table `ROLE`
add constraint FK_role_id foreign key (id)
references users(id)
alter table `MEMBER`
add constraint FK_member_id foreign key (id)
references users(id)
alter table `MEMBER`
add constraint FK_member_area_id foreign key (area_id)
references area(id)
Cannot add foreign key constraint
已中止
-- users
-- role
-- memberrank
-- member
-- alter table `MEMBER` drop column area_id;
-- permissions
-- role_permission
alter table `MEMBER`
add constraint FK_memberRank_id foreign key (memberRank_id)
references memberrank(id)
alter table role_permission
add constraint FK_role_peion_role_id39A0 foreign key (role_id)
references `ROLE`(id)
alter table role_permission
add constraint FK_role_peion_permiss_id3C4A foreign key (permission_id)
references permissions(Id)
已完成
-- users
-- Modify from users.isEnabled NUMERIC(1)
alter table users modify isEnabled BIT not null comment '是否启用'
-- Modify from users.isLocked NUMERIC(1)
alter table users modify isLocked BIT not null comment '是否锁定'
-- role
-- memberrank
-- Modify from memberrank.isDefault NUMERIC(1)
alter table memberrank modify isDefault BIT not null comment '是否默认'
-- Modify from memberrank.isSpecial NUMERIC(1)
alter table memberrank modify isSpecial BIT not null comment '是否特殊'
-- member
alter table `MEMBER` modify email VARCHAR(64) not null comment 'E-mail'
Invalid use of NULL value
已中止
-- users
-- role
-- memberrank
-- Modify from memberrank.isDefault BIT
alter table memberrank modify isDefault NUMERIC(1) null comment '是否默认'
-- Modify from memberrank.isSpecial BIT
alter table memberrank modify isSpecial NUMERIC(1) null comment '是否特殊'
-- member
alter table `MEMBER` modify email VARCHAR(64) not null comment 'E-mail'
Invalid use of NULL value
已中止
-- users
-- role
-- memberrank
-- Modify from memberrank.isDefault TINYINT
alter table memberrank modify isDefault NUMERIC(1) comment '是否默认'
-- Modify from memberrank.isSpecial TINYINT
alter table memberrank modify isSpecial NUMERIC(1) comment '是否特殊'
-- member
-- permissions
-- role_permission
-- Modify comment of role_permission.role_id
alter table role_permission modify role_id INT comment '角色ID'
-- Modify comment of role_permission.permission_id
alter table role_permission modify permission_id INT comment '权限ID'
-- users_role
create table users_role
(
user_id INT not null comment '用户ID',
role_id INT comment '角色ID'
) comment '用户角色'
alter table users_role
add constraint PK_users_role_user_id primary key (user_id)
alter table users_role
add constraint FK_users_role_user_id foreign key (user_id)
references users(id)
alter table users_role
add constraint FK_users_role_role_id foreign key (role_id)
references `ROLE`(id)
已完成
-- users
-- role
/*
警告: 表名可能非法 - role
*/
create table `ROLE`
(
id INT not null comment 'ID',
description VARCHAR(255) comment '描述',
name VARCHAR(255) not null comment '名称'
) comment '角色'
alter table `ROLE`
add constraint PK_role_id primary key (id)
-- memberrank
-- Modify from memberrank.isDefault TINYINT
alter table memberrank modify isDefault NUMERIC(1) comment '是否默认'
-- Modify from memberrank.isSpecial TINYINT
alter table memberrank modify isSpecial NUMERIC(1) comment '是否特殊'
-- member
-- permissions
-- role_permission
create table role_permission
(
role_id INT comment '角色ID',
permission_id INT comment '权限ID'
) comment '数据表12'
-- users_role
create table users_role
(
user_id INT not null comment '用户ID',
role_id INT comment '角色ID'
) comment '用户角色'
alter table users_role
add constraint PK_users_role_user_id primary key (user_id)
alter table role_permission
add constraint FK_role_peion_role_id39A0 foreign key (role_id)
references `ROLE`(id)
alter table role_permission
add constraint FK_role_peion_permiss_id3C4A foreign key (permission_id)
references permissions(Id)
alter table users_role
add constraint FK_users_role_user_id foreign key (user_id)
references users(id)
alter table users_role
add constraint FK_users_role_role_id foreign key (role_id)
references `ROLE`(id)
已完成
-- users
create table users
(
id INT not null comment 'ID',
createDate DATETIME not null comment '创建日期',
modifyDate DATETIME not null comment '最后修改日期',
isEnabled BIT not null comment '是否启用',
isLocked BIT not null comment '是否锁定',
lastLoginDate DATETIME comment '最后登录日期',
lastLoginIp VARCHAR(255) comment '最后登录IP',
lockDate DATETIME comment '锁定日期',
name VARCHAR(64) not null comment '用户名',
encodePassword VARCHAR(64) not null comment '加密密码'
) comment '用户'
alter table users
add constraint PK_users_id primary key (id)
create unique index IDU_users_name on users(name)
-- role
/*
警告: 表名可能非法 - role
*/
create table `ROLE`
(
id INT not null comment 'ID',
description VARCHAR(255) comment '描述',
name VARCHAR(255) not null comment '名称'
) comment '角色'
alter table `ROLE`
add constraint PK_role_id primary key (id)
-- memberrank
/*
警告: 字段名可能非法 - scale
*/
create table memberrank
(
id INT not null comment 'ID',
createDate DATETIME not null comment '创建日期',
modifyDate DATETIME not null comment '最后修改日期',
amount DOUBLE(23,6) comment '消费金额',
isDefault NUMERIC(1) comment '是否默认',
isSpecial NUMERIC(1) comment '是否特殊',
name VARCHAR(255) not null comment '名称',
`SCALE` DOUBLE not null comment '优惠比例'
) comment '会员等级'
alter table memberrank
add constraint PK_memberrank_id primary key (id)
-- member
/*
警告: 表名可能非法 - member
*/
create table `MEMBER`
(
id INT not null comment 'ID',
memberRank_id INT not null comment '会员等级',
address VARCHAR(255) comment '地址',
birth DATETIME comment '出生日期',
email VARCHAR(64) comment 'E-mail',
gender INT comment '性别',
phone VARCHAR(64) comment '手机',
turename VARCHAR(64) comment '姓名',
school VARCHAR(64) comment '学校',
image VARCHAR(255) comment '头像'
) comment '成员'
alter table `MEMBER`
add constraint PK_member_id primary key (id)
create index IDX_memberRank_id on `MEMBER`(memberRank_id)
create unique index IDU_member_email on `MEMBER`(email)
create unique index IDU_member_phone on `MEMBER`(phone)
-- permissions
create table permissions
(
Id INT not null comment '编号',
Name VARCHAR(4000) comment '名称',
Memo VARCHAR(4000) comment '注释'
) comment '权限表'
alter table permissions
add constraint PK_permissions_Id primary key (Id)
-- role_permission
create table role_permission
(
role_id INT comment '角色ID',
permission_id INT comment '权限ID'
) comment '数据表12'
-- users_role
create table users_role
(
user_id INT not null comment '用户ID',
role_id INT comment '角色ID'
) comment '用户角色'
alter table users_role
add constraint PK_users_role_user_id primary key (user_id)
alter table `MEMBER`
add constraint FK_member_id foreign key (id)
references users(id)
alter table `MEMBER`
add constraint FK_memberRank_id foreign key (memberRank_id)
references memberrank(id)
alter table role_permission
add constraint FK_role_peion_role_id39A0 foreign key (role_id)
references `ROLE`(id)
alter table role_permission
add constraint FK_role_peion_permiss_id3C4A foreign key (permission_id)
references permissions(Id)
alter table users_role
add constraint FK_users_role_user_id foreign key (user_id)
references users(id)
alter table users_role
add constraint FK_users_role_role_id foreign key (role_id)
references `ROLE`(id)
二:创建实体类Member 和Users类, Member中包含Users
package com.sizaif.emsdemo.pojo;
public class Member {
private int id;
private int memberRankId;
private String address;
private String birth;
private String email;
private int gender;
private String phone;
private String truename;
private String school;
private String image;
private Users users;
public Member() {
}
public Member(int id, int memberRankId, String address, String birth, String email, int gender, String phone, String truename, String school, String image, Users users) {
this.id = id;
this.memberRankId = memberRankId;
this.address = address;
this.birth = birth;
this.email = email;
this.gender = gender;
this.phone = phone;
this.truename = truename;
this.school = school;
this.image = image;
this.users = users;
}
@Override
public String toString() {
return "Member{" +
"id=" + id +
", memberRankId=" + memberRankId +
", address='" + address + '\'' +
", birth='" + birth + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
", phone='" + phone + '\'' +
", truename='" + truename + '\'' +
", school='" + school + '\'' +
", image='" + image + '\'' +
", users=" + users +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getMemberRankId() {
return memberRankId;
}
public void setMemberRankId(int memberRankId) {
this.memberRankId = memberRankId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBirth() {
return birth;
}
public void setBirth(String birth) {
this.birth = birth;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getTruename() {
return truename;
}
public void setTruename(String truename) {
this.truename = truename;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
}
package com.sizaif.emsdemo.pojo;
public class Users {
private int id;
private int isEnabled;
private int isLocked;
private String creatDate;
private String modifyDate;
private String lastLoginDate;
private String lastLogIp;
private String lockDate;
private String name;
private String password;
public Users() {
}
public Users(int id, int isEnabled, int isLocked, String creatDate, String modifyDate, String lastLoginDate, String lastLogIp, String lockDate, String name, String password) {
this.id = id;
this.isEnabled = isEnabled;
this.isLocked = isLocked;
this.creatDate = creatDate;
this.modifyDate = modifyDate;
this.lastLoginDate = lastLoginDate;
this.lastLogIp = lastLogIp;
this.lockDate = lockDate;
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "Users{" +
"id=" + id +
", isEnabled=" + isEnabled +
", isLocked=" + isLocked +
", creatDate='" + creatDate + '\'' +
", modifyDate='" + modifyDate + '\'' +
", lastLoginDate='" + lastLoginDate + '\'' +
", lastLogIp='" + lastLogIp + '\'' +
", lockDate='" + lockDate + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getIsEnabled() {
return isEnabled;
}
public void setIsEnabled(int isEnabled) {
this.isEnabled = isEnabled;
}
public int getIsLocked() {
return isLocked;
}
public void setIsLocked(int isLocked) {
this.isLocked = isLocked;
}
public String getCreatDate() {
return creatDate;
}
public void setCreatDate(String creatDate) {
this.creatDate = creatDate;
}
public String getModifyDate() {
return modifyDate;
}
public void setModifyDate(String modifyDate) {
this.modifyDate = modifyDate;
}
public String getLastLoginDate() {
return lastLoginDate;
}
public void setLastLoginDate(String lastLoginDate) {
this.lastLoginDate = lastLoginDate;
}
public String getLastLogIp() {
return lastLogIp;
}
public void setLastLogIp(String lastLogIp) {
this.lastLogIp = lastLogIp;
}
public String getLockDate() {
return lockDate;
}
public void setLockDate(String lockDate) {
this.lockDate = lockDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
三:application.yml 中配置:
#mybatis配置
mybatis:
typeAliasesPackage: com.sizaif.emsdemo.pojo
mapperLocations: classpath:mybatis/Mapper/*.xml
四: UserMapper.xml中配置: 因为已经配置别名了,.所以只需要写实体类名就可以
<resultMap id="MemberUserMap" type="Member">
<!--column数据库中的字段,property实体类中的属性-->
<id column="id" property="id"/>
<result column="memberRank_id" property="memberRankId"/>
<result column="address" property="address"/>
<result column="birth" property="birth"/>
<result column="email" property="email"/>
<result column="gender" property="gender"/>
<result column="phone" property="phone"/>
<result column="truename" property="truename"/>
<result column="school" property="school"/>
<result column="image" property="image"/>
<!--关联查询 property users对应数据库中表明 javaType对应到实体类名字-->
<association property="users" javaType="Users">
<id column="id" property="id"/>
<result column="createDate" property="creatDate"/>
<result column="modifyDate" property="modifyDate"/>
<result column="isEnabled" property="isEnabled"/>
<result column="isLocked" property="isLocked"/>
<result column="lastLoginDate" property="lastLoginDate"/>
<result column="lastLoginIp" property="lastLogIp"/>
<result column="lockDate" property="lockDate"/>
<result column="name" property="name"/>
<result column="encodePassword" property="password"/>
</association>
</resultMap>
<select id="queryUserList" resultMap="MemberUserMap">
SELECT
member.* ,users.*
FROM
member ,users
WHERE
member.id = users.id
</select>
五: 测试类:
package com.sizaif.emsdemo.TestController;
import com.sizaif.emsdemo.mapper.UserMapper;
import com.sizaif.emsdemo.pojo.Member;
import com.sizaif.emsdemo.pojo.User;
import com.sizaif.emsdemo.service.UsersService;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
public class TestUserMapper {
@Autowired
private UsersService usersService;
@Test
public void Test(){
List<Member> members = usersService.queryUserList();
for (Member user : members) {
System.out.println(user.toString());
}
}
}
结果: