如何深入理解并高效实现Mybatis中的一对多与多对一查询处理?

2026-04-13 05:162阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计902个文字,预计阅读时间需要4分钟。

如何深入理解并高效实现Mybatis中的一对多与多对一查询处理?

在XML映射文件中,若要表示一个复杂类型的关联关系,可以使用``标签。以下是对该标签的简要说明:

如何深入理解并高效实现Mybatis中的一对多与多对一查询处理?

- 标签功能:``标签用于表示一个复杂类型的关联关系。- 使用场景:当一个实体类包含一个或多个其他实体类的属性时,可以使用``标签。- 嵌套结果映射(resultMap):``标签可以嵌套使用,以实现多层关联映射。- 关联标签:``标签可以包含`resultMap`属性,指向一个结果映射,或者包含对其他结果映射的引用。

示例代码如下:

xml

其中:- `resultMapName` 是当前结果映射的ID。- `ResultType` 是关联对象的类型。- `propertyName` 是当前实体类中指向关联对象的属性名。- `AssociatedType` 是关联对象的类型。- `associatedResultMap` 是嵌套的关联结果映射。

要点

  • 主要还是结果集映射(resultMap)
  • association标签: 一个复杂类型的关联;许多结果将包装成这种类型(JavaBean)嵌套结果映射,关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection标签: 一个复杂类型的集合(List)嵌套结果映射,集合可以是resultMap元素,或是对其它结果映射的引用

一对多(association)

数据库结构

tid是student的外键,是teacher表的id

JavaBean

public class Student { private int id; private String name; private Teacher teacher; } public class Teacher { private int id; private String name; }

mapper.java

public interface StudentMapper { List<Student> getStudent(); List<Student> getStudent2(); }

Student类里面有teacher,要想查出Student中的Teacher就需要映射。

方法有二

(1)

<select id="getStudent" resultMap="StudentTeacher"> select * from mybatis.student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <!--子查询--> <select id="getTeacher" resultType="Teacher"> select * from mybatis.teacher where id=#{Anything} </select>

(2)

<select id="getStudent2" resultMap="StudentTeacher2"> select * from mybatis.student as s ,mybatis.teacher as t where s.tid=t.id </select> <resultMap id="StudentTeacher2" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" javaType="Teacher"> <result property="id" column="tid"/> <result property="name" column="name"/> </association> </resultMap>

多对一

JavaBean

public class Teacher2 { private int id; private String name; //一个老师对应多个学生 private List<Student2> students; } public class Student2 { private int id; private String name; private int tid; }

mapper.java

public interface TeacherMapper2 { List<Teacher2> getTeacher(@Param("id") int id); }

mapper.xml

<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis.DAO.TeacherMapper2"> <select id="getTeacher" parameterType="int" resultMap="teacherS"> select s.id, s.name, s.tid,t.id as tid, t.name as tname from mybatis.student as s ,mybatis.teacher as t where s.tid=t.id and t.id=#{id} </select> <resultMap id="teacherS" type="teacher2"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="students" ofType="student2"> <result property="id" column="id"/> <result property="name" column="name"/> <result property="tid" column="tid"/> </collection> </resultMap> </mapper>

小结

  • 一对多和多对一区别不大
  • 其实就是association(类)和collection(集合)的区别
  • 还有ofType和javaType的区别
  • 如果查询结果不符合预期,请设置别名试一试

到此这篇关于Mybatis一对多与多对一查询处理的文章就介绍到这了,更多相关Mybatis一对多与多对一查询内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

本文共计902个文字,预计阅读时间需要4分钟。

如何深入理解并高效实现Mybatis中的一对多与多对一查询处理?

在XML映射文件中,若要表示一个复杂类型的关联关系,可以使用``标签。以下是对该标签的简要说明:

如何深入理解并高效实现Mybatis中的一对多与多对一查询处理?

- 标签功能:``标签用于表示一个复杂类型的关联关系。- 使用场景:当一个实体类包含一个或多个其他实体类的属性时,可以使用``标签。- 嵌套结果映射(resultMap):``标签可以嵌套使用,以实现多层关联映射。- 关联标签:``标签可以包含`resultMap`属性,指向一个结果映射,或者包含对其他结果映射的引用。

示例代码如下:

xml

其中:- `resultMapName` 是当前结果映射的ID。- `ResultType` 是关联对象的类型。- `propertyName` 是当前实体类中指向关联对象的属性名。- `AssociatedType` 是关联对象的类型。- `associatedResultMap` 是嵌套的关联结果映射。

要点

  • 主要还是结果集映射(resultMap)
  • association标签: 一个复杂类型的关联;许多结果将包装成这种类型(JavaBean)嵌套结果映射,关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection标签: 一个复杂类型的集合(List)嵌套结果映射,集合可以是resultMap元素,或是对其它结果映射的引用

一对多(association)

数据库结构

tid是student的外键,是teacher表的id

JavaBean

public class Student { private int id; private String name; private Teacher teacher; } public class Teacher { private int id; private String name; }

mapper.java

public interface StudentMapper { List<Student> getStudent(); List<Student> getStudent2(); }

Student类里面有teacher,要想查出Student中的Teacher就需要映射。

方法有二

(1)

<select id="getStudent" resultMap="StudentTeacher"> select * from mybatis.student </select> <resultMap id="StudentTeacher" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <!--子查询--> <select id="getTeacher" resultType="Teacher"> select * from mybatis.teacher where id=#{Anything} </select>

(2)

<select id="getStudent2" resultMap="StudentTeacher2"> select * from mybatis.student as s ,mybatis.teacher as t where s.tid=t.id </select> <resultMap id="StudentTeacher2" type="Student"> <result property="id" column="id"/> <result property="name" column="name"/> <association property="teacher" javaType="Teacher"> <result property="id" column="tid"/> <result property="name" column="name"/> </association> </resultMap>

多对一

JavaBean

public class Teacher2 { private int id; private String name; //一个老师对应多个学生 private List<Student2> students; } public class Student2 { private int id; private String name; private int tid; }

mapper.java

public interface TeacherMapper2 { List<Teacher2> getTeacher(@Param("id") int id); }

mapper.xml

<?xml version="1.0" encoding="GBK" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis.DAO.TeacherMapper2"> <select id="getTeacher" parameterType="int" resultMap="teacherS"> select s.id, s.name, s.tid,t.id as tid, t.name as tname from mybatis.student as s ,mybatis.teacher as t where s.tid=t.id and t.id=#{id} </select> <resultMap id="teacherS" type="teacher2"> <result property="id" column="tid"/> <result property="name" column="tname"/> <collection property="students" ofType="student2"> <result property="id" column="id"/> <result property="name" column="name"/> <result property="tid" column="tid"/> </collection> </resultMap> </mapper>

小结

  • 一对多和多对一区别不大
  • 其实就是association(类)和collection(集合)的区别
  • 还有ofType和javaType的区别
  • 如果查询结果不符合预期,请设置别名试一试

到此这篇关于Mybatis一对多与多对一查询处理的文章就介绍到这了,更多相关Mybatis一对多与多对一查询内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!