1.一对多查询:关键点在于collection标签
一对多查询是指在查询一方对象的时候,同时将其所关联的多方对象也都查询出来。
一个班级有多个学生,一个学生只属于一个班级。
数据库student表里有个字段classno是外键,对应主键表class的主键cid
例:查询指定班级时,同时获取该班级的所有学生
关键代码:主配置文件mybatis-config.xml,映射文件ClassesMapper.xml
mybatis-config.xml关键代码
<config>
<!-- 注册属性文件 -->
<properties resource="jdbc.properties"/>
<!-- 配置别名 -->
<typeAliases>
<typeAlias alias="Student" type="com.lifeng.entity.Student"/>
<typeAlias alias="Classes" type="com.lifeng.entity.classes"/>
</typeAliases>
<!-- 配置环境,默认环境id为development -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理器JDBC -->
<transactionManger type="JDBC"/>
<!-- 配置数据源类型为连接池 -->
<datasSource type="POOL">
<!-- 配置数据库连接驱动和连接字符串,从外部属性文件jdbc.properties获取 -->
<property name="driver" value="${jdbc.driver}"/>j
<property name="url" value="${jdbc.username}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</datasSource>
</environment>
</environments>
<!-- 配置映射文件的位置,可以有多个映射文件 -->
<mappers >
<mapper resource="com/lifeng/dao/StudentMapper.xml"/>
<mapper resource="com/lifeng/dao/ClassesMapper.xml"/>
</mappers>
</config>
ClassesMapper.xml关键代码
<mapper namespace="com.lifeng.dao.IClassesDao">
<!-- 配置classes的结果映射 -->
<resultMap id="classesResultMap" type="com.lifeng.entity.Classes">
<id property="cid" column="cid"/>
<result property="canem" column="cname"/>
<!-- 关联属性的映射关系,将student的结果映射关联到classes的结果映射中 -->
<!--
collection标签:体现两个实体对象间的关联关系,类似于sql中设置外键
property="students":指定关联属性,即Class类中的集合属性students
ofType="Student":集合属性的泛型类型,即Student
-->
<collection property="students" ofType="Student">
<id property="sid" column="cid" />
<result property="sname" column="studentname" />
<result property="sex" column="gender" />
<result property="age" column="age" />
</collection>
</resultMap>
<!-- 多表连接查询 -->
<select id="findStudentById" parameterType="String" resultMap="classesResulttMap">
select cid,cname,id,studentname,gender,age from classes,student
where classes.cid=student.classno
and classes.cid=#{cid}
</select>
</mapper>
2.多对一查询:关键点在于association标签
多对一查询是指查询多方对象时,同时将其关联的一方对象也查询出来(本质仍然是一对一)
配置多对一关联的重点在于"多方"的映射文件要有association属性关联"一方"。
例:查询学生信息时,同时获取该学生的班级信息
关键代码:映射文件ClassesMapper.xml
ClassesMapper.xml关键代码
<mapper namespace="com.lifeng.dao.IClassesDao">
<!-- 配置student的结果映射 -->
<resultMap id="studentResultMap" type="com.lifeng.entity.Student">
<id property="sid" column="id"/>
<result property="sname" column="studentname"/>
<result property="sex" column="sex"/>
<result property="age" column="age"/>
<!-- 关联属性的映射关系 -->
<association property="classes" ofType="Classes">
<id property="cid" column="cid"/>
<result property="canem" column="cname"/>
</association>
</resultMap>
<!-- 配置classes的结果映射 -->
<resultMap id="classesResultMap" type="com.lifeng.entity.Classes">
<id property="cid" column="cid"/>
<result property="canem" column="cname"/>
</resultMap>
<!-- 多表连接查询 -->
<select id="searchStudentById" parameterType="int" resultMap="studentResulttMap">
select cid,cname,id,studentname,gender,age
from classes,student
where classes.cid=student.classno
and student.id=#{id}
</select>
</mapper>
3.多对多查询:多对多可以拆分成两个一对多来实现
多对多查询可以拆分为两个一对多来处理,需要一个中间表,各自与中间表实现一对多的关系。
例:查询一个学生信息时,同时查询出他的所有选修课
思路分析:多对多关系需要第三张表来体现,数据库中除了课程表,学生表,还需要学生课程表
关键代码:主配置文件mybatis-config.xml,映射文件ClassesMapper.xml和StudentMapper.xml
mybatis-config.xml关键代码
<config>
<!-- 注册属性文件 -->
<properties resource="jdbc.properties"/>
<!-- 配置别名 -->
<typeAliases>
<typeAlias alias="Student" type="com.lifeng.entity.Student"/>
<typeAlias alias="Classes" type="com.lifeng.entity.Classes"/>
<typeAlias alias="Course" type="com.lifeng.entity.Course"/>
<typeAliases>
<!-- 配置环境,默认环境id为development -->
<environments default="development">
<environment id="development">
<!-- 配置事务管理器JDBC -->
<transactionManger type="JDBC"/>
<!-- 配置数据源类型为连接池 -->
<dataSource type="POOL"/>
<!-- 配置数据库连接驱动和连接字符串,从外部属性文件jdbc.properties获取 -->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</enviroment>
</environments>
<!-- 配置映射文件的位置,可以有多个映射文件 -->
<mappers>
<mapper resource="com/lifeng/dao/StudentMapper.xml"/>
<mapper resource="com/lifeng/dao/ClassesMapper.xml"/>
<mapper resource="com/lifeng/dao/CourseMapper.xml"/>
</mappers>
</config>
StudentMapper.xml关键代码
(一对多:学生表关联课程表属性)
<mapper namespace="com.lifeng.dao.IStudentDao">
<!-- 配置结果映射 -->
<resultMap id=studentResultMap>
<id property="id" column="id"/>
<result property="sname" column="studentname"/>
<result property="sex" column="gender"/>
<result property="age" column="age"/>
<!-- 关联属性的映射关系 -->
<collection property="courses" ofType="Course" >
<id property="courseid" column="courseid"/>
<result property="coursename" column="coursename"/>
</collection>
</resultMap>
<!-- 多表连接查询 -->
<select id="searchStudentById" parameterType="int" resultMap="studentResultMap">
select student.id,studentname,gender,age,course.courseid,coursename
from course,student,studentcourse
where course.courseid=studentcourse.courseid
and student.id=studentcourse.studentcourseid and student.id=#{id}
</select>
</mapper>
CourseMapper.xml关键代码
(一对多:课程表关联学生表属性)
<mapper namespace="com.lifeng.dao.ICourseDao">
<!-- 配置结果映射 -->
<resultMap id=courseResultMap>
<id property="courseid" column="courseid"/>
<result property="coursename" column="coursename"/>
<!-- 关联属性的映射关系 -->
<collection property="students" ofType="Student" >
<id property="id" column="id"/>
<result property="sname" column="studentname"/>
<result property="sex" column="gender"/>
<result property="age" column="age"/>
</collection>
</resultMap>
<!-- 多表连接查询 -->
<select id="searchCourseById" parameterType="int" resultMap="courseResultMap">
select student.id,studentname,gender,age,course.courseid,coursename
from course,student,studentcourse
where course.courseid=studentcourse.courseid
and student.id=studentcourse.studentcourseid and course.courseid=#{id}
</select>
</mapper>
版权声明:本文为weixin_45873215原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。