Mybatis 一对多和多对一查询处理

1,691 阅读1分钟

要点

  • 主要还是结果集映射(resultMap)
  • association标签: 一个复杂类型的关联;许多结果将包装成这种类型(JavaBean)嵌套结果映射,关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection标签: 一个复杂类型的集合(List)嵌套结果映射,集合可以是resultMap元素,或是对其它结果映射的引用

一对多(association)

  • 数据库结构

tid是student的外键,是teacher表的id

  • JavaBean
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}
public class Teacher {
    private int id;
    private String name;
}
  • mapper.java
public interface StudentMapper {
    List<Student> getStudent();
    List<Student> getStudent2();
}
  • Student类里面有teacher,要想查出Student中的Teacher就需要映射。 方法有二
    (1)
<select id="getStudent" resultMap="StudentTeacher">
        select * from mybatis.student
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
                <!--子查询-->
    <select id="getTeacher" resultType="Teacher">
         select * from mybatis.teacher where id=#{Anything}
    </select>

(2)

<select id="getStudent2" resultMap="StudentTeacher2">
        select  * from mybatis.student as s ,mybatis.teacher as t where s.tid=t.id
    </select>
    <resultMap id="StudentTeacher2" type="Student">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <association property="teacher" javaType="Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="name"/>
        </association>
    </resultMap>

多对一

  • JavaBean
public class Teacher2 {
    private int id;
    private String name;
    //一个老师对应多个学生
    private List<Student2> students;
}
public class Student2 {
    private int id;
    private String name;
    private int tid;
}
  • mapper.java
public interface TeacherMapper2 {
    List<Teacher2> getTeacher(@Param("id") int id);
}
  • mapper.xml
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mybatis.DAO.TeacherMapper2">
    <select id="getTeacher" parameterType="int" resultMap="teacherS">
        select s.id, s.name, s.tid,t.id as tid, t.name as tname from mybatis.student as s ,mybatis.teacher as t where s.tid=t.id and t.id=#{id}
    </select>
    <resultMap id="teacherS" type="teacher2">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="student2">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
</mapper>

小结

  • 一对多和多对一区别不大
  • 其实就是association(类)和collection(集合)的区别
  • 还有ofType和javaType的区别
  • 如果查询结果不符合预期,请设置别名试一试