Mybatis 中实现多表关联查询

一.多表关联查询

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());
        }
        
    }
}

结果:

 
发布了372 篇原创文章 · 获赞 89 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/sizaif/article/details/105015295