SSM学习12:MyBatis多表操作

10 篇文章 0 订阅
9 篇文章 0 订阅

查询

一对多的表关系:一个订单只能对应一个客户,一个客户可以有多个订单,在多的一方做外键,
做一张订单表,里面有个外键为customer.cust_id,
在这里插入图片描述
两张表的关系
在这里插入图片描述
对于存在外键的order表的domain类

private Customer  customer;

在这里插入图片描述
在这里插入图片描述
对于mapping映射,也有下面这种写法,所有字段都需要填上去
在这里插入图片描述
需求:查询所有的订单及订单所对应的客户
左连接:查询左表全部记录,再查询符合条件的右表记录

SELECT * FROM `order` as o LEFT JOIN customer as c on o.cus_id = c.cust_id;

建议使用第二种级联方式(association),因为可以做分步查询
分步查询:
select * fromorderwhere order_id=#{id}
查之后就有字段cust_id

再通过cust_id查找customer的一个字段

select * from `customer` where cust_id=#{cust_id}

步骤:
1 写好sql语句 和 resultMap 在association标签中写好所级联字段的表名与对应的domain类,其中select为对应的查cust_id的方法,column为第一条语句得出来的属于Order表中的字段cust_id
在这里插入图片描述

2.在association中的select属性中,所填方法的参数则为第一条语句查询出来的某一条记录中的cust_id

查询order表中order_id为2的关联客户 根据配置文件,他就会取出order_id为2的记录,再取出里面的cust_id,再去查相关客户
在这里插入图片描述

  • 用association的好处还有可以开启懒加载,就是用到的时候才会去查询customer,否则只是查询order信息

添加

添加客户,之后添加该客户的订单
在这里插入图片描述

在customerMapper.xml中需要用到生成的客户的cust_id作为以后生成订单的外键
useGenerateKeys设置为true,keyColumn为数据库表字段的值,keyProperty为Bean类的值
useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回至keyProperty。
在这里插入图片描述
添加订单
在这里插入图片描述

OneToMany左连接查询订单:
1。定义好实体类
在这里插入图片描述
2,定义方法
在这里插入图片描述
3,配置好OrderMapper,对于包含Customer的集合来说,采用collection标签将其配置好

在这里插入图片描述

一对多分步查询
重点在于collection标签中的select标签
在这里插入图片描述

一对多添加操作
添加一个客户和2个订单,在这里插入图片描述

不过它们没有联系
所以需要在保存订单(insertOrder)时使用useGenerateKeys将order_id返回
在这里插入图片描述
更新关系
在这里插入图片描述
更新order表
在这里插入图片描述
一对多删除客户操作
注意:需要先打破与order的联系,再执行删除操作
interface customerMapper
在这里插入图片描述
interface orderMapper
在这里插入图片描述
orderMapper.xml
将cust_id设置为null
在这里插入图片描述
在这里插入图片描述

多对多表

建立关系
中间表两个字段都是主键,同时也是对应表的外键
在这里插入图片描述
左连接查询
在这里插入图片描述
配置文件编写
在这里插入图片描述
分步查询
1,

public Teacher getTeacherWithId(Integer id);并生成配置文件

<select id="getTeacherWithId" resultMap="teacherMapper2">
    SELECT * FROM `teacher` WHERE teacher_id=#{id};
</select>

2,对于resultMap需要包括老师id,name,包含学生的集合

<resultMap id="teacherMapper2" type="Teacher">
    <id column="teacher_id" property="teacher_id"/>
    <result column="teacher_name" property="teacher_name"/>
    <collection property="students" ofType="Student"
                select="com.nan.mapper.StudentMapper.getStuByTeach"
                column="teacher_id">
    </collection>
</resultMap>

3,而要查到学生集合的话可根据teacher_id,在第二步中已经通过select属性传给com.nan.mapper.StudentMapper.getStuByTeach了

4,编写通过teacher_id在表student中查找记录

public interface StudentMapper {
//根据老师id查询学生
public List<Student> getStuByTeach(Integer id);

}

<select id="getStuByTeach" resultType="com.nan.domain.Student">
    SELECT * FROM `student` where stu_id in(
    SELECT stu_id FROM `stu_teacher_rel` WHERE teacher_id=#{id});
</select>

5,sql语句理解
在这里插入图片描述
多对多添加操作
1,添加2个学生和1个老师

	Teacher teacher = new Teacher();
    teacher.setTeacher_name("姚明");
    Student student1 = new Student();
    student1.setStu_name("学生7");
    Student student2 = new Student();
    student2.setStu_name("学生8");
    teacher.getStudents().add(student1);
    teacher.getStudents().add(student2);

2,保存老师和学生

    teacherMapper.insertTeacher(teacher);
    studentMapper.insertStudent(student1);
    studentMapper.insertStudent(student2);

接口方法的配置文件中需要将保存的记录的主键(stu_id,teacher_id)返回作为添加中间表的依据
在这里插入图片描述
在这里插入图片描述

3,插入关系表(stu_teacher_rel

 for (Student student : teacher.getStudents() ) {
       teacherMapper.insertRelation(student.getStu_id(),teacher.getTeacher_id());
    }

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值