一对多,多对一

导读:本篇文章讲解 一对多,多对一,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

列入:一个老师,对应多个学生 ; 对于老师而言: 一个老师有很多学生 【一对多】

表结构
在这里插入图片描述

代码
pojo包下的Student

package com.kuang.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;

    //学生要关联老师;
    private Teacher teacher;

}

Teacher

package com.kuang.pojo;

import lombok.Data;

@Data
public class Teacher {
    private int id;
    private String name;
}

dao 层

StudentMapper

package com.kuang.dao;

import com.kuang.pojo.Student;

import java.util.List;

public interface StudentMapper {
    //多对一的关系:

    //查询学生的所有信息;以及对应的老师的信息
    public List<Student> getStudent();

    public List<Student> getStudent2();

}

TeacherMapper

package com.kuang.dao;

import com.kuang.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface TeacherMapper {

    //一对多的关系
    @Select("select * from teacher where id = #{tid}")
    Teacher getTeacher(@Param("tid") int id);
}

xml层

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--configuration核心配置-->
<mapper namespace="com.kuang.dao.StudentMapper">
    <!--方式一  按照查询嵌套处理 -->
    <!--思路:
            1:查询所有的学生;
            2:根据查询后的tid,寻找他们的老师;  子查询
     -->
        <select id="getStudent" resultMap="StudentTeacher">
            select * from student
        </select>
    
    <resultMap id="StudentTeacher" type="Student">

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

        <!--复杂的属性,要单独处理  association:对象  collection:集合-->
        <!--javaType 用来指定实体类中的属性-->
        <!--ofType用来指定映射到List或者pojo类型,泛型中的约束类型-->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>

    </resultMap>

    <select id="getTeacher" resultType="Teacher">
        select * from teacher where id = #{id}
    </select>


    <!--方式二  按照结果嵌套处理  联表查询-->
    <select id="getStudent2" resultMap="StudentTeacher2">
        select s.id sid,s.name sname,t.name tname
        from student s,teacher t
        where s.tid = t.id;
    </select>
    
    <resultMap id="StudentTeacher2" type="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>

        <!--JavaType用来指定实体类中的属性-->
        <association property="teacher" javaType="Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>




</mapper>

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--configuration核心配置-->
<mapper namespace="com.kuang.dao.TeacherMapper">

</mapper>

绑定Mapper接口

    <!--绑定接口-->
    <mappers>
        <mapper class="com.kuang.dao.TeacherMapper"/>
        <mapper class="com.kuang.dao.StudentMapper"/>
    </mappers>

测试

package com.kuang.dao;

import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {

    @Test
    public void getTeacher(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);

        sqlSession.close();
    }

    //多对一
    @Test
    public void getStudent(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> student = mapper.getStudent();
        for (Student student1 : student) {
            System.out.println(student1);
        }

        sqlSession.close();
    }
    @Test

    //多对一的方式二
    public void getStudent2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> student2 = mapper.getStudent2();
        for (Student student : student2) {
            System.out.println(student);
        }
        sqlSession.close();
    }
}

多对一:多个学生对应一个老师

表结构
在这里插入图片描述
pojo包下的Student

package com.kuang.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;

    //学生要关联一个老师;
    private int tid;

}

Teacher

package com.kuang.pojo;

import lombok.Data;

import java.util.List;

@Data
public class Teacher {
    private int id;
    private String name;

    //一个老师对应多个学生;
    private List<Student> students;


}

dao层

StudentMapper

package com.kuang.dao;

import com.kuang.pojo.Student;

import java.util.List;

public interface StudentMapper {

}

TeacherMapper

package com.kuang.dao;

import com.kuang.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface TeacherMapper {

    //获取老师;
//    List<Teacher> getTeacher();

    //获取指定老师下的所有的学生及老师的信息;
    Teacher getTeacher(@Param("id") int id);
    Teacher getTeacher2(@Param("id") int id);
}

xml层

StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--configuration核心配置-->
<mapper namespace="com.kuang.dao.StudentMapper">

</mapper>

TeacherMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!--configuration核心配置-->
<mapper namespace="com.kuang.dao.TeacherMapper">

    <!--按照结果嵌套处理-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select s.id sid,s.name sname,t.name tname,t.id tid
        from student s,teacher t
        where s.tid = t.id
    </select>
    
    <resultMap id="TeacherStudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>

        <!--复杂的属性,要单独处理  association:对象  collection:集合
            javaType=""指定属性的类型;
            集合中的泛型信息,我们使用ofType获取
        -->
        
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

    <!--==================================-->


    <!--按照查询嵌套处理-->
    <select id="getTeacher2" resultMap="TeacherStudent2">
        select * from mybatis.teacher where id = #{id}
    </select>
    
    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
    </resultMap>
    
    <select id="getStudentByTeacherId"  resultType="Student">
        select * from mybatis.student where tid = #{tid}
    </select>


</mapper>

绑定接口

 <!--绑定接口-->
    <mappers>
        <mapper class="com.kuang.dao.TeacherMapper"/>
        <mapper class="com.kuang.dao.StudentMapper"/>
    </mappers>

测试

package com.kuang.dao;

import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class MyTest {

    @Test
    public void test(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);
/**
 * Teacher
 * (id=1,
 * name=小韩老师,
 * students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])
 */

        sqlSession.close();
    }

    @Test
    public void getTeacher2(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher2 = mapper.getTeacher2(1);
        System.out.println(teacher2);

        sqlSession.close();
    }


}

小结

1:关联 association【多对一】
2:集合 collection【一对多】
3:javaType 和 ofType

JavaType用来指定实体类中的属性;
ofType用来指定映射到List或者集合中pojo类型,泛型中的约束类型

注意点;

  • 保证SQL的可读性,尽量通俗易懂;
  • 注意一对多和多对一,属性名和字段的问题;
  • 如果问题不好排查错误,可以使用日志,建议使用Log4j;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/71796.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!