栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis中处理 一对一、一对多、多对多 (实体)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis中处理 一对一、一对多、多对多 (实体)

感悟一下:

好记性不如烂笔头,因为最近面试,看太多java特性原理,项目大脑开始过滤了,导致问了这个问题不知道在说啥。。回顾一下

一、基本环境配置 1.依赖导入


    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.9.RELEASE
         
    
    com.atguigu
    mybatis_plus
    0.0.1-SNAPSHOT
    mybatis_plus
    Demo project for Spring Boot
    
        1.8
    
    
        
            org.springframework.boot
            spring-boot-starter
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.3.1
        





        
        
            mysql
            mysql-connector-java
        
        
        
            org.projectlombok
            lombok
            true
        
        
            org.mybatis
            mybatis-spring
            2.0.6
        
        
            org.springframework.data
            spring-data-commons
            2.3.7.RELEASE
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    



2.配置信息
#数据库的相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis1x?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

# MyBatis Mapper所对应的XML文件位置
mybatis-plus.mapper-locations= classpath*:/static

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for account
-- ----------------------------
DROp TABLE IF EXISTS `account`;
CREATE TABLE `account`  (
  `a_id` int(11) NOT NULL AUTO_INCREMENT,
  `money` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `u_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`a_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES (1, '100', 1);
INSERT INTO `account` VALUES (2, '200', 2);
INSERT INTO `account` VALUES (3, '300', 3);
INSERT INTO `account` VALUES (4, '400', 4);
INSERT INTO `account` VALUES (5, '110', 1);

-- ----------------------------
-- Table structure for role
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role`  (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`role_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES (1, '总裁', '管理公司');
INSERT INTO `role` VALUES (2, '经理', '管理部门');
INSERT INTO `role` VALUES (3, '组长', '管理小组');
INSERT INTO `role` VALUES (4, '县长', '管理县');

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '牛一', '海南', '男');
INSERT INTO `user` VALUES (2, '牛二', '海南', '女');
INSERT INTO `user` VALUES (3, '京一', '北京', '男');
INSERT INTO `user` VALUES (4, '京二', '北京', '女');

-- ----------------------------
-- Table structure for user_role
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NULL DEFAULT NULL,
  `role_id` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES (1, 1, 1);
INSERT INTO `user_role` VALUES (2, 1, 4);
INSERT INTO `user_role` VALUES (3, 2, 2);
INSERT INTO `user_role` VALUES (4, 3, 3);
INSERT INTO `user_role` VALUES (5, 4, 4);

SET FOREIGN_KEY_CHECKS = 1;

二、一对一 1.Account实体类
package com.atguigu.mybatis_plus.entity;

import lombok.Data;

@Data
public class Account {
    private Integer aId;
    private Integer uId;
    private Double money;

    //一个账号只有一个用户。1-1
    private User user;//对应association property="user" user指的就是这个对象

    @Override
    public String toString() {
        return "Account{" +
                "aId=" + aId +
                ", uId=" + uId +
                ", money=" + money +
                '}';
    }
}

2.User实体类
package com.atguigu.mybatis_plus.entity;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String name;
    private String address;
    private String sex;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", address='" + address + ''' +
                ", sex='" + sex + ''' +
                '}';
    }
}

3.AccountMapper接口
package com.atguigu.mybatis_plus.mapper;

import com.atguigu.mybatis_plus.entity.Account;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface AccountMapper {
    //查找所有账号,每个账号对应一个用户
    List findAll();
}
4.AccountMapper.xml



    
    
        
        
        
        
        
            
            
            
            
        
    

    
    select id,name,address,sex,a.* from user left outer join account a on user.id = a.u_id
    

    
    select role.*,user.* from user,role, user_role WHERe role.role_id=user_role.role_id and user.id=user_role.user_id
    

5.UserMapper添加
    //查找用户和他的角色
    List findRole();
6.UserMapper.xml中添加
 
    
        
        
        
        
        
            
            
            
        
    

    
7.测试类加上方法
@Test
    public void roleUserfind() {
        List list= roleMapper.findRoles();
        for (Role a:list) {
            a.toString();
            System.out.println(a.getUsers());
        }
    }
    @Test
    public void userRolefind() {
        List list= userMapper.findRole();
        for (User a:list) {
            a.toString();
            System.out.println(a.getRoles());
        }
    }
结果:

UserMapper中查找用户和他对应的权限 n:n

RoleMapper中查找权限对应的用户 n:n

五、总结 1.association

在我们实体关系对应1-1的时候,可以采用

association对应的实体只有一个对象
可以理解为association是为了打开这层User对象,进去映射sql查到User相关的结果。

2.collection

在我们实体关系对应1-n的时候,可以采用
反过来n-1也一样的道理。

collection对应的实体可以有很多对象,是个List容器

!!!如果上层id和collection中的id对应有多个一样的,只会存找到的第一个。
比如查找到的数据
<== Row: 1, 总裁, 管理公司, 1, 牛一, 海南, 男
<== Row: 1, 县长, 管理县, 1, 牛一, 海南, 男
<== Row: 2, 经理, 管理部门, 2, 牛二, 海南, 女
<== Row: 3, 组长, 管理小组, 3, 京一, 北京, 男

关键字有两组11,只会存第一个。
可以理解为collection拿了个袋子,给每个顾客挑选关键部位不一样的数据放进去。

希望能给迷惑的你带来一些帮助~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/591892.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号