MybatisX可以通过使用Mybatis的关联查询(association、collection、discriminator)和多表联合查询(join)来实现多表联查。

  1. 使用关联查询(association、collection、discriminator)

关联查询可以在查询结果中包含其他表的数据,一般用于一对一或一对多的关系。在Mybatis中,关联查询包括association、collection和discriminator。

例如,有两个表user和order,user表中有一个字段userId,order表中有一个字段userId,表示订单所属的用户。可以使用关联查询将订单信息和用户信息一起查询出来。

User表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Order表:

CREATE TABLE `order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL,
  `orderNo` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

定义实体类User:

public class User {
    private Integer id;
    private String name;
    private List<Order> orders;
    // getter and setter
}

定义实体类Order:

public class Order {
    private Integer id;
    private Integer userId;
    private String orderNo;
    private User user;
    // getter and setter
}

在Mapper.xml中定义查询语句:

<select id="getUserById" resultMap="userMap">
    select * from user where id=#{id}
</select>

<resultMap type="com.example.demo.User" id="userMap">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="orders" ofType="com.example.demo.Order" resultMap="orderMap"/>
</resultMap>

<resultMap type="com.example.demo.Order" id="orderMap">
    <id property="id" column="id"/>
    <result property="userId" column="userId"/>
    <result property="orderNo" column="orderNo"/>
    <association property="user" javaType="com.example.demo.User" resultMap="userMap">
        <id property="id" column="userId"/>
    </association>
</resultMap>

以上代码中,定义了一个查询语句getUserById,查询结果使用resultMap userMap映射,其中包含了一个collection orders,表示查询出来的User对象中包含了多个Order对象。Order对象中又定义了一个关联查询,查询出来的User对象映射到user属性中。

  1. 使用多表联合查询(join)

多表联合查询可以将多个表的数据连接起来,一般用于多对多的关系。在Mybatis中,多表联合查询可以使用SQL语句来实现。

例如,有三个表user、role和user_role,user表和role表是多对多的关系,user_role表用来维护这个关系。可以使用多表联合查询将user和role的数据一起查询出来。

User表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Role表:

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

UserRole表:

CREATE TABLE `user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) DEFAULT NULL,
  `roleId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

定义实体类User:

public class User {
    private Integer id;
    private String name;
    private List<Role> roles;
    // getter and setter
}

定义实体类Role:

public class Role {
    private Integer id;
    private String name;
    // getter and setter
}

在Mapper.xml中定义查询语句:

<select id="getUserById" resultMap="userMap">
    select u.id,u.name,r.id as roleId,r.name as roleName from user u
    left join user_role ur on u.id=ur.userId
    left join role r on ur.roleId=r.id
    where u.id=#{id}
</select>

<resultMap type="com.example.demo.User" id="userMap">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="roles" ofType="com.example.demo.Role">
        <id property="id" column="roleId"/>
        <result property="name" column="roleName"/>
    </collection>
</resultMap>

以上代码中,定义了一个查询语句getUserById,查询结果使用resultMap userMap映射,其中包含了一个collection roles,表示查询出来的User对象中包含了多个Role对象。使用left join关联查询user表、user_role表和role表,将结果映射到User和Role对象中

mybatisx实现多表联查

原文地址: https://www.cveoy.top/t/topic/dhgG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录