查询
一对多的表关系:一个订单只能对应一个客户,一个客户可以有多个订单,在多的一方做外键,
做一张订单表,里面有个外键为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 * from
orderwhere 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());
}