首页 > 其他分享 >MyBatis复杂映射开发之多对多查询

MyBatis复杂映射开发之多对多查询

时间:2022-08-30 14:26:02浏览次数:89  
标签:username 映射 id sys role MyBatis rolename 查询 public

多对多查询的模型

用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用。

多对多查询的需求:查询所有用户的同时查询出该用户对应的所有角色。

@startuml

!theme plain
top to bottom direction
skinparam linetype ortho

class sys_role {
   rolename: varchar(255)
   roleDesc: varchar(255)
   id: int(11)
}
class sys_user_role {
   userid: int(11)
   roleid: int(11)
}
class node2 as "user  /* 用户表 */" {
   username: varchar(50)
   password: varchar(50)
   birthday: varchar(50)
   id: int(11)
}

sys_user_role  ^-[#595959,plain]-  sys_role      : "roleid:id"
sys_user_role  ^-[#595959,plain]-  node2         : "userid:id"
@enduml

如果图片无法查看,请看这里

多对多查询的语句

对应的sql语句:

select u.id,u.username,r.id,r.rolename from user u left join sys_user_role ur on u.id=ur.userid
inner join sys_role r on r.id= ur.roleid

查询结果如下:

id username id rolename
1 lucy 1 CTO
2 tom 1 CTO
1 lucy 2 CEO
2 tom 2 CEO

创建Role实体,修改User实体

User

class User {
    var id: Int? = null
    var username: String? = null

    // 代表当前用户具备那些订单
    var orderList: List<Order>? = null

    // 代表当前用户具备的那些角色
    var roleList: List<Role>? = null
    override fun toString(): String {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", orderList=" + orderList +
                ", roleList=" + roleList +
                '}'
    }
}
public class User {
    private Integer id;
    private String username;

    // 代表当前用户具备那些订单
    private List<Order> orderList;

    // 代表当前用户具备的那些角色
    private List<Role> roleList;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public List<Order> getOrderList() {
        return orderList;
    }

    public void setOrderList(List<Order> orderList) {
        this.orderList = orderList;
    }

    public List<Role> getRoleList() {
        return roleList;
    }

    public void setRoleList(List<Role> roleList) {
        this.roleList = roleList;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", orderList=" + orderList +
                ", roleList=" + roleList +
                '}';
    }
}

Role

class Role {
    private val id: Int? = null
    private val rolename: String? = null
  
    override fun toString(): String {
      return "Role{" +
      "id=" + id +
      ", rolename='" + rolename + '\'' +
      '}'
    }
}
public class Role {
    private Integer id;
    private String rolename;
  
  @Override
  public String toString() {
      return "Role{" +
              "id=" + id +
              ", rolename='" + rolename + '\'' +
              '}';
  }
}

UserMapper添加接口方法

/**
 * 查询所有用户以及对应的角色
 * @return
 */
fun findAllUserAndRole(): List<User?>?
/**
 * 查询所有用户以及对应的角色
 * @return
 */
public List<User> findAllUserAndRole();

配置UserMapper.xml

<resultMap id="userRoleMap" type="com.terwergreen.pojo.User">
    <result property="id" column="id"></result>
    <result property="username" column="username"></result>

    <collection property="roleList" ofType="com.terwergreen.pojo.Role">
        <result column="rid" property="id"></result>
        <result column="rolename" property="rolename"></result>
    </collection>
</resultMap>

<select id="findAllUserAndRole" resultMap="userRoleMap">
    select u.id,u.username,r.id,r.rolename from user u left join sys_user_role ur on u.id=ur.userid
    inner join sys_role r on r.id=ur.roleid
</select>

测试结果

==>  Preparing: select u.id,u.username,r.id as rid,r.rolename from user u left join sys_user_role ur on u.id=ur.userid inner join sys_role r on r.id=ur.roleid
==> Parameters: 
<==    Columns: id, username, rid, rolename
<==        Row: 1, lucy, 1, CTO
<==        Row: 2, tom, 1, CTO
<==        Row: 1, lucy, 2, CEO
<==        Row: 2, tom, 2, CEO
<==      Total: 4
User{id=1, username='lucy', orderList=null, roleList=[Role{id=1, rolename='CTO'}, Role{id=2, rolename='CEO'}]}
User{id=2, username='tom', orderList=null, roleList=[Role{id=1, rolename='CTO'}, Role{id=2, rolename='CEO'}]}

知识总结

MyBatis多表配置方式:

一对一配置:使用做配置

一对多配置:使用+做配置

多对多配置:使用+做配置

本文代码地址

mybatis-multitable

文章更新历史

2022/05/08 feat:新增Kotlin支持。

2022/05/04 feat:初稿。

标签:username,映射,id,sys,role,MyBatis,rolename,查询,public
From: https://www.cnblogs.com/tangyouwei/p/mybatis-complex-mapping-development-of-many-to-many-q

相关文章

  • mysql查询
    目录in和exists的区别结论原理in和exists的区别结论A.idin(B)适合子表b比主表a表数据量小的情况。A.idexists(B)则相反原理in子表驱动主表,是先查出(B)的数据,2个......
  • Sql语句查询慢(持续整理中。。。。。。)
    1.坚决不使用“*”来写查询。建索引,2.减少表之间的关联3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面,简化查询字段,没用的......
  • DevTools 无法加载来源映射:无法加载 webpack··· net::ERR_UNKNOWN_URL_SCHEME
    问题:DevTools无法加载来源映射:无法加载webpack:///node_modules/element-plus/es/components/notification/src/notification.mjs.map的内容:Fetchthroughtargetfaile......
  • MyBatis复杂映射开发之一对一查询
    一对一查询需求用户表和订单表的关系为:一个用户可以有多个订单,一个订单只能从属于一个用户一对一查询需求:查询一个订单,同时查询出该订单所对应的用户对应的sql语句:sele......
  • mybatis批量插入时报错:syntax error, expect ‘)‘
    问题:mybatis批量插入时报错:syntaxerror,expect‘)’ 解决:是因为传入的参数list为null,在代码中加上list.size()>0的判断。mapper文件:<insertid="batchInsertSys......
  • ElasticSearch 精确查询统计
    ElasticSearch精确查询统计match_phrase:短语匹配,不分词GETlogback-2022-08/_search{"size":1,//显示1条记录"query":{"bool":{"must":[......
  • MyBatis的基本使用
    快速入门Mybatis的官网:https://mybatis.org/mybatis-3/MyBatis的开发步骤添加MyBatis的坐标<properties><project.build.sourceEncoding>UTF-8</project.build.so......
  • SQL4 - 查询结果限制返回行数 - LIMIT/WHERE用法+效率分析
    题目链接戳这里LIMIT用法LIMIT2=LIMIT0,2:取前2条数据LIMITx,y=LIMITx,OFFSETy:从第x条数据开始,返回y条记录LIMIT5,10:从第6行数据开始取,取到第15行......
  • MyBatis的基本介绍及优势
    MyBatis的历史由来Mybatis原本是Apache软件基金会的一个开源项目叫做iBatis,2010年这个项目由Apache迁移到了googlecode管理才改名为Mybatis,2013年又迁移到......
  • SQL5 - 将查询后的列重新命名 - AS用法
    题目链接戳这里题解为了代码更清楚,用着重号表名需要重新命名的列SELECTdevice_idAS`user_infos_example`FROMuser_profileWHEREid<=2--或用LIMIT2......