MyBatis注解式一对多映射

1. 一对多映射

1.1 数据库的创建

# 创建用户表
CREATE TABLE IF NOT EXISTS `user`(
  `id` INT AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL,
  `birthday` DATETIME NOT NULL,
  `sex` CHAR(1) NOT NULL,
  `address` VARCHAR(256),
  CONSTRAINT pk_user PRIMARY KEY(`id`)
);

# 添加用户数据
INSERT  INTO `user`(`id`,`username`,`birthday`,`sex`,`address`) VALUES 
(NULL,'周瑜','2020-02-27 17:47:08','男','吴国'),
(NULL,'大乔','2020-02-27 15:09:37','女','吴国'),
(NULL,'小乔','2020-02-27 11:34:34','女','吴国'),
(NULL,'陆逊','2020-02-27 12:04:06','男','吴国'),
(NULL,'孙策','2020-02-27 17:37:26','男','东吴'),
(NULL,'孙尚香','2020-02-27 11:44:00','女','吴国'),
(NULL,'曹操','2020-07-29 16:36:26','男','魏国');

# 创建角色表
CREATE TABLE IF NOT EXISTS `role`(
  `id` INT AUTO_INCREMENT,
  `role_name` VARCHAR(30) NOT NULL,
  `role_desc` VARCHAR(60) NOT NULL,
  CONSTRAINT pk_role PRIMARY KEY(`id`)
);

# 添加角色数据
INSERT  INTO `role`(`id`,`role_name`,`role_desc`) VALUES 
(1,'CEO','管理整个公司'),
(2,'总裁','管理整个集团'),
(3,'总监','管理整个分公司');

# 创建用户与角色关系表
CREATE TABLE IF NOT EXISTS `user_role`(
  `user_id` INT,
  `role_id` INT,
  CONSTRAINT pk_user_role PRIMARY KEY(`user_id`,`role_id`),
  CONSTRAINT fk_user_role_user FOREIGN KEY(`user_id`) REFERENCES `user`(`id`),
  CONSTRAINT fk_user_role_role FOREIGN KEY(`role_id`) REFERENCES `role`(`id`)
);

# 添加用户角色对应数据
INSERT  INTO `user_role`(`user_id`,`role_id`) VALUES 
(1,1),
(5,1),
(1,3);

1.2 表与表的对应关系

在这里插入图片描述

1.3 一对多查询需求

关系:一个用户有多个角色,一个角色有多个用户,他们通过用户角色表进行关联

需求:根据用户编号查询指定用户信息及其角色信息

2. 用户实体类

package zw.mybatis.bean.domain;

import lombok.Data;
import java.io.Serializable;
import java.util.Date;

/**
 * @ClassName UserDO
 * @Description 用户实体类
 * @Author 周威
 * @Date 2020-08-14 - 22:02
 */
@Data
public class UserDO implements Serializable
{
    /* 用户编号 */
    private Integer id;
    /* 用户姓名 */
    private String userName;
    /* 用户生日 */
    private Date birthday;
    /* 用户性别 */
    private String sex;
    /* 用户住址 */
    private String address;
}

3. 角色实体类

package zw.mybatis.bean.domain;

import lombok.Data;
import java.io.Serializable;

/**
 * @ClassName RoleDO
 * @Description 角色实体类
 * @Author 周威
 * @Date 2020-08-14 - 22:04
 */
@Data
public class RoleDO implements Serializable
{
    /* 角色编号 */
    private Integer id;
    /* 角色名称 */
    private String roleName;
    /* 角色描述 */
    private String roleDesc;
}

4. 用户展示实体类

package zw.mybatis.bean.vo;

import lombok.Data;
import zw.mybatis.bean.domain.RoleDO;
import zw.mybatis.bean.domain.UserDO;
import java.io.Serializable;
import java.util.List;

/**
 * @ClassName UserVO
 * @Description 用户展示实体类
 * @Author 周威
 * @Date 2020-08-14 - 22:06
 */
@Data
public class UserVO extends UserDO implements Serializable
{
    /* 角色信息 */
    private List<RoleDO> rolesDO;
}

5. 角色持久层接口

package zw.mybatis.mapper;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import zw.mybatis.bean.domain.RoleDO;
import java.util.List;

/**
 * @ClassName RoleMapper
 * @Description 角色持久层接口
 * @Author 周威
 * @Date 2020-08-14 - 22:08
 */
public interface RoleMapper
{
    /**
     * 查询角色信息,根据用户编号查询指定角色信息列表
     * @param userId
     * @return 角色信息列表
     */
    @Results({
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "roleName", property = "roleName"),
            @Result(column = "roleDesc", property = "roleDesc")
    })
    @Select("select t1.id id, t1.role_name roleName, t1.role_desc roleDesc from role t1 inner join user_role t2 on t1.id = t2.role_id where t2.user_id = #{userId}")
    List<RoleDO> listRoleInformationByUserId(Integer userId);
}

6. 用户持久层接口

package zw.mybatis.mapper;

import org.apache.ibatis.annotations.*;
import zw.mybatis.bean.vo.UserVO;

/**
 * @ClassName UserMapper
 * @Description 用户持久层接口
 * @Author 周威
 * @Date 2020-08-14 - 22:15
 */
public interface UserMapper
{
    /**
     * 查询用户信息,根据用户编号查询指定用户信息及其角色信息
     * @param userId
     * @return 用户信息
     */
    @Results({
            @Result(id = true, column = "id", property = "id"),
            @Result(column = "username", property = "userName"),
            @Result(column = "birthday", property = "birthday"),
            @Result(column = "sex", property = "sex"),
            @Result(column = "address", property = "address"),
            @Result(column = "id", property = "rolesDO", many = @Many(select = "zw.mybatis.mapper.RoleMapper.listRoleInformationByUserId"))
    })
    @Select("select * from user where id = #{userId}")
    UserVO findUserInformationAndRoleByUserId(Integer userId);
}

7. 用户持久层测试类

package zw.mybatis.mapper;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import zw.mybatis.bean.domain.RoleDO;
import zw.mybatis.bean.vo.UserVO;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @ClassName UserMapperTest
 * @Description 用户持久层测试类
 * @Author 周威
 * @Date 2020-08-14 - 22:20
 */
public class UserMapperTest
{
    @Test
    public void findUserInformationAndRoleByUserIdTest()
    {
        InputStream is = null;
        SqlSession sqlSession = null;
        try
        {
            // 读取mybatis配置文件
            is = Resources.getResourceAsStream("mybatis/mybatis.xml");
            // 创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            // 获取SQLSessionFactory对象
            SqlSessionFactory factory = builder.build(is);
            // 获取SqlSession对象
            sqlSession = factory.openSession();
            // 获取UserMapper代理对象
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            // 查询数据记录
            UserVO userVO = userMapper.findUserInformationAndRoleByUserId(1);
            // 打印用户信息
            System.out.println("用户编号:" + userVO.getId());
            System.out.println("用户姓名:" + userVO.getUserName());
            System.out.println("用户生日:" + userVO.getBirthday());
            System.out.println("用户性别:" + userVO.getSex());
            System.out.println("用户住址:" + userVO.getAddress());
            // 打印用户角色信息
            List<RoleDO> rolesDO = userVO.getRolesDO();
            for (RoleDO roleDO : rolesDO)
            {
                System.out.println("角色编号:" + roleDO.getId());
                System.out.println("角色名称:" + roleDO.getRoleName());
                System.out.println("角色描述:" + roleDO.getRoleDesc());
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                // 关闭资源
                if (sqlSession != null)
                    sqlSession.close();
                if (is != null)
                    is.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

8. 运行结果

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值