在这一篇文章中我们讲解Mybatis的一对多查询
在一对多的查询过程中有两种查询方式,
一种是单次查询,也就是一次查询出所有的结果,这种查询的优点就是速度比较快,但是SQL的可复用性就降低;
另一种是嵌套查询,这种查询就是根据主查询的结果进行多次查询,这种查询速度比较低。
下面我们先对第一种进行讲解,
首先创建javaBean
package com.mybatis.in;
public class Student {
private String sId;
private String name;
public String getsId() {
return sId;
}
public void setsId(String sId) {
this.sId = sId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.mybatis.in;
import java.util.List;
public class Course {
private String courseId;
private String courseName;
private String courseType;
private ClassRoom classRoom;
private List<Student> students;
public String getCourseId() {
return courseId;
}
public void setCourseId(String courseId) {
this.courseId = courseId;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCourseType() {
return courseType;
}
public void setCourseType(String courseType) {
this.courseType = courseType;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
public ClassRoom getClassRoom() {
return classRoom;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public List<Student> getStudents() {
return students;
}
}
下面进行配置
<resultMap id="courseClassRoom" type="Course">
<id property="courseId" column="courseId"/>
<result property="courseType" column="courseType"/>
<result property="courseName" column="courseName"/>
<association property="classRoom" resultMap="classRoom"></association>
<collection property="students" ofType="Student" javaType="java.util.ArrayList">
<id property="sId" column="studentId"/>
<result property="name" column="studentName"/>
</collection>
</resultMap>
<select id="getCoursesClassRoom" resultMap="courseClassRoom">
<![CDATA[select c.courseId courseId,c.courseType courseType,c.courseName courseName,
room.roomId roomId,room.roomName roomName,room.area area,student.id sId, student.name studentName
from course c
inner join classroom room
on c.roomId=room.roomId
left join student
on student.courseId = c.courseId]]>
</select>
这样相信大家都看的明白,就不过多赘述。
下面看一下嵌套查询
这个只需要改一下配置文件即可
<!-- one to one and one to many nested query -->
<resultMap id="courseStudentNested" type="Course">
<id property="courseId" column="courseId"/>
<result property="courseType" column="courseType"/>
<result property="courseName" column="courseName"/>
<association property="classRoom" resultMap="classRoom"></association>
<collection property="students" ofType="Student" javaType="java.util.ArrayList"
column="courseId" select="getStudents">
</collection>
</resultMap>
<resultMap type="Student" id="student">
<id property="sId" column="studentId"/>
<result property="name" column="studentName"/>
</resultMap>
<select id="getStudents" parameterType="String" resultMap="student">
<![CDATA[Select student.id sId, student.name studentName from student where courseId=#{id}]]>
</select>
<select id="getCoursesStudentNested" resultMap="courseStudentNested">
<![CDATA[select c.courseId courseId,c.courseType courseType,c.courseName courseName,
room.roomId roomId,room.roomName roomName,room.area area
from course c
inner join classroom room
on c.roomId=room.roomId]]>
</select>
然后在接口中添加一个方法
package com.mybatis.in;
import java.util.List;
public interface CourseMapper {
public List<Course> getCourses();
public List<Course> getCoursesClassRoom();
public List<Course> getCourseStudents();
public List<Course> getCoursesStudentNested();
public List<Student> getStudents(String courseId);
}
这样就可以进行嵌套查询了,这里有一个问题,如果一个对象里面有一个集合,而集合中包含的对象是他自己的时候该怎么样来查询呢??仅仅是吧 connection的select属性改成他自身吗??那么我们下一篇来揭开答案
相关推荐
3. **实体类**:这些类代表了数据库中的表或记录,它们包含了字段(属性)和getter/setter方法。MyBatis可以自动将SQL查询结果映射到这些对象上。 4. **Service层**:这部分代码展示了业务逻辑处理,通常包含...
MyBatis是一款流行的Java持久层框架,它的设计理念是通过简单的XML或注解用于配置和映射原始类型、接口和Java POJOs(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。MyBatis可以与各种数据库交互,...
mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis...
3. **SqlSessionFactory**:这是MyBatis的核心,用于创建SqlSession实例。SqlSessionFactory是线程安全的,可以长期保存,多次重复使用。 4. **SqlSession**:SqlSession代表数据库的一次会话,可以执行SQL命令和...
在MyBatis中,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至关重要的DTD(Document Type Definition)文件,它们定义了MyBatis配置文件和映射文件的结构和规则。 首先,让我们深入了解一下`mybatis-3...
mybatis3 中文手册, 官方版本,mybatis入门必读
mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架...
标题“mybatis-3-mybatis-3.4.3”指的是MyBatis框架的3.4.3版本。这个版本是MyBatis的一个稳定版本,它包含了自3.4.2以来的一系列改进和修复,旨在提高性能、稳定性和用户体验。 描述中提到的“非源码包”,意味着...
mybatis3 jar mybatis3 jar mybatis3 jar
MyBatis 3.x 源码深度解析与最佳实践 MyBatis 是当前最流行的 Java 持久层框架之一,其通过 XML 配置的方式消除了绝大部分 JDBC 重复代码以及参数的设置,结果集的映射。为了更好地学习和理解 MyBatis 背后的设计...
mybatis-3-mapper
在压缩包子文件的文件名称列表中,出现了"mybatis-3-mybatis-3.3.0.zip"和"mybatis-3-mybatis-3.3.0.tar.gz"两个文件,这通常是MyBatis源码的不同压缩格式,分别对应ZIP和GZ压缩。解压这些文件后,开发者可以查看...
然后打开eclipse ->Window->prefenrence->XML->XML Catalog->User Specifiled Entreis->Add->Location(此处是你放dtd文件的位置例如:D:\mybatis\mybatis-3-config.dtd)->Key(如果更改config,此处应该是:-//...
在 Mybatis 中,`mybatis-3-mapper.dtd` 文件扮演着至关重要的角色,它是 Mybatis 映射器接口的定义文件,用于验证 XML 映射文件的语法正确性。 `mybatis-3-mapper.dtd` 文件是基于 DTD(Document Type Definition...
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,...
Mybatis3Demo是一个示例项目,它展示了Mybatis3框架的各种使用方式。Mybatis3是一个优秀的持久层框架,它简化了Java开发中的数据库操作,通过XML或注解方式配置,可以将SQL语句与Java代码紧密集成,提供更加灵活的...
在"lijie_study-mybatis-3-master.zip"这个压缩包中,包含了MyBatis 3项目的源码,这为我们深入理解MyBatis的工作原理提供了宝贵的资料。以下是关于MyBatis核心知识点的详细解析: 1. **配置文件**: - `mybatis-...