您的位置:首页 > 其它

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

2018-03-22 21:37 609 查看

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

其实也就是先查询出把两个表结合一块的那种,然后对结果集在进行嵌套

自定义resultMap结果集,然后在这个结果集中再去把另一张表进行关联进去,通过的是两个表的外键的那个列名,最后是把另一张表的那个主键id(这里是teacher),给映射到另一个表的外键id(这里是student的和teacher的外键tid)

然后把这个mapper的xml文件映射给mybatis的全局配置文件中的mapper中

就是直接测试了

<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());
}
}
}


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

先查询student的表,然后在这个返回自定义的resultMap集中再去关联另外一个外键的表(这里指teacher表)

然后通过外键的那个列把两个表给关联起来

再去查询另外一个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语句书写比较简单

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: