• mybatis实战:三、mybatis多表查询的映射


    依照上一期的继续


    1.UserMapper.xml

    除了直接对应基本数据类类型、表的实体类,还可能用到多表查询

    1. <select id="selectRolesByUserId" resultType="tk.mybatis.simple.model.SysRole">
    2. select r.id, r.role_name roleName, r.enabled, r.create_by createBy , r.create_time createTime,
    3. u.user_name as "user.userName",
    4. u.user_email as "user.userEmail"
    5. from sys_user u
    6. inner join sys_user_role ur on u.id = ur.user_id
    7. inner join sys_role r on ur.role_id = r.id
    8. where u.id = #{userid}
    9. </select>
    这里可以看到映射的不仅是两个类,那如何解决呢?

    (1) 新创一个类继承对应的实体类,增加要对应的属性

    1. package tk.mybatis.simple.model;
    2. public class SysRoleExtend extends SysRole {
    3. private String userName;
    4. public String getUserName() {
    5. return userName;
    6. }
    7. public void setUserName(String userName) {
    8. this.userName = userName;
    9. }
    10. }

    记得将resultType修改!为继承的,这里只加了username(为了举例),额外需要什么再加。

    将resultType 设置为扩展属性后的 SysRoleExtend 对象,通过这种方式来接收多余的值。这种方式比较适合在需要少量额外宇段时使用,但是如果需要其他表中大量列的值时,
    这种方式就不适用了,因为我们不能将一个类的属性都照搬到另一 个类中

    (2)原有类基础上加对应的User类(推荐)

    1. package tk.mybatis.simple.model;
    2. import lombok.Data;
    3. import java.util.Date;
    4. @Data
    5. public class SysRole {
    6. private Long id;
    7. private String roleName;
    8. private Date createTime;
    9. private Long createBy;
    10. private int enabled;
    11. private SysUser user;
    12. }
    直接在 SysRole 中增加 SysUser 对象 字段名为 user ,增加这个字段后,修改 XML 中的 selectRolesByUserId 方法。

    2.UserMapper

    增加

    List selectRolesByUserId(Long userid);

    3.UserMapperTest

    1. package tk.mybatis.simple.mapper;
    2. import org.apache.ibatis.session.SqlSession;
    3. import org.junit.Assert;
    4. import org.junit.Test;
    5. import tk.mybatis.simple.model.SysRole;
    6. import java.util.List;
    7. public class UserMapperTest extends BaseMapperTest{
    8. @Test
    9. public void testSelectRolesByUserid() {
    10. SqlSession sqlSession = getSqlSession();
    11. try {
    12. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    13. List<SysRole> roleList = userMapper.selectRolesByUserId((long) 1);
    14. Assert.assertNotNull(roleList);
    15. Assert.assertTrue(roleList.size() > 0);
    16. } finally {
    17. sqlSession.close();
    18. }
    19. }
    20. }

    5.运行结果

    6.遇到的问题 

    之前有一个插入没有成功,导致没有一一映射,就会抛出异常,查询到的结果是null。

  • 相关阅读:
    论文总结5 基于Kmeans聚类的XGBoost集成算法研究
    小学生python游戏开发pygame5--title地图调用
    python提高运算速度的方法:内存缓存+磁盘缓存
    exceljs库实现excel表样式定制化
    Unity实现设计模式——迭代器模式
    PoseiSwap的趋势性如何体现?
    C语言问题,整数查找,输入一个整数N,再输入一个整数M,查找整数M在N中第一次出现的位置。
    C# OpenVINO Cls 图像分类
    HDFS读写流程
    【故障补牢】贪吃的 Bing 爬虫,限量供应的应对措施
  • 原文地址:https://blog.csdn.net/H215919719/article/details/128128961