Mybatis配置文件双向关联出现的问题

今天在配置mybatis的双向关联的时候,遇到了一些问题,现在在这里总结一下:

现在有学生和老师两个实体:

student(N): teacher (1)

数据库的关联:

Supervisor_id表示的是老师的id;是外键

Sql语句:

/*

Navicat MySQL Data Transfer

Source Server : test

Source Server Version : 50528

Source Host : localhost:3306

Source Database : courseman

Target Server Type : MYSQL

Target Server Version : 50528

File Encoding : 65001

Date: 2014-10-30 10:58:45

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for student

-- ----------------------------

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (

`id` int(11) NOT NULL AUTO_INCREMENT ,

`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`major` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`grade` char(4) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`supervisor_id` int(11) NULL DEFAULT NULL ,

PRIMARY KEY (`id`),

FOREIGN KEY (`supervisor_id`) REFERENCES `teacher` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,

INDEX `s_t` (`supervisor_id`) USING BTREE

)

ENGINE=InnoDB

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

AUTO_INCREMENT=22

;

-- ----------------------------

-- Records of student

-- ----------------------------

BEGIN;

INSERT INTO `student` VALUES (‘1‘, ‘陈三勇1‘, ‘男‘, ‘计算机科学技术‘, ‘100‘, ‘2‘), (‘2‘, ‘老白2‘, ‘男‘, ‘计算‘, ‘100‘, ‘2‘), (‘21‘, ‘陈三勇3‘, ‘男‘, ‘科学技术‘, ‘11‘, ‘2‘);

COMMIT;

-- ----------------------------

-- Table structure for teacher

-- ----------------------------

DROP TABLE IF EXISTS `teacher`;

CREATE TABLE `teacher` (

`id` int(11) NOT NULL AUTO_INCREMENT ,

`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`gender` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`research_area` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

`title` varchar(6) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,

PRIMARY KEY (`id`)

)

ENGINE=InnoDB

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci

AUTO_INCREMENT=4

;

-- ----------------------------

-- Records of teacher

-- ----------------------------

BEGIN;

INSERT INTO `teacher` VALUES (‘1‘, ‘老师1‘, ‘男‘, ‘计算器‘, ‘科学‘), (‘2‘, ‘老师2‘, ‘男‘, ‘科学‘, ‘科学‘), (‘3‘, ‘老师3‘, ‘男‘, ‘数学‘, ‘数学‘);

COMMIT;

-- ----------------------------

-- Auto increment value for student

-- ----------------------------

ALTER TABLE `student` AUTO_INCREMENT=22;

-- ----------------------------

-- Auto increment value for teacher

-- ----------------------------

ALTER TABLE `teacher` AUTO_INCREMENT=4;

配置文件:

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8"?>

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

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

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

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

<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 property="supStudent" ofType="com.abc.domian.Student" column="t_oid" select="com.abc.mapper.StudentMapper.getById" resultMap="com.abc.mapper.StudentMapper.StudentResultMap"></collection>

</resultMap>

<select id="findTeacherByPage" resultMap="supervisorResultMap">

select id as t_oid,name as t_name,gender as t_gender,research_area as t_research_area,title as t_title from teacher order by ${sort} ${dir} limit ${start},${limit}

</select>

</mapper>

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!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 type="com.abc.domian.Student" id="StudentResultMap">

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

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

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

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

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

<association property="supervisor" resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap">

</association>

</resultMap>

<select id="getById" parameterType="int" resultMap="StudentResultMap">

select id as s_id,name as s_name,gender as s_gender,major as s_major,grade as s_grade from student where supervisor_id = #{id}

</select>

</mapper>

Student.java

public class Student {

private Integer id;

private String name;

private String gender;

private String major;

private String grade;

//添加教师

private Teacher supervisor;

setter/getter

}

Teacher:

public class Teacher {

private int id;

private String name;

private String gender;

private String researchArea;

private String title;

private List<Student> supStudent;

setter/getter

}

查询方法:该方法主要通过教师查找到学生

@RequestMapping(value="/queryTeacherByPage")

public ModelAndView queryTeacherByPage(){

TeacherMapper teacherMapper = (TeacherMapper) SpringContextUtil.getBean("teacherMapper");

List<Teacher> teachers = teacherMapper.findTeacherByPage("name", "asc", 0, 2);

for(int i = 0 ;i < teachers.size();i++){

Teacher teacher = teachers.get(i);

System.out.println("教师姓名"+" "+teacher.getName());

System.out.println("教师职称"+" "+teacher.getTitle());

System.out.println("指定学生信息"+" "+teacher.getName());

System.out.println("__________________________________");

for(Student s :teacher.getSupStudent()){

System.out.println(

s.getName() + " " + s.getGender() + " " + s.getGrade() + " "+ s.getMajor()

);

}

System.out.println("-----------------------------------------------------");

}

Student s = new Student();

s.setName("123");

return new ModelAndView("/show","student",s);

}

进行debug我们会发现,查出的学生的数据并不是我们想要得到的数据:

查询老师的数据时正确,当我看进行查看学生下面的老师的时候需要主要学生的个数;

当查看老师下面的学生个数的时候,发现,老师1没有学生,但是返回的size却不为0,为什么呢?

在student的配置文件中,我们配置了老师的关联即<association property="supervisor" resultMap="com.abc.mapper.TeacherMapper.supervisorResultMap"></association> 那么Mybatis会自动的去查询老师,并将查询的值复制给supervisor所以查询到的内容,size不为0;

如果我们去掉了上述的配置内容,观察查询出的内容:

这个查询的结果是老师教的学生数据;这样查询的结果才是我们想要的数据;

我们还需要注意一个问题,在关联查询的时候,如果配置文件中的Mapper.xml column配置的内容一样;即

(备注:如果查询到的teacher为空,可能是应该sql语句中起了别名,和resultMap的column不匹配导致的)

根据debug发现老师也被当成了学生,这样会导致查询出现错误,所以在书写Mapper的配置文件的时候,需要注意这个问题;

下载地址:http://pan.baidu.com/s/1gd1lOv5

时间: 2024-10-12 20:24:12

Mybatis配置文件双向关联出现的问题的相关文章

Mybatis双向关联

一.双向关联,以多对多为例,假定一个父母只有一个孩子,那父母和孩子对应关系为1对1,既可以通过父母查询到孩子,也可以通过孩子查询到父母. 二. 1.添加依赖包,参考上篇文章 Mybatis+mysql入门使用 2.初始化数据库和初始数据,以mysql为例 DROP DATABASE IF EXISTS moy_mybatis; CREATE DATABASE moy_mybatis CHARACTER SET UTF8; USE moy_mybatis; DROP TABLE IF EXISTS

mybatis多对一关联

mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可,不要让双方的toString()都输出对方, 这样会形成递归调用,程序会出错,报堆栈溢出. Country实体类 Minsiter 实体类 2.数据库设计 a) country数据库 b) minsiter数据库 3.DAO层设计 4.service层设计 5.impl实现类 6.Controlle

MyBatis 配置文件基本结构

一.MyBatis 配置文件基本结构 在使用mybatis框架时,首先导入其对应的jar包,并进行相应的配置,所以得对配置文件的每个参数都得了解.一个完全的mybatis配置文件结构如下: [html] view plain copy <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/

MyBatis——配置文件

mybatis配置文件 转载:http://loveshisong.cn/mybatis/2015/01/20/MyBatis(%E4%BA%8C)%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.html MyBatis 的配置文件即mybatis-config.xml中的configuration标签下有settings.properties等属性.本文对其中常用属性的配置做简单介绍 本文结构 properties 属性 typeAliases 类型别名 typeHa

Hello Mybatis 03 数据关联

ResultMap 在实际的开发中,数据库不总是我们希望看到的样子.比如我们希望User的主键是id但是数据库偏偏喜欢叫它u_id,这样一来原先的resultType似乎就失效了,不带这么玩的,整个人都不好了. 于是mybatis给出了他的方案--resultMap.把我们从复杂的命名问题中解救出来--- 在上一篇中已经用mybatis generator生成好了一个BlogMapper.xml.现在让我们分析下这个文件. 1 <?xml version="1.0" encodi

Hibernate5-一对多双向关联-左外连接-HQL

1.创建项目,项目名称hibernatedemo18,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体Bean Forum,包名(com.mycompany.demo.bean),如图所示 4.实体Bean Forum的内容如下 package com.mycompany.demo.bean; import java.util.Set; public class Forum { private int fid; private String

Hibernate5-一对多双向关联-迫切左外连接-HQL

1.创建项目,项目名称hibernatedemo19,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体Bean Forum,包名(com.mycompany.demo.bean),如图所示 4.实体Bean Forum的内容如下 package com.mycompany.demo.bean; import java.util.Set; public class Forum { private int fid; private String

MyBatis学习 之 四、MyBatis配置文件

四.MyBatis主配置文件 在定义sqlSessionFactory时需要指定MyBatis主配置文件: Xml代码   <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml&qu

【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)

上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介绍一对一的双向关联映射. 映射原理 双向关联映射与单向关联映射的原理是一