白癜风的发病原因 http://pf.39.net/bdfyy/bdfzg/161014/4992915.html
单向多对一保存和查询1.看需求,满足单向多对一关系保存操作多个员工对应一个部门

例如:保存一个部门和两个员工,且这两个员工都是这个部门的.

查询需求:根据员工id查询员工,并知道该员工的所在部门

理解:多个员工对应一个部门,该需求已经知道了员工的id,可以先通过第一条SQL找到员工信息,然后调用额外SQL,将第一条SQL查到的dept_id传到额外SQL,并封装到员工对象,然后将员工信息的外链ID也就是连接部门的ID的列,然后再通过外链ID传递到额外SQL(association),额外SQL查询到的数据,封装到部门对象.

2.表的设计

在员工表设计添加外键列dept_id,该外键列存放部门表的主键,表示多对一关联,也就是多个员工的dept_id可以关联同一个部门

3.类的设计

3.1保存需求

在员工类上添加部门类对象,用于在执行保存员工的SQL时,用部门对象.id(#{部门对象.id})的方式添加员工表的外键dept_id关联部门

注意:关联属性是指一个类中添加了另一个自定义类的对象属性(例如:员工类中有一个部门类对象用来做关联)

4.SQL语句

!--添加员工的SQL--!--注意:使用部门对象.id来设置dept_id的值--insertid="save"useGeneratedKeys="true"keyProperty="id"INSERTINTOemployee(name,dept_id)VALUES(#{name},#{department.id})/insert!--添加部门的SQL--!--注意:添加部门时,必须要保存主键信息到部门对象useGeneratedKeys="true"keyProperty="id"--insertid="save"useGeneratedKeys="true"keyProperty="id"INSERTINTOdepartment(name)VALUES(#{name})/insert多对一查询SQL

!--查询需求:根据员工id查询员工,并知道该员工的所在部门--!--解决方式一使用额外SQL--!--查询员工的SQL用resultMap封装数据并执行额外SQL--selectid="get"resultMap="baseresultMap"SELECTid,name,dept_idFROMemployeeWHEREid=#{id}/selectresultMapid="baseresultMap"type="cn.wolfcode.mybatis.domain.Employee"idcolumn="id"property="id"/resultcolumn="name"property="name"/associationproperty="department"column="dept_id"select="cn.wolfcode.mybatis.mapper.DepartmentMapper.get"//resultMap!--查询部门信息的SQL做额外SQL调用--selectid="get"resultType="cn.wolfcode.mybatis.domain.Department"SELECTid,nameFROMdepartmentWHEREid=#{id}/select!--解决方式二使用多表查询--!--适用场景:适用于需要查询多个员工或所有员工,减少mysql的查询次数--selectid="employees"resultMap="selectResultMap"SELECTe.id,e.name,e.dept_id,d.idASd_id,d.nameASd_nameFROMemployeeeJOINdepartmentdONe.dept_id=d.id/selectresultMapid="selectResultMap"type="cn.wolfcode.mybatis.domain.Employee"idcolumn="id"property="id"/resultcolumn="name"property="name"/resultcolumn="dept_id"property="dept_id"/!--这里使用association是为了更好的封装部门信息--associationcolumnPrefix="d_"property="department"javaType="cn.wolfcode.mybatis.domain.Department"resultcolumn="id"property="id"/resultcolumn="name"property="name"//association/resultMapresultMap标签元素的使用

应用场景:通常用于查询语句的数据封装resultMapid="该resultMap的唯一标识"type"类的全限定名或别名"idcolumn="主键列"property="对象上对应的属性"/resultcolumn="其他列"peoperty="对象上对应的属性"/!--association的两种用法--!--第一种额外SQL语句一般使用成单标签的样子association也可以用于集合--associationselect="Mapper命名空间+标签id值"column="上一条SQL查询到的列,传递到本条额外SQL语句做条件查询"peoperty="将额外SQL的结果封装到对象的对应属性"/!--第二种简化封装数据一般用于多对一的多表查询--associationproperty="对象的关联属性(也就是关联的那个类的对象)"javaType="那个类的全限定名"columnPrefix="给标签内的所有column的值都加上前缀"resultcolumn="sql的列名"property="对应存到那个类的属性"//association!--适用于集合类型的属性关联,可以见名知意ofTypeE="写集合元素类型"--colleationselect="Mapper命名空间+标签id值",column="上一条SQL查询到的列,传递到本条额外SQL语句做条件查询"property="将结果集存到对象的集合属性"/resultMap一对多根据需求灵活改动就行多对多的保存/查询/删除1.看需求,满足多对多关系

保存需求

例如:保存两个学生和两个老师,且两个老师都教过这两个学生

2.表的设计

当有多对多关系的两张表在本身的表添加关联都不能满足需求或者不合理时,就可以给这两个表设置中间表来关联两个表的关系,如下:

注意:中间表不能将关联列设置成主键

3.类的设计

保存操作的类设计,让类的字段对应数据库字段即可

3.1多对多查询需求,若需求是根据学生id,查询该学生和教过该学生的老师

在学生类设计就可以加上老师集合,用来存放教过该学生的老师.

4.SQL语句

!--保存操作--!--保存学生并设置存了主键--insertid="save"useGeneratedKeys="true"keyProperty="id"INSERTINTOstudent(name)VALUES(#{name})/insert!--保存老师并设置存了主键--insertid="save"useGeneratedKeys="true"keyProperty="id"INSERTINTOteacher(name)VALUES(#{name})/insert!--将两个的主键信息添加到中间表--insertid="middle"INSERTINTOteacher_student(teacher_id,student_id)VALUES(#{teacher_id},#{student_id})/insert

!--查询操作--!--需求:根据id查询学生,并查询其老师--!--1.在StudentMapper根据id查询学生信息,因为只需要返回一个学生,所以不能在这里使用多表查询,多表查询操作只能交给额外SQL--selectid="selectById"resultMap="baseResultMap"SELECTid,nameFROMstudentWHEREid=#{id}/select!--2.在查询条件中,使用resultMap封装数据,并使用collection执行额外SQL--resultMapid="baseResultMap"type="cn.wolfcode.mybatis.domain.Student"idcolumn="id"property="id"/resultcolumn="name"property="name"/!--使用额外SQL,将上一条查询的数据传到额外SQL作为条件,得到返回的结果集,封装到student的teacher集合--collectionproperty="teachers"column="id"select="cn.wolfcode.mybatis.mapper.TeacherMapper.getById"//resultMap!--3.在teacherMapper中添加查询SQL,用来给额外SQL调用.执行过程:这里使用了多表查询,也就是关联中间表并消除笛卡尔积,然后用studentMapper传递过来的student的id作为条件,查询出所有教过该学生的老师.最后返回了多条数据,额外SQL接收之后,封装到student对象的teacher集合里--selectid="getById"resultType="cn.wolfcode.mybatis.domain.Teacher"SELECTid,nameFROMteachertJOINteacher_studentONt.id=teacher_idWHEREstudent_id=#{student_id}/select删除操作

注意:若表之间设计了外链关联,只能先删除中间表的信息,再删除另一张表的信息删除操作也就是将teacher_student中间表和student表的学生删除即可

有帮助的话,给乐只点个赞吧~

预览时标签不可点收录于话题#个上一篇下一篇


转载请注明地址:http://www.tanhuaa.com/jsth/10918.html