1、一对一查询方法
举例说明此查询基本的数据库运行逻辑,编写关联查询 SQL 语句,查询 1 号用户和其扩展信息
SELECT * FROM USER u INNER JOIN user_info i ON u.id = i.id WHERE u.id=1;查询结果:

1、User 实体类编写:

2、UserInfo 扩展信息实体类编写:

3、UserMapper接口:
public interface UserMapper {
// 一对一:通过用户ID查找用户和扩展信息
User findUserAndInfo(int uid);
}4、UserMapper.xml文件编写:
接口映射 UserMapper.xml 的配置
association 标签的作用:一对一关联映射

配置步骤:
1. 定义 User 的映射UserMap和 UserInfo 的映射UserInfoMap。
2. 使用 association 定义一对一关联映射,指定:property和resultMap。

最终效果展示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wsh.mapper.UserMapper">
<!--
resultMap标签:当数据库字段名和类的成员变量名不一致的时候,作为封装对象的映射关系使用
包括,属性中有别的对象成员变量的时候
id:唯一标识
做多表查询的时候,最好把每个字段都映射上,避免出现字段名相同的情况
id标签:主键字段 column数据库的字段名 property类的成员变量名
result标签:除主键之外的字段
association标签:做一对一关联映射
property属性:类的成员变量名
resultMap属性:成员变量对应的对象映射关系
-->
<resultMap id="UserMap" type="User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="birthday" property="birthday" />
<result column="sex" property="sex" />
<result column="address" property="address" />
<association property="infoData" resultMap="UserInfoMap" />
</resultMap>
<resultMap id="UserInfoMap" type="UserInfo" >
<id column="id" property="id" />
<result column="height" property="height" />
<result column="weight" property="weight" />
<result column="married" property="married" />
</resultMap>
<!--根据用户id查询用户信息及扩展信息-->
<select id="selectUserAndInfoById" resultMap="UserMap">
SELECT * FROM USER INNER JOIN user_info ON user.id = user_info.id WHERE user.id = #{id};
</select>
</mapper>2、多对多查询方法,大体和上面的类似
1、举例说明:查询某个用户,并且查询关联用户的多个订单信息。
SELECT * FROM USER u INNER JOIN `order` o ON u.id=o.user_id WHERE u.id=1;查询结果:
2、编写 User 实体类:
public class User{
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
//一个用户包含一个扩展信息(一对一)
private UserInfo userInfo;
//一个用户包含多个订单(一对多)
private List<Order> orders;
}3、编写多个订单实体类:
public class Order {
private int oid;
private int userId;
private String number;
private Timestamp createTime;
private String note;
}4、UserMapper接口:
public interface UserMapper {
// 一对多:通过用户ID查找用户和订单
User findUserAndOrders(int uid);
}接口映射文件配置
1. 定义订单的映射 OrderMap
2. collection:配置一对多关系,指定 property 和 resultMap
3. 查询某个用户,并且查询关联的多个订单信息

5、级联关系映射图

6、最终代码效果演示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.UserMapper">
<!--
resultMap标签:当数据库字段名和类的成员变量名不一致的时候,作为封装对象的映射关系使用
包括,属性中有别的对象成员变量的时候
id:唯一标识
做多表查询的时候,最好把每个字段都映射上,避免出现字段名相同的情况
id标签:主键字段 column数据库的字段名 property类的成员变量名
result标签:除主键之外的字段
association标签:做一对一关联映射
property属性:类的成员变量名
resultMap属性:成员变量对应的对象映射关系
collection标签:做一对多关系映射
-->
<resultMap id="UserMap" type="User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="birthday" property="birthday" />
<result column="sex" property="sex" />
<result column="address" property="address" />
<!--一对多映射orderList信息-->
<collection property="orderList" resultMap="OrderMap" />
<!--对应roleList的信息-->
<collection property="roleList" resultMap="RoleMap" />
</resultMap>
<resultMap id="RoleMap" type="Role" >
<id column="role_id" property="roleId" />
<result column="role_name" property="roleName" />
<result column="role_detail" property="roleDetail" />
</resultMap>
<resultMap id="OrderMap" type="Order">
<id column="oid" property="oId" />
<result column="user_id" property="userId" />
<result column="number" property="number" />
<result column="create_time" property="createTime" />
<result column="note" property="note" />
</resultMap>
<!--根据用户id查询用户信息及其订单信息-->
<select id="selectUserAndOrderById" resultMap="UserMap">
SELECT * FROM USER INNER JOIN `order` ON
user.id = `order`.`user_id` WHERE user.id = #{id};
</select>
<!--从用户角度,根据id查询用户信息及其角色信息-->
<select id="selectUserAndRoleById" resultMap="UserMap">
SELECT * FROM USER
INNER JOIN user_role ON user.id = user_role.`user_id`
INNER JOIN role ON user_role.`role_id` = role.`role_id`
WHERE user.id = #{id};
</select>
</mapper>MyBatis级联一对一和多对多查询
https://wshlyl.cn/archives/mybatisji-lian-yi-dui-yi-cha-xun
评论