关于resultMap 中的 association 理解

以下皆为个人理解,如果有错误,或者理解错误 还希望各位可以指出。

先创建实体类 老师实体类(我这里懒省事,从上往下注解为 get与set,无参,有参)

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    private int id;
    private String name;

}

创建学生实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    /*因为学生需要关联老师,所以不能使用   private int tid;*/
    private Teacher teacher;
}

数据库字段(学生,老师)

编写接口

public interface studentDao {
    
    List<Student> getStudent();

}

编写mapper实现

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace绑定一个对应的Dao/Mapper接口 -->
<mapper namespace="cn.cvs.dao.studentDao">

<!-- 先查询学生  -->
   <select id="getStudent" resultMap="StudentTeacher" >
        select  * from student
    </select>

<resultMap id="StudentTeacher" type="cn.cvs.pojo.Student">
        <result property="id" column="id"/>
        <result property="name" column="name" />
        <association property="teacher" column="tid" javaType="cn.cvs.pojo.Teacher" select="getTeacher" />
    </resultMap>

    <select id="getTeacher" resultType="cn.cvs.pojo.Teacher">
        select * from teacher where id =#{name}
    </select>

</mapper>

我感觉一般都会在 resultMap 中的 association 这块不是很懂如下

<resultMap id="StudentTeacher" type="cn.cvs.pojo.Student">
        <result property="id" column="id"/>
        <result property="name" column="name" />
        <association property="teacher" column="tid" javaType="cn.cvs.pojo.Teacher" select="getTeacher" />
    </resultMap>

resultMap 和 association 基本不差 但是 association 代表的是对象,而resultMap 只能查出单个,不能查询对象,所以用到 association

两者有相同的属性 也就是 property="teacher" column="tid"

property="teacher" 由于查询的值是 teacher 对象(这个对象是你idea 实体类表中的)

column="tid" 对应数据库中 学生表 的字段

javaType="cn.cvs.pojo.Teacher" 是为了 idea 知道 property="teacher" 是哪个类型(也可以写别名)

后面的select 则代表执行某个 ”id =getTeacher“ 的 select语句,

这时就有人疑惑,为什么 下面的 where id =#{name} 中 这个name可以改变成任何名字 他都不会报错, 但是不能缺少这一句

要明白上面中 column="tid" 是从数据库中得到的数据 然后 执行 select="getTeacher"

也就是下面的语句 其中 #{name} 只是一个占位符 最终占位符会被从数据库的得到数据 column="tid" 给 #{name}

在SQL语句中 如下

SELECT s.id,s.name,t.name FROM student s,teacher t WHERE s.`tid`=t.`id`

执行的结果:

idea中写测试类:

 @Test
    public void test1(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        studentDao mapper = sqlSession.getMapper(studentDao.class);
        List<Student> studentList = mapper.getStudent();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }

结果:

Student(id=1, name=小明, teacher=Teacher(id=1, name=秦老师))
Student(id=2, name=小红, teacher=Teacher(id=1, name=秦老师))
Student(id=3, name=小龙, teacher=Teacher(id=1, name=秦老师))
Student(id=4, name=小绿, teacher=Teacher(id=2, name=李老师))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设我们有两个实体类: ```java public class User { private Integer id; private String username; private Integer age; private List<Order> orders; // 省略getter和setter方法 } public class Order { private Integer id; private String orderNo; private Double amount; // 省略getter和setter方法 } ``` 我们希望查询用户及其所有订单的信息,可以使用ResultMap的Association配置来实现: ```xml <!-- 定义User实体类的ResultMap --> <resultMap id="userResultMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="age" column="age"/> <!-- 配置User实体类关联Order实体类的信息 --> <association property="orders" resultMap="orderResultMap"/> </resultMap> <!-- 定义Order实体类的ResultMap --> <resultMap id="orderResultMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <result property="amount" column="amount"/> </resultMap> <!-- 查询用户及其所有订单的信息 --> <select id="findUserWithOrders" resultMap="userResultMap"> SELECT u.id, u.username, u.age, o.id, o.order_no, o.amount FROM user u LEFT JOIN order o ON u.id = o.user_id WHERE u.id = #{userId} </select> ``` 在User实体类的ResultMap,我们使用了Association配置,将User实体类关联到Order实体类的ResultMap上。这样查询结果,每条记录就会包含一个User实体类和其对应的多个Order实体类,从而实现了一对多的关联查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值