Mybatis之高级映射【一对一映射】

深藏阁楼爱情的钟 2022-05-13 11:06 420阅读 0赞

1.一对一映射
两表关联查询。有两种方案:映射文件中输出映射使用resultType或者resultMap。
需求:查询人员信息并关联其部门。
数据库两张表:
人员表:
这里写图片描述
部门表:
这里写图片描述

(1.)使用resultType映射:
a.建立部门表的pojo:

  1. package com.example.data;
  2. public class Dept {
  3. private String id;
  4. private String deptName;
  5. private String parentId;
  6. public String getId() {
  7. return id;
  8. }
  9. public void setId(String id) {
  10. this.id = id;
  11. }
  12. public String getDeptName() {
  13. return deptName;
  14. }
  15. public void setDeptName(String deptName) {
  16. this.deptName = deptName;
  17. }
  18. public String getParentId() {
  19. return parentId;
  20. }
  21. public void setParentId(String parentId) {
  22. this.parentId = parentId;
  23. }
  24. @Override
  25. public String toString() {
  26. return "Dept{" +
  27. "id='" + id + '\'' +
  28. ", deptName='" + deptName + '\'' +
  29. ", parentId='" + parentId + '\'' +
  30. '}';
  31. }
  32. }

b.建立新的pojo类userdept,将人员表user和部门表dept中的属性合并在一起,以便将查询出来的记录映射到该pojo上。
(用到了extends )

  1. package com.example.data;
  2. public class UserDept extends Dept{
  3. private String id;
  4. private String name;
  5. private String sex;
  6. private String age;
  7. private String remark;
  8. public String getId() {
  9. return id;
  10. }
  11. public void setId(String id) {
  12. this.id = id;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public String getSex() {
  21. return sex;
  22. }
  23. public void setSex(String sex) {
  24. this.sex = sex;
  25. }
  26. public String getAge() {
  27. return age;
  28. }
  29. public void setAge(String age) {
  30. this.age = age;
  31. }
  32. public String getRemark() {
  33. return remark;
  34. }
  35. public void setRemark(String remark) {
  36. this.remark = remark;
  37. }
  38. @Override
  39. public String toString() {
  40. return "UserDept{" +
  41. "id='" + id + '\'' +
  42. ", name='" + name + '\'' +
  43. ", sex='" + sex + '\'' +
  44. ", age='" + age + '\'' +
  45. ", remark='" + remark + '\'' +
  46. '}';
  47. }
  48. }

c.编写Mapper.xml:

  1. <!--查询人员信息并关联其部门-->
  2. <!--resultType映射的实体类就是构建的user跟dept的组合类-->
  3. <select id="selectMessage" resultType="com.example.data.UserDept">
  4. <![CDATA[ select * from bank_user,bank_dept where bank_user.dept_id=bank_dept.id ]]>
  5. </select>

d.编写Mapper.java:

  1. //查询人员信息并关联其部门
  2. public List<UserDept> selectMessage()throws Exception;

输出结果日志:
这里写图片描述
(1.)使用resultMap映射:(两种方式)

方式一:嵌套结果
resultMap不需要构造新的pojo,只需将查询出来的记录的值通过resultMap映射到指定到pojo的属性上。
a.建立人员表的pojo:

  1. package com.example.data;
  2. public class User {
  3. private String id;
  4. private String deptId;
  5. private String name;
  6. private String sex;
  7. private String age;
  8. private String remark;
  9. /** * User表中有一个dept_id字段,要在User类中定义一个dept属性, * 用于维护dept和user之间的一对一关系 */
  10. private Dept dept;
  11. public String getId() {
  12. return id;
  13. }
  14. public void setId(String id) {
  15. this.id = id;
  16. }
  17. public String getDeptId() {
  18. return deptId;
  19. }
  20. public void setDeptId(String deptId) {
  21. this.deptId = deptId;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public String getSex() {
  30. return sex;
  31. }
  32. public void setSex(String sex) {
  33. this.sex = sex;
  34. }
  35. public String getAge() {
  36. return age;
  37. }
  38. public void setAge(String age) {
  39. this.age = age;
  40. }
  41. public String getRemark() {
  42. return remark;
  43. }
  44. public void setRemark(String remark) {
  45. this.remark = remark;
  46. }
  47. public Dept getDept() {
  48. return dept;
  49. }
  50. public void setDept(Dept dept) {
  51. this.dept = dept;
  52. }
  53. @Override
  54. public String toString() {
  55. return "User{" +
  56. "id='" + id + '\'' +
  57. ", deptId='" + deptId + '\'' +
  58. ", name='" + name + '\'' +
  59. ", sex='" + sex + '\'' +
  60. ", age='" + age + '\'' +
  61. ", remark='" + remark + '\'' +
  62. ", dept=" + dept +
  63. '}';
  64. }
  65. }

b.编写Mapper.xml:

  1. <select id="selectByResultMap" resultMap="selectRstMap">
  2. <![CDATA[ select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id ]]>
  3. </select>
  4. <!--定义resultmap id:指定查询列中的唯一标识,连接select查询标签内的resultmap。如果多个列组成唯一标识,配置多个id type:返回对象类型。(接口中要定义的对象) id标签:主键标签。 column:查询出的列名(给数据库中的列名定义的别名) property:对应type所指定的java实体类POJO中的属性名 -->
  5. <resultMap type="com.example.data.User" id="selectRstMap">
  6. <id column="id" property="id"/>
  7. <result column="name" property="name"/>
  8. <result column="age" property="age"/>
  9. <result column="sex" property="sex"/>
  10. <!--定义association:一对一映射(将另一张表要查询的信息映射到对象属性传出到一个对象上, 那个对象就拥有要查询的两张表的信息) property:把一对一映射的查询信息封装到对象属性上,封装的对象就是javaType里定义的pojo javaType:property属性的类型 -->
  11. <association property="dept" javaType="com.example.data.Dept">
  12. <id column="id" property="id"/>
  13. <result column="dept_name" property="deptName"/>
  14. </association>
  15. </resultMap>

c.编写Mapper.java:

  1. //resultmap:查询人员信息并关联其部门
  2. public List<User> selectByResultMap();

输出结果日志:
这里写图片描述

方式二:嵌套查询
与方式一不同点在Mapper.xml:

  1. <select id="selectByResultMap" resultMap="selectRstMap">
  2. <![CDATA[ select * from bank_user ,bank_dept where bank_user.dept_id=bank_dept.id ]]>
  3. </select>
  4. <!--定义resultmap-->
  5. <resultMap type="com.example.data.User" id="selectRstMap">
  6. <id column="id" property="id"/>
  7. <result column="name" property="name"/>
  8. <result column="age" property="age"/>
  9. <result column="sex" property="sex"/>
  10. <!--association:一对一映射 column:(dept_id)user表中的字段,用来与dept表关联 select:定义与select标签连接的标识,select元素通过id引用此名字 -->
  11. <association property="dept" column="dept_id" select="getDept"/>
  12. </resultMap>
  13. <!--id:连接association里select定义的名字-->
  14. <select id="getDept" resultType="com.example.data.Dept">
  15. SELECT dept_name name FROM bank_dept WHERE id=#{id}
  16. </select>

输出结果日志:每个id查询一次,最终汇总
这里写图片描述
总结:
resultType:pojo中没有包括查询出来的所以列名,则需要增加列名对应的属性(整合所有要查询的信息封装到对象),完成映射。
resultMap:不需要建立新的pojo,但需要在mapper.xml文件中建立association一对一映射。

高级映射:【一对多映射】 【多对多映射】

发表评论

表情:
评论列表 (有 0 条评论,420人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MyBatis一对一映射

    一对一映射其实就是我们常说的一对一查询。在生活中,到处充斥着一对一、一对多的例子。我们之前说过的那个用户-角色-权限的系统就是一个活生生的案例。当存在比较复杂的对应关系时,我们