Mybatis-多对一处理和一对多处理

多对一处理

多对一的处理方式一

使用数据库的思想处理:联表查询

  1. 定义dao接口
List<Student> getStudents();

编写查询语句

  1. 查询学生信息 id name tid , 由于我们要得到老师的信息,我们需要联表查询
  2. 查询老师的信息 id name
<?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">

<!--namespace不能写别名-->
<mapper namespace="com.kuang.dao.StudentDao">

    <!--遇到问题:学生类中关联老师: 多个学生对应一个老师 -->
    <!--<select id="getStudents" resultType="Student">-->
        <!--select s.id,s.name,t.name from mybatis.student as s,mybatis.teacher as t-->
        <!--where s.tid = t.id-->
    <!--</select>-->

    <!--解决问题方式一:按查询结果嵌套处理,模拟数据库思想;-->
    <select id="getStudents" resultMap="StudentTeacher">
        select * from mybatis.student
    </select>

    <resultMap id="StudentTeacher" type="Student">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--属性和字段对应  , 类和表对应  , 对象和记录
        关联一个字段
        需求:拿到老师这个类的属性
        association : 关联,多对一
            column : 数据库对应的列名
            property : 对应属性名
            javaType : 多对一字段对应的Java类型
            select : 关联一个语句
        -->
        <association column="tid" property="teacher" javaType="Teacher" select="getTeacher"/>
    </resultMap>

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

</mapper>

测试类

 @Test
    public void getStudents(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
        List<Student> students = mapper.getStudents();
        for (Student student : students) {
            System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());
        }
    }

多对一的处理方式二

1.编写接口

List<Student> getStudentsTwo();

2.编写处理的mapper

  1. 查询学生id,学生姓名,老师姓名,需要从学生表和老师表中查询
  2. 学生对应的类进行映射,发现老师一个对象 , 所以关联一个对象;
<!-- 解决方式二:一个resultMap解决 , 模拟面向对象的思想-->
<select id="getStudentsTwo" resultMap="StudentTeacher2">
    select s.id,s.name,t.id as tid,t.name as tname
    from mybatis.student as s, mybatis.teacher as t
    where s.tid = t.id
</select>

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

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

3.测试类

@Test
public void getStudentsTwo(){
    SqlSession sqlSession = MyBatisUtils.getSqlSession();
    StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    List<Student> students = mapper.getStudentsTwo();
    for (Student student : students) {
        System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());
    }
}

总结

  1. mybatis中遇到多对一的情况,要使用关联映射处理:使用association
  2. 两种处理思路:
    1. 数据库思想 : 联表查询
    2. OOP思想 :关联对象

一对多处理

一个老师对应多个学生

一对多的业务:使用collection处理

环境搭建

一个老师对应多个学生

public class Teacher {
    private int id;
    private String name;
    //一个老师对应对个学生
    private List<Student> students;
}

编写dao接口

package com.kuang.dao;
import com.kuang.pojo.Teacher;
public interface TeacherDao {
    //获得一个老师下的所有学生信息; 老师是包含学生的集合;
    Teacher getTeacher(int id);
    Teacher getTeacherTwo(int id);
}

对应mapper文件

<?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">

<mapper namespace="com.kuang.dao.TeacherDao">

    <!--一对多的处理-->
    <!--面向对象方式解决-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select s.name sname,s.id sid, 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="Teacher">
        <result property="id" column="id"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="Student">
            <id property="id" column="sid"/>
            <result property="name" column="sname"/>
        </collection>
    </resultMap>


    <!--数据库思想-->
    <select id="getTeacherTwo" resultMap="TeacherStudent2">
        select * from mybatis.teacher where id = #{id}
    </select>
    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" javaType="ArrayList" ofType="Student" column="id" select="T2"/>
    </resultMap>
    <select id="T2" resultType="Student">
        select * from mybatis.student where tid = #{id}
    </select>

</mapper>

测试类

package com.kuang.dao;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class TeacherDaoTest {
    @Test
    public void getTeacher(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher = mapper.getTeacher(1);
      System.out.println(teacher.getName());
  System.out.println(teacher.getStudents());
    }
    @Test
    public void getTeacherTwo(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
        Teacher teacher = mapper.getTeacherTwo(1);
     System.out.println(teacher.getName());
  System.out.println(teacher.getStudents());
    }
}

总结

多对一:association 关联

一对多:collection 集合

两种解决方式:

  • 面对对象的思想:关联对象
  • SQL语句思想:联表查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值