1、一对一查询方法

举例说明此查询基本的数据库运行逻辑,编写关联查询 SQL 语句,查询 1 号用户和其扩展信息

SELECT * FROM USER u INNER JOIN user_info i ON u.id = i.id WHERE u.id=1;

查询结果:

1、User 实体类编写:

image-785o.webp

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 定义一对一关联映射,指定:propertyresultMap。

最终效果展示:

<?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>