0
点赞
收藏
分享

微信扫一扫

MyBatis 一对多双向关联查询


用一个查询教师,同时查询教师名下多名同学的例子来介绍:

一、为Teacher实体增加相关属性

      为教师实体增加指导学生集合的属性如下:

​​private​​         ​​List<Student> supStudents;​​        ​​//指导学生​​


       并为其增加setter和getter方法,这里略过。

二、TeacherMapper接口

      为实现教师实体映射,应先创建映射器接口如下:

​​package​​         ​​com.abc.mapper;​​       


​​import​​ ​​com.abc.domain.Teacher;​​


​​public​​ ​​interface​​ ​​TeacherMapper {​​


​​public​​ ​​Teacher getById(​​ ​​int​​ ​​id);​​


​​}​​


三、映射文件

      为教师实体创建的映射文件如下:

<?​​        ​​xml​​         ​​version​​        ​​=​​        ​​"1.0"​​         ​​encoding​​        ​​=​​        ​​"utf8"​​        ​​?>​​       


​​<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">​​


​​<!--与以前一样,namespace的值是对应的映射器接口的完整名称-->​​


​​<​​ ​​mapper​​ ​​namespace​​ ​​=​​ ​​"com.abc.mapper.TeacherMapper"​​ ​​>​​


​​<!--TeacherMapper接口中getById方法对应的SQL语句。​​


​​查询教师及其指导的学生的信息。由于教师、学生都有​​


​​id、name、gender等属性,因此给教师的字段都起了别名-->​​


​​<​​ ​​select​​ ​​id​​ ​​=​​ ​​"getById"​​ ​​parameterType​​ ​​=​​ ​​"int"​​ ​​resultMap​​ ​​=​​ ​​"supervisorResultMap"​​ ​​>​​


​​select t.id t_id, t.name t_name, t.gender t_gender,​​


​​t.research_area t_research_area, t.title t_title,​​


​​s.id,s.name, s.gender,s.major,s.grade​​


​​from teacher t,student s where t.id=#{id}​​


​​and s.supervisor_id = t.id​​


​​</​​ ​​select​​ ​​>​​


​​<!--教师实体映射-->​​


​​<​​ ​​resultMap​​ ​​id​​ ​​=​​ ​​"supervisorResultMap"​​ ​​type​​ ​​=​​ ​​"Teacher"​​ ​​>​​


​​<​​ ​​id​​ ​​property​​ ​​=​​ ​​"id"​​ ​​column​​ ​​=​​ ​​"t_id"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"name"​​ ​​column​​ ​​=​​ ​​"t_name"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"gender"​​ ​​column​​ ​​=​​ ​​"t_gender"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"researchArea"​​ ​​column​​ ​​=​​ ​​"t_research_area"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"title"​​ ​​column​​ ​​=​​ ​​"t_title"​​ ​​/>​​


​​<!--collection元素映射教师的指导学生集合的属性。resultMap​​


​​以命名空间名.resultMap的id的形式,引用studentResultMap。​​


​​需要注意的是,上面的select语句中学生的字段名/别名应与​​


​​studentResultMap中的column属性一致-->​​


​​<​​ ​​collection​​ ​​property​​ ​​=​​ ​​"supStudents"​​


​​resultMap​​ ​​=​​ ​​"com.abc.mapper.StudentMapper.studentResultMap"​​ ​​/>​​


​​</​​ ​​resultMap​​ ​​>​​


​​</​​ ​​mapper​​ ​​>​​


       相应地,学生实体的映射文件如下:

<?​​        ​​xml​​         ​​version​​        ​​=​​        ​​"1.0"​​         ​​encoding​​        ​​=​​        ​​"utf8"​​        ​​?>​​       


​​<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">​​


​​<​​ ​​mapper​​ ​​namespace​​ ​​=​​ ​​"com.abc.mapper.StudentMapper"​​ ​​>​​


​​<​​ ​​resultMap​​ ​​id​​ ​​=​​ ​​"studentResultMap"​​ ​​type​​ ​​=​​ ​​"Student"​​ ​​>​​


​​<​​ ​​id​​ ​​property​​ ​​=​​ ​​"id"​​ ​​column​​ ​​=​​ ​​"id"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"name"​​ ​​column​​ ​​=​​ ​​"name"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"gender"​​ ​​column​​ ​​=​​ ​​"gender"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"major"​​ ​​column​​ ​​=​​ ​​"major"​​ ​​/>​​


​​<​​ ​​result​​ ​​property​​ ​​=​​ ​​"grade"​​ ​​column​​ ​​=​​ ​​"grade"​​ ​​/>​​


​​<!--相应地,在此引用supervisorResultMap,亦采用​​


​​命名空间名.resultMap的id的形式。-->​​


​​<​​ ​​association​​ ​​property​​ ​​=​​ ​​"supervisor"​​


​​resultMap​​ ​​=​​ ​​"com.abc.mapper.TeacherMapper.supervisorResultMap"​​ ​​/>​​


​​</​​ ​​resultMap​​ ​​>​​


​​</​​ ​​mapper​​ ​​>​​



四、通过spring注解的方式

<!-- mapper自动扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="ysSqlSessionFactory" />
<property name="basePackage" value="com.abc.mapper" />
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
</bean>

举报

相关推荐

0 条评论