在查询数据库时,我们经常会遇到多张表联合查询的情况,而Mybatis使连表查询更加简便了,查询出的数据格式非常易于使用,省去了一大部分复杂的代码编写工作,对于关系型数据库来说,数据模型之间通常存在一对多,多对一,多对多三种情况,下面先开始介绍一对多查询。
一、准备工作
1. 新建两张数据表 class_ 表和student表,并添加上数据。
其中一个class_表的记录对应多个student的记录,是一对多关系。
2. 新建对应的Javabean
Student类:
package com.learn.pojo;
public class Student {
private String stu_id;
private String stu_name;
private String stu_major;
public String getStu_id() {
return stu_id;
}
public void setStu_id(String stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public String getStu_major() {
return stu_major;
}
public void setStu_major(String stu_major) {
this.stu_major = stu_major;
}
@Override
public String toString(){
return "Student : [" + stu_id + " " + stu_name + " " + stu_major + "]";
}
}
复制代码
Class_类:
package com.learn.pojo;
import java.util.List;
public class Class_ {
private int class_id;
private String class_name;
private String class_prop;
//保存学生信息
List<Student> students;
public int getClass_id() {
return class_id;
}
public void setClass_id(int class_id) {
this.class_id = class_id;
}
public void setClass_name(String class_name) {
this.class_name = class_name;
}
public String getClass_name() {
return this.class_name;
}
public String getClass_prop() {
return class_prop;
}
public void setClass_prop(String class_prop) {
this.class_prop = class_prop;
}
public List<Student> getStudents() {
return students;
}
@Override
public String toString() {
return "class : [" + class_id + " " + class_name + " " + class_prop + "]";
}
}
复制代码
代码中students变量用来保存查询到的学生信息。
这两个类都重载了toString函数,便于打印信息。
二、sql语句准备
现在假设有一个需求,查询出所有的班级信息以及其对应的所有学生信息。
那么Sql语句应该这样写:
SELECT
c.class_id cid,
c.class_prop cprop,
s.stu_id sid,
s.stu_major smajor,
s.class_id sid,
c.class_name cname,
s.stu_name sname
FROM
class_ c
LEFT JOIN student s ON c.class_id = s.class_id
复制代码
sql语句查询结果:
在查询结果中有三列来自class_表,四列来自student表。
而对于select的resultType来说,直接用Class_是会报错的,mybatis并不能把查询结果直接装入Class_类型的对象,所以在这里就要用到resultMap了。
首先先新建一个叫做class_.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="com.learn.pojo">
<resultMap id="classResult" type="Class_">
<id property="class_id" column="cid"/>
<result column="cname" property="class_name"/>
<result column="cprop" property="class_prop"/>
<collection property="students" ofType="student">
<id column="scid" property="class_id"/>
<result property="stu_id" column="sid"/>
<result column="sname" property="stu_name"/>
<result column="smajor" property="stu_major"/>
</collection>
</resultMap>
<select id="listClass" resultMap="classResult">
select c.class_id cid, c.class_prop cprop, s.stu_id sid, s.stu_major smajor, s.class_id sid, c.class_name cname, s.stu_name sname from class_ c left join student s on c.class_id = s.class_id
</select>
</mapper>
复制代码
在resultMap标签的属性中,id用来标识这种可返回的类型映射,type用来声明这种resultMap的类型。
在resultMap的子标签中有一个collection标签,用来定义返回的查询结果中的student对象的集合,然后对应的select标签中resultType标签改成resultMap就可以了。
三、测试代码:
测试代码很简单,跟之前调用基础的CURD操作一样:
List<Class_> ls = session.selectList("listClass");
for (Class_ c : ls) {
System.out.println(c);
List<Student> ss = c.getStudents();
for (Student s : ss) {
System.out.println("\t"+s);
}
}
复制代码
运行结果: