Mybatis中多对一查询的两种方式

第一种是按照结果嵌套查询

  1. 其实也就是先查询出把两个表结合一块的那种,然后对结果集在进行嵌套
  2. 自定义resultMap结果集,然后在这个结果集中再去把另一张表进行关联进去,通过的是两个表的外键的那个列名,最后是把另一张表的那个主键id(这里是teacher),给映射到另一个表的外键id(这里是student的和teacher的外键tid)
  3. 然后把这个mapper的xml文件映射给mybatis的全局配置文件中的mapper中
  4. 就是直接测试了
 <select id="getStudent" resultMap="StudentTeacher">
        SELECT s.id sid , s.name sname ,s.tid stid , t.id tid, t.name tname
                  FROM student s ,teacher t  WHERE  s.tid=t.id
    </select>
        <!--这个id就是能找到是你哪个SQL语句的resultType的值,而type就是你最终想得到的结果的映射类型-->
        <resultMap id="StudentTeacher" type="Student">
            <!--这个id就是自己定义的列名-->
            <id     column="sid" property="id"/>
            <result column="sname" property="name"/>
            <!--关联对象-->
            <association property="teacher" javaType="Teacher">
                <id     column="tid" property="id"/>
                <result column="tname" property="name"/>
            </association>
        </resultMap>

测试主函数

package test;

import beans.Student;
import dao.StudentDao;

import java.io.IOException;
import java.util.List;

public class TestOneToMany {


    public static void main(String[] args) throws IOException {

        StudentDao studentDao = new StudentDao();
        List<Student> list = studentDao.getAll();
        for (Student student : list) {
            System.out.println("学生的姓名是>>>>"+student.getName()+"学生的老师的姓名>>>>"
                    +student.getTeacher().getName());
        }
    }
}

第二种就是 按结果查询处理

  1. 先查询student的表,然后在这个返回自定义的resultMap集中再去关联另外一个外键的表(这里指teacher表)
  2. 然后通过外键的那个列把两个表给关联起来
  3. 再去查询另外一个teacher表(可以新建一个mapper的xml配置文件)
 <!--这个是按查询的嵌套进行处理的-->
    <select id="getStudent" resultMap="StudentTeacher">
        SELECT * FROM user
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <!--然后这个关联的是另外一个查询另一张的teacher的表,也就是说需要建两个mapper的SQL语句的xml文件-->
        <association property="teacher" column="tid"
                     javaType="Teacher" select="TeacherMapper.getTeacher">
        </association>
    </resultMap>
    <!--这个就是查询另一张teacher的表的映射SQL(下面这个映射如果想更加规范的话也可以放在另外一个mapper的xml中去)-->
    <!--<select id="getTeacher" resultType="Teacher">
        SELECT * FROM teacher WHERE id = #{id}
    </select>-->

这个测试的文件和上一个一样

总结:用第一种的话思路会比较清晰,但是在书写SQL语句的话会比较麻烦些,第二种的话逻辑有点多,但是SQL语句书写比较简单

猜你喜欢

转载自blog.csdn.net/qq_36520235/article/details/79660371
今日推荐