ssm:多表关联查询(一对多,多对一,多对多)

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版权协议,转载请附上原文出处链接和本声明。