MyBatis之多表联合查询
在这篇文章里面主要讲解如何在mybatis里面使用一对一、一对多、多表联合查询(类似视图)操作的例子。
注:阅读本文前请先大概看一下之前两篇文章。
一、表结构
班级表class,学生表student,班级学生关系表ClassStudent。
这里一个学生只会在一个班级里面,也就是一对一的关系;一个班级有多个学生,也就是一对多的关系。
结构如下:
CREATE TABLE [dbo].[Class](
[class_id] [int] NOT NULL,
[class_name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED
(
[class_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[ClassStudent](
[class_id] [int] NOT NULL,
[student_id] [int] NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Student](
[s_id] [int] NOT NULL,
[s_name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
(
[s_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
3张表的数据如下:
insert into Class values(1,'三(1)班')
insert into Class values(2,'三(2)班')
insert into Class values(3,'三(3)班')
insert into Class values(4,'三(4)班')
insert into Student values(1001,'张三')
insert into Student values(1002,'李四')
insert into Student values(1003,'赵五')
insert into Student values(1004,'王二麻子')
insert into ClassStudent values(1,1001)
insert into ClassStudent values(1,1003)
insert into ClassStudent values(4,1002)
insert into ClassStudent values(3,1004)
二、在原项目下新建一个包com.mybatis.sqljoinrelation,在包里面新建一个sqlMapper.xml的映射文件,在项目的mybatis的配置文件conf.xml中对这个sqlMapper.xml进行注册,注册片段如下:
紧接着在原项目下再新建一个包com.mybatis.bean,在里面新建实体类
学生:
package com.mybatis.bean;
/**
* 学生(临时)
*/
public class StudentTemp {
private int studentid;
private String studentname;
private Class tempClass;
public Class getTempClass() {
return tempClass;
}
public void setTempClass(Class tempClass) {
this.tempClass = tempClass;
}
public int getStudentid() {
return studentid;
}
public void setStudentid(int studentid) {
this.studentid = studentid;
}
public String getStudentname() {
return studentname;
}
public void setStudentname(String studentname) {
this.studentname = studentname;
}
@Override
public String toString() {
return "StudentTemp [studentid=" + studentid + ", studentname="
+ studentname + ", tempClass=" + tempClass + "]";
}
}
班级:
package com.mybatis.bean;
/**
* 班级
*/
public class Class {
private int classid;
private String classname;
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
@Override
public String toString() {
return "Class [classid=" + classid + ", classname=" + classname + "]";
}
}
学生班级视图类:
package com.mybatis.bean;
public class studentclass {
private int s_id;
private String s_name;
private int class_id;
private String class_name;
public int getS_id() {
return s_id;
}
public void setS_id(int s_id) {
this.s_id = s_id;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public int getClass_id() {
return class_id;
}
public void setClass_id(int class_id) {
this.class_id = class_id;
}
public String getClass_name() {
return class_name;
}
public void setClass_name(String class_name) {
this.class_name = class_name;
}
@Override
public String toString() {
return "studentclass [s_id=" + s_id + ", s_name=" + s_name
+ ", class_id=" + class_id + ", class_name=" + class_name + "]";
}
}
三、查询操作
1、 一对一,查询学生编号等于1001且他所在班级信息
2、一对多,查询班级编号等于1且包含所有学生信息
3、类似视图查询学生编号等于1001且他所在班级信息
sqlMapper.xml如下:
测试代码如下:
一对一与类似视图查询的代码在一起,如下:
package com.mybatis.sqljoinrelation;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.mybatis.util.MybatisUtils;
/**
* 一对一
*/
public class testonetoone {
public static void main(String[] args) {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true);
//1、StudentTemp
String statement1 = "com.mybatis.sqljoinrelation.sqlMapper.getStudentAndClass";
System.out.println(session.selectOne(statement1, 1001));
//2、用model类型接收数据
String statement2 = "com.mybatis.sqljoinrelation.sqlMapper.getStudentAndClassView";
System.out.println(session.selectOne(statement2, 1001));
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();
}
}
}
一对多测试代码如下:
package com.mybatis.sqljoinrelation;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.mybatis.util.MybatisUtils;
/**
* 一对多
*/
public class testonetomany {
public static void main(String[] args) {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true);
//1、StudentTemp
String statement = "com.mybatis.sqljoinrelation.sqlMapper.getClassStudents";
System.out.println(session.selectOne(statement, 1));
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();
}
}
}
四、sqlMapper.xml需要说明的问题
1、一对一:
association字面意思关联,这里只专门做一对一关联; property表示是com.mybatis.bean.StudentTemp中的属性名称; javaType表示该属性是什么类型对象
2、类似视图查询: