mybatisx实现多表联查
MybatisX可以通过使用Mybatis的关联查询(association、collection、discriminator)和多表联合查询(join)来实现多表联查。
- 使用关联查询(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属性中。
- 使用多表联合查询(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对象中
原文地址: https://www.cveoy.top/t/topic/dhgG 著作权归作者所有。请勿转载和采集!