Java-mybatis学习(三)--多对一处理、一对多处理

在我们创建的mybatis数据库新建两个表:

代码:

CREATE TABLE `teacher` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '李老师'); 

CREATE TABLE `student` (
  `id` INT(10) NOT NULL,
  `name` VARCHAR(30) DEFAULT NULL,
  `tid` INT(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fktid` (`tid`),
  CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8


INSERT INTO `student` (`id`, `name`, `tid`) VALUES (1, '王甜甜', 1); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (2, '肖赞赞', 1); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (3, '狗崽崽', 1); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (4, '哈哈', 1); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (5, '菠萝', 1);

刷新数据库
在这里插入图片描述

多对一处理

多个对象对应一个对象

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

<1.项目结构

在这里插入图片描述

<2.实体类

Student

package priv.sehun.pojo;

public class Student {
    private int id;
    private String name;
    private Teacher teacher;

    public Student() {
    }

    public Student(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", teacher=" + teacher +
                '}';
    }
}

Teacher

package priv.sehun.pojo;

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

    public Teacher() {
    }

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

❤️.dao接口
public interface StudentDao {

    //获得所有学生信息以及他们对应的老师名字
    //方式一
    List<Student> getStudentsModeOne();
    //方式二
    List<Student> getStudentsModeTwo();
}
<4.dao接口对应的Mapper映射文件

studentDaoMapper.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对应Mapper接口的类-->
<mapper namespace="priv.sehun.dao.StudentDao">

    <!--方式一-->
    <select id="getStudentsModeOne" resultMap="StudentTeacher">
        select * from mybatis.student
    </select>

    <resultMap id="StudentTeacher" type="priv.sehun.pojo.Student">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <association column="tid" property="teacher" javaType="priv.sehun.pojo.Teacher" select="getTeacher"/>
    </resultMap>

    <select id="getTeacher" resultType="priv.sehun.pojo.Teacher">
        select * from mybatis.teacher where id = #{id}
    </select>


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

    <!--方式二-->
    <select id="getStudentsModeTwo" resultMap="StudentTeacher2">
      select s.id,s.name,t.name as tname from mybatis.student as s, mybatis.teacher as t
      where s.tid = t.id
    </select>

    <!--设置结果集映射ResultMap -->
    <resultMap id="StudentTeacher2" type="priv.sehun.pojo.Student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>

        <!--直接关联一个老师-->
        <association property="teacher" javaType="priv.sehun.pojo.Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>

</mapper>
<5.工具类

MyBatisUtils

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {

        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession(true);
    }
}

<6.在mybatis配置文件中绑定Mapper映射文件

mybatis-config.xml

    <!--关联映射文件-->
    <mappers>
        <mapper resource="priv/sehun/dao/studentDaoMapper.xml"/>
    </mappers>
<7.测试类
public class StudentDaoTest {


    @Test
    public void getStudentsModeOne(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        StudentDao mapper = sqlSession.getMapper(StudentDao.class);

        List<Student> students = mapper.getStudentsModeOne();

        for (Student student : students) {
            System.out.println("学生姓名:"+student.getName()+"    老师姓名:"+student.getTeacher().getName());
        }

    }

    @Test
    public void getStudentsModeTwo(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();

        StudentDao mapper = sqlSession.getMapper(StudentDao.class);

        List<Student> students = mapper.getStudentsModeTwo();

        for (Student student : students) {
            System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());
        }

    }
}

<8.运行结果

方式一:
在这里插入图片描述

一对多处理

一个对象对应多个对象

比如一个老师对应多个学生

<1.项目结构

在这里插入图片描述

<2.实体类

Student

package priv.sehun.pojo;

public class Student {
    private int id;
    private String name;
    private Teacher teacher;

    public Student() {
    }

    public Student(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", teacher=" + teacher +
                '}';
    }
}

Teacher

package priv.sehun.pojo;

import java.util.List;

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

    private List<Student> students;

    public Teacher() {
    }

    public Teacher(int id, String name, List<Student> students) {
        this.id = id;
        this.name = name;
        this.students = students;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", students=" + students +
                '}';
    }
}

❤️.dao接口

TeacherDao

package priv.sehun.dao;

import priv.sehun.pojo.Teacher;

public interface TeacherDao {
    //获得一个老师对应的所有学生信息

    //方式一
    Teacher getTeacherModeOne(int id);

    //方式二
    Teacher getTeacherModeTwo(int id);
}

<4.dao接口对应的Mapper映射文件

teacherDaoMapper.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="priv.sehun.dao.TeacherDao">

    <!--方式一-->
    <select id="getTeacherModeOne" resultMap="TeacherStudent">
        select s.name sname,s.id sid,t.id tid, t.name tname
        from mybatis.student as s,mybatis.teacher as t
        where s.tid = t.id and t.id = #{id}
    </select>
    <resultMap id="TeacherStudent" type="priv.sehun.pojo.Teacher">
        <result property="name" column="tname"/>
        <collection property="students" ofType="priv.sehun.pojo.Student">
            <id property="id" column="sid"/>
            <result property="name" column="sname"/>
        </collection>
    </resultMap>

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

    <!--方式二-->
    <select id="getTeacherModeTwo" resultMap="TeacherStudent2">
        select * from mybatis.teacher where id = #{id}
    </select>
    <resultMap id="TeacherStudent2" type="priv.sehun.pojo.Teacher">
        <collection property="students" javaType="ArrayList" ofType="priv.sehun.pojo.Student" column="id" select="T2"/>
    </resultMap>
    <select id="T2" resultType="priv.sehun.pojo.Student">
        select * from mybatis.student where tid = #{id}
    </select>



</mapper>
<5.工具类

MyBatisUtils

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {

        //在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //设置SqlSessionFactory公共的方法
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
    //获得一个带事务自动提交功能的SqlSession公共的方法
    public static SqlSession getSqlSession(){
        //自动提交事务
        return sqlSessionFactory.openSession(true);
    }
}

<6.在mybatis配置文件中绑定Mapper映射文件
    <!--关联映射文件-->
    <mappers>
        <mapper resource="priv/sehun/dao/teacherDaoMapper.xml"/>
    </mappers>
<7.测试类
public class TeacherDaoTest {
    @Test
    public void getTeacherModeOne(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher = mapper.getTeacherModeOne(1);

        System.out.println(teacher.getName());
        System.out.println(teacher.getStudents());

    }

    @Test
    public void getTeacherModeTwo(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher = mapper.getTeacherModeTwo(1);

        System.out.println(teacher.getName());
        System.out.println(teacher.getStudents());

    }
}

<8.运行结果

方式二:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值