zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【一句日历】2020年4月
    【2020-03-31】思维永远只有一种
    【2020-03-30】事情就怕太容易而看不起
    【2020-03-29】人生有趣的地方在于不断升级自己
    【2020-03-27】球场还在,换了地方而已
    【2020-03-26】人其实是一个系统
    【2020-03-25】没工作是个伪命题
    day 74 vue 2 axios数据请求 以及组件的学习
    day 73 初学vue (1)
    day 72 crm(9) 客户关系系统,整体实现,以及自定制路由内容,客户关系梳理
  • 原文地址:https://www.cnblogs.com/babyhhcsy/p/4062208.html
Copyright © 2011-2022 走看看