在上一个篇文章中只是简单讲了单表查询或者多表查询到一个对象的情况,下面我们着重讲一下在一个对象中包含其他的一个或者多个对象的情况的查询,也就是在查询中我们所说的一对一关系和一对多关系的查询。
首先一对一关系的查询,是在一个对象中定义另外的一个对象,而一对多关系的查询是在一个对象中定义一个集合。
最后我们会讲一下深度查询。
首先在数据库中创建两张表,如下:
下面创建两个java Bean
package com.mybatis.in; public class ClassRoom { private String roomId; private String roomName; private float area; public String getRoomId() { return roomId; } public void setRoomId(String roomId) { this.roomId = roomId; } public String getRoomName() { return roomName; } public void setRoomName(String roomName) { this.roomName = roomName; } public float getArea() { return area; } public void setArea(float area) { this.area = area; } }
package com.mybatis.in; public class Course { private String courseId; private String courseName; private String courseType; private ClassRoom classRoom; 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; } }
下面创建一个接口
package com.mybatis.in; import java.util.List; public interface CourseMapper { public List<Course> getCourses(); public List<Course> getCoursesClassRoom(); }
下面创建一个映射文件
<resultMap type="ClassRoom" id="classRoom"> <id property="roomId" column="roomId"/> <result property="roomName" column="roomName"/> <result property="area" column="area"/> </resultMap> <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> </resultMap> <!-- configuration for the SQL --> <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 from course c inner join classroom room on c.roomId=room.roomId]]> </select>
我们要对这个配置进行关键的讲解,其中的association配置就起到了映射的作用,相信大家也看的明白,下面我们讲一下association还有其他几种配置方式,
一种就是不要resultMap属性,然后在association中间进行配置,和resultMaper一样的配置方式。association还有两个重要的属性一个javaType,还有一个columnPrefix,对于javaType,就是你可以再javaBean中定义一个抽象的类型,然后在查询的时候决定使用哪一个具体的类型。columnPrefix的作用就是,对于resultMap中所有的column可以再SQL中添加一个prefix达到区分的作用。
<!-- java type mapping --> <typeAliases> <typeAlias alias="Course" type="com.mybatis.in.Course"/> <typeAlias alias="ClassRoom" type="com.mybatis.in.ClassRoom"/> </typeAliases>
最后创建测试代码
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession session = sqlSessionFactory.openSession(); CourseMapper courseMapper =session.getMapper(CourseMapper.class); List<Course> courses = courseMapper.getCoursesClassRoom(); //List<Course> courses = courseMapper.getCourses(); System.out.println(courses.size()); if(courses.size() > 0){ System.out.println(courses.get(0).getClassRoom().getRoomName()); } session.close();
在下一篇中讲解一对多关系,和深度查询。