银行门户网站建设方案,公司刚成立网站怎么做,大型网站建设制作,头条广告入口✅作者简介#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者#xff0c;修心和技术同步精进。 #x1f34e;个人主页#xff1a;Java Fans的博客 #x1f34a;个人信条#xff1a;不迁怒#xff0c;不贰过。小知识#xff0c;大智慧。 #x1f49e;当前专栏… ✅作者简介2022年博客新星 第八。热爱国学的Java后端开发者修心和技术同步精进。 个人主页Java Fans的博客 个人信条不迁怒不贰过。小知识大智慧。 当前专栏SSM 框架从入门到精通 ✨特色专栏国学周更-心性养成之路 本文内容MyBatis 多表关联查询 文章目录一对多查询多对一查询自连接查询使用多对一的方式实现自连接使用一对多的方式实现自连接多对多查询一对多查询
一对多关联查询是指在查询一方对象的时候同时将其所关联的多方对象也都查询出来。下面以班级 Classes 与学生 Student 间的一对多关系为例进行演示。一个班级有多个学生一个学生只属于一个班级。数据库 student 表里面有个字段 classno 是外键对应主键表 Class 的主键 cid。
项目案例查询班级号为 1801 的班级同时遍历该班级的所有的学生信息
实现步骤
【1】在 MySQL 中创建数据库 studentdb创建表 student 和classes并添加若干测试用的数据记录SQL 语句如下
CREATE DATABASE studentdb;
USE studentdb ;
DROP TABLE IF EXISTS student ;
CREATE TABLE student (id INT(11) NOT NULL,studentname VARCHAR(20) DEFAULT NULL,gender CHAR(2) DEFAULT NULL,age INT(11) DEFAULT NULL,classno VARCHAR(10),PRIMARY KEY ( id )
)
INSERT INTO student ( id , studentname , gender , age , classno ) VALUES (1,张飞,男,18,201801),(2,李白,男,20,201801),(3,张无忌,男,19,201801),(4,赵敏,女,17,201801);CREATE TABLE classes (cid VARCHAR (30),cname VARCHAR (60)
);
INSERT INTO classes (cid, cname) VALUES(201801,计算机软件1班);
INSERT INTO classes (cid, cname) VALUES(201802,计算机软件2班);【2】创建实体类 Classes 和 Student 类
Student 类如下
package cn.kgc.my01.entity;import lombok.Data;Data
public class Student {private String sid;private String sname;private String sex;private Integer age;//添加额外属性所在班级private Classes classes;public String show(){return 学生编号getSid(),学生姓名getSname(),学生性别getSex(),学生年龄getAge();}
}Classes 类如下
package cn.kgc.my01.entity;import lombok.Data;import java.util.List;Data
public class Classes {private String cid;private String cname;//添加额外属性private ListStudent students;public String show(){return 班级编号getCid(),班级名称getCname(),班级学生;}
}
【3】创建 ClassesMapper.java 接口并添加 findClassesById 方法
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Classes;public interface ClassesMapper {Classes findClassesById(String id);
}
【4】创建 ClassesMapper.xml 映射文件有以下两种方式
方式一多表连接查询方式。
这种方式只用到1条 SQL 语句代码如下所示
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecn.kgc.my01.mapper.ClassesMapper!--方式一多表连接查询方式只用到 1条SQL语句--resultMap idclassResultMap typeclassesid propertycid columncid/result propertycname columncname/!--关联属性的映射关系--collection propertystudents ofTypeStudentid propertysid columnid/result propertysname columnstudentname/result propertysex columngender/result propertyage columnage//collection/resultMapselect idfindClassesById resultMapclassResultMapselect cid,cname,id,studentname,gender,age from classes,studentwhere classes.cidstudent.classno and classes.cid#{cid}/select
/mapper注意 在 resultMap/ 中如果字段名与属性名相同时可以在 resultMap/ 中添加 autoMapping“true” 来开启自动映射。
另外在 “一方” 的映射文件中使用 collection/ 标签体现出两个实体对象间的关联关系。其两个属性的解释如下
property指定关联属性即 Class 类中的集合属性 students。ofType集合属性的泛型类型即 Student。
方式二多表单独查询方式。
多表连接查询方式是将多张表进行连接连为一张表后进行查询。其查询的本质是一张表。而多表单独查询方式是多张表各自查询各自的相关内容需要多张表的联合数据再将主表的查询结果联合其它表的查询结果封装为一个对象。
多个查询是可以跨越多个映射文件的即是可以跨越多个namespace 的。在使用其它 namespace 的查询时添加上其所在的 namespace 即可。这种方式要用到2条 SQL 语句代码如下所示
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecn.kgc.my01.mapper.ClassesMapper!--方式二多表单独查询方式也就是分步查询--resultMap idclassResultMap2 typeclassesid propertycid columncid/result propertycname columncname/!--关联属性的映射关系--collection propertystudents ofTypeStudentid propertysid columnid/result propertysname columnstudentname/result propertysex columngender/result propertyage columnage//collection/resultMap!-- 以下注释部分属于方式二: 多表单独查询方式 --resultMap idstudentResultMap typestudentid propertysid columnid /result propertysname columnstudentname /result propertysex columngender /result propertyage columnage //resultMapresultMap idclassesResultMap typeclassesid propertycid columncid /result propertycname columncname /!-- 关联属性的映射关系 --!-- 集合的数据来自指定的select查询,该select查询的动态参数来自column指定的字段值 --collection propertystudents ofTypeStudent selectselectStudentsByClasses columncid//resultMap!-- 多表单独查询,查多方的表 --select idselectStudentsByClasses resultMapstudentResultMapselect * from student where calssno#{cid}/select!-- 多表单独查询,查一方的表 --select idfindClassesById parameterTypeString resultMapclassesResultMapselect cid,cname from classeswhere cid#{cid}/select
/mapper【5】创建 ClassesMapperTest 测试类并添加如下方法
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Classes;
import cn.kgc.my01.entity.Student;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class ClassesMapperTest{SqlSessionFactory factorynull;Beforepublic void init(){try {System.out.println(########);InputStream resourceAsStream Resources.getResourceAsStream(config/mybatis-config.xml);factory new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}Testpublic void testFindClassesById() {SqlSession sqlSession factory.openSession(true);ClassesMapper mapper sqlSession.getMapper(ClassesMapper.class);Classes classesById mapper.findClassesById(201801);System.out.println(classesById.show());ListStudent students classesById.getStudents();for (Student student : students) {System.out.println(student.show());}}
}方式一多表连接查询方式测试结果
DEBUG [main] - Preparing: select cid,cname,id,studentname,gender,age from classes,student where classes.cidstudent.classno and classes.cid?
DEBUG [main] - Parameters: 201801(String)
DEBUG [main] - Total: 4
班级编号201801,班级名称计算机软件1班,班级学生
学生编号1,学生姓名张飞,学生性别男,学生年龄18
学生编号2,学生姓名李白,学生性别男,学生年龄20
学生编号3,学生姓名张无忌,学生性别男,学生年龄19
学生编号4,学生姓名赵敏,学生性别女,学生年龄17可以发现只有一条 SQL 语句并且是多表联查。
方式二多表单独查询方式测试结果
2023-02-15 10:56:49,965 [main] DEBUG DEBUG [main] - Preparing: select cid,cname from classes where cid?
DEBUG [main] - Parameters: 201801(String)
DEBUG [main] - Preparing: select * from student where classno?
DEBUG [main] - Parameters: 201801(String)
DEBUG [main] - Total: 4
DEBUG [main] - Total: 1
班级编号201801,班级名称计算机软件1班,班级学生
学生编号1,学生姓名张飞,学生性别男,学生年龄18
学生编号2,学生姓名李白,学生性别男,学生年龄20
学生编号3,学生姓名张无忌,学生性别男,学生年龄19
学生编号4,学生姓名赵敏,学生性别女,学生年龄17可以发现其 SQL 语句是两条即各查各的共用同一个参数。第 1 条先查一方的表第 2 条再查多方的表。
多对一查询
多对一关联查询是指在查询多方对象的时候同时将其所关联的一方对象也查询出来。
由于在查询多方对象时也是一个一个查询所以多对一关联查询其实就是一对一关联查询。即一对一关联查询的实现方式与多对一的实现方式是相同的。 配置多对一关联的重点在于“多方”的映射文件要有 association 属性关联“一方”。
项目案例: 查询学号为1的学生同时获取他所在班级的完整信息
实现步骤
【1】创建 StudentMapper.java 接口并添加方法 searchStudentsById(int id) 如下
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Student;public interface StudentMapper {public Student searchStudentsById(int id);
}
【2】创建 StudentMapper.xml 映射文件有以下两种方式
方式一多表联合查询。 !-- 多表联合查询 --resultMap idstudentResultMapper typestudentid propertysid columnid /result propertysname columnstudentname /result propertysex columngender /result propertyage columnage /!-- 关联属性 --association propertyclasses javaTypeclassesid propertycid columncid /result propertycname columncname //association/resultMap!-- 多表连接查询 --select idsearchStudentsById parameterTypeint resultMapstudentResultMapperselect cid,cname,id,studentname,gender,age from classes,studentwhere classes.cidstudent.classnoand student.id#{id}/select方式二多表单独查询。 !-- 以下注释的是方式二多表单独查询 --resultMap idstudentResultMap2 typestudentid propertysid columnid /result propertysname columnstudentname /result propertysex columngender /result propertyage columnage / !-- 关联属性 --association propertyclasses javaTypeclasses selectfindClassesById columnclassno//resultMapselect idsearchStudentsById resultMapstudentResultMap2select id,studentname,gender,age,classno from student where id#{id}/selectselect idfindClassesById parameterTypeString resultTypeclassesselect cid,cname from classes where cid#{cid}/select 【3】创建 StudentMapperTest 测试类并添加如下方法
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Classes;
import cn.kgc.my01.entity.Student;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;public class StudentMapperTest {SqlSessionFactory factorynull;Beforepublic void init(){try {InputStream resourceAsStream Resources.getResourceAsStream(config/mybatis-config.xml);factory new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}Testpublic void testSearchStudentsById() {SqlSession sqlSession factory.openSession(true);StudentMapper mapper sqlSession.getMapper(StudentMapper.class);Student student mapper.searchStudentsById(1);System.out.println(student.show());System.out.println(所在班级:);Classes classesstudent.getClasses();System.out.println(classes.toString());}
}方式一多表联合查询方式测试结果
DEBUG [main] - Preparing: select cid,cname,id,studentname,gender,age from classes,student where classes.cidstudent.classno and student.id?
DEBUG [main] - Parameters: 1(Integer)
DEBUG [main] - Total: 1
学生编号1,学生姓名张飞,学生性别男,学生年龄18
所在班级:
Classes(cid201801, cname计算机软件1班, studentsnull)可以发现它发出的 SQL 语句是多表查询。
方式一多表单独查询方式测试结果
DEBUG [main] - Preparing: select id,studentname,gender,age,classno from student where id?
DEBUG [main] - Parameters: 1(Integer)
DEBUG [main] - Preparing: select cid,cname from classes where cid?
DEBUG [main] - Parameters: 201801(String)
DEBUG [main] - Total: 1
DEBUG [main] - Total: 1
学生编号1,学生姓名张飞,学生性别男,学生年龄18
所在班级:
Classes(cid201801, cname计算机软件1班, studentsnull)可以发现它发出的 SQL 语句是两条即各查各的共用同一个参数。
自连接查询
自连接的查询可以用一对多来处理也可以用多对一来处理。例如员工表每个员工都有一个上司但上司同时也是员工表的一条记录这种情况可用自连接查询出每个员工对应的上司信息也可以查出每个上司有哪些下属员工。
使用多对一的方式实现自连接
项目案例查询员工的信息及对应的上司信息。
思路分析 可将员工当做多方上司当做一方。
实现步骤
【1】修改数据库。
添加一个表 employee 并插入测试数据具体如下
create table employee (empid double ,empname varchar (60),job varchar (60),leader double
);
insert into employee (empid, empname, job, leader) values(1,jack,clerk,3);
insert into employee (empid, empname, job, leader) values(2,mike,salesman,3);
insert into employee (empid, empname, job, leader) values(3,john,manager,4);
insert into employee (empid, empname, job, leader) values(4,smith,president,NULL);
insert into employee (empid, empname, job, leader) values(5,rose,salesman,3);
【2】创建实体类 Employee代码如下
package cn.kgc.my01.entity;public class Employee {private int empid;private String empname;private String job;private Employee leader;public int getEmpid() {return empid;}public void setEmpid(int empid) {this.empid empid;}public String getEmpname() {return empname;}public void setEmpname(String empname) {this.empname empname;}public String getJob() {return job;}public void setJob(String job) {this.job job;}public Employee getLeader() {return leader;}public void setLeader(Employee leader) {this.leader leader;} public String toString(){return 员工编号:getEmpid(),员工姓名:getEmpname(),员工职位:getJob();}
}
可以发现里面存在着嵌套Employee 里面的一个属性 leader 本身就是 Employee 类型。
【3】创建 EmployeeMapper.java 接口添加 findEmployeeAndLeaderById 方法如下
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Employee;public interface EmployeeMapper {Employee findEmployeeAndLeaderById(int id);
}【4】创建 EmployeeMapper.xml 映射文件代码如下
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecn.kgc.my01.mapper.EmployeeMapperresultMap idempResultMap typeemployeeid propertyempid columnempid /result propertyempname columnempname /result propertyjob columnjob /association propertyleader javaTypeEmployeeselectfindEmployeeAndLeaderById columnleader//resultMapselect idfindEmployeeAndLeaderById parameterTypeint resultMapempResultMapselect * from employee where empid#{empid}/select
/mapper【5】创建 EmployeeMapperTest.java 测试类
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Classes;
import cn.kgc.my01.entity.Employee;
import cn.kgc.my01.entity.Student;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class EmployeeMapperTest {SqlSessionFactory factorynull;Beforepublic void init(){try {InputStream resourceAsStream Resources.getResourceAsStream(config/mybatis-config.xml);factory new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}Testpublic void testFindEmployeeAndLeaderById() {SqlSession sqlSession factory.openSession(true);EmployeeMapper mapper sqlSession.getMapper(EmployeeMapper.class);Employee employeemapper.findEmployeeAndLeaderById(1);Employee leaderemployee.getLeader();System.out.println(employee.toString());System.out.println(他的上司是:leader.toString());//System.out.println(他的上司的上司是:leader.getLeader().toString());}
}测试结果 查询员工
DEBUG [main] - Preparing: select * from employee where empid?
DEBUG [main] - Parameters: 1(Integer)
DEBUG [main] - Preparing: select * from employee where empid?
DEBUG [main] - Parameters: 3(Integer)
DEBUG [main] - Preparing: select * from employee where empid?
DEBUG [main] - Parameters: 4(Integer)
DEBUG [main] - Total: 1
DEBUG [main] - Total: 1
DEBUG [main] - Total: 1
员工编号:1,员工姓名:jack,员工职位:clerk
他的上司是:员工编号:3,员工姓名:john,员工职位:manager从上面的 SQL 语句中发现出现了 3 条 SQL 语句这个查询存在嵌套先查员工1然后查他的直接上司3再查上司的上司4。这种情况不影响什么甚至可以实现直接输出上司的上司但要注意输出语句不要出现地柜即输出语句不要出现输出上司。
要同时查上司的上司只需要在上面的测试类中多加一条语句
System.out.println(他的上司的上司是:leader.getLeader().toString());使用一对多的方式实现自连接
项目案例查询某位领导及其直接下属员工。
思路分析 可用一对多的方式来实现员工(领导)当作一方员工下属当作多方。
实现步骤
【1】修改实体类 Employee代码如下
package cn.kgc.my01.entity;import java.util.List;public class Employee {private int empid;private String empname;private String job;//员工的上司private Employee leader;//员工的下属private ListEmployee employees;public ListEmployee getEmployees() {return employees;}public void setEmployees(ListEmployee employees) {this.employees employees;}public int getEmpid() {return empid;}public void setEmpid(int empid) {this.empid empid;}public String getEmpname() {return empname;}public void setEmpname(String empname) {this.empname empname;}public String getJob() {return job;}public void setJob(String job) {this.job job;}public Employee getLeader() {return leader;}public void setLeader(Employee leader) {this.leader leader;}public String toString(){return 员工编号:getEmpid(),员工姓名:getEmpname(),员工职位:getJob();}
}【2】在 EmployeeMapper.java 接口中添加 findLeaderAndEmployeesById 方法如下
Employee findLeaderAndEmployeesById(int id);【3】在 EmployeeMapper.xml 映射文件中添加 findEmployeeAndLeaderById 的映射方法内容如下 !-- 一对多的方式实现自连接 --resultMap idempResultMap2 typeemployeeid propertyempid columnempid /result propertyempname columnempname /result propertyjob columnjob /!-- 关联属性的映射关系集合的数据来自指定的select查询,该select查询的动态参数来自column指定的字段值 --collection propertyemployees ofTypeemployeeselectselectEmployeesByLeader columnempid//resultMapselect idselectEmployeesByLeader resultTypeemployeeselect * from employee where leader#{empid}/selectselect idfindLeaderAndEmployeesById parameterTypeint resultMapempResultMap2select * from employee where empid#{empid}/select【4】在 EmployeeMapperTest.java 测试类中添加如下内容 Testpublic void testTestFindLeaderAndEmployeesById() {SqlSession sqlSession factory.openSession(true);EmployeeMapper mapper sqlSession.getMapper(EmployeeMapper.class);Employee leadermapper.findLeaderAndEmployeesById(4);ListEmployee employees leader.getEmployees();System.out.println(leader.toString());System.out.println(他的直接下属有);for (Employee employee : employees) {System.out.println(employee.toString());}}测试结果 查询经理
DEBUG [main] - Preparing: select * from employee where empid?
DEBUG [main] - Parameters: 4(Integer)
DEBUG [main] - Preparing: select * from employee where leader?
DEBUG [main] - Parameters: 4.0(Double)
DEBUG [main] - Total: 1
DEBUG [main] - Total: 1
员工编号:4,员工姓名:smith,员工职位:president
他的直接下属有
员工编号:3,员工姓名:john,员工职位:manager多对多查询
原理 多对多可以分拆成两个一对多来处理需要一个中间表各自与中间表实现一对多的关系。
项目案例一个学生可以选人修多门课程一门课程可以给多个学生选修课程与学生之间是典型的多对多。实现查询一个学生信息同时查出他的所有选修课还有实现查询一门课程信息同时查出所有的选修了该课程的学生信息。
思路分析 多对多需要第三表来体现数据库中除了课程表学生表还需要学生课程表。
实现步骤
【1】修改数据库代码如下
CREATE DATABASE studentdb;
USE studentdb ;
DROP TABLE IF EXISTS student ;
CREATE TABLE student (id INT(11) NOT NULL,studentname VARCHAR(20) DEFAULT NULL,gender CHAR(2) DEFAULT NULL,age INT(11) DEFAULT NULL,classno VARCHAR(10),PRIMARY KEY ( id )
)
INSERT INTO student ( id , studentname , gender , age , classno ) VALUES (1,张飞,男,18,201801),(2,李白,男,20,201801),(3,张无忌,男,19,201801),(4,赵敏,女,17,201801);CREATE TABLE classes (cid VARCHAR (30),cname VARCHAR (60)
);
INSERT INTO classes (cid, cname) VALUES(201801,计算机软件1班);
INSERT INTO classes (cid, cname) VALUES(201802,计算机软件2班);CREATE TABLE employee (empid DOUBLE ,empname VARCHAR (60),job VARCHAR (60),leader DOUBLE
);
INSERT INTO employee (empid, empname, job, leader) VALUES(1,jack,clerk,3);
INSERT INTO employee (empid, empname, job, leader) VALUES(2,mike,salesman,3);
INSERT INTO employee (empid, empname, job, leader) VALUES(3,john,manager,4);
INSERT INTO employee (empid, empname, job, leader) VALUES(4,smith,president,NULL);
INSERT INTO employee (empid, empname, job, leader) VALUES(5,rose,salesman,3);CREATE TABLE course (courseid DOUBLE ,coursename VARCHAR (90)
);
INSERT INTO course (courseid, coursename) VALUES(1,java);
INSERT INTO course (courseid, coursename) VALUES(2,android);
INSERT INTO course (courseid, coursename) VALUES(3,PHP);CREATE TABLE studentcourse (id DOUBLE ,studentid DOUBLE ,courseid DOUBLE
);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(1,1,1);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(2,1,2);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(3,2,1);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(4,2,2);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(5,3,1);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(6,3,2);
INSERT INTO studentcourse (id, studentid, courseid) VALUES(7,1,3);【2】新增实体类 Course 和修改实体类 Student 。
Course 类如下:
package cn.kgc.my01.entity;import lombok.Data;import java.util.List;Data
public class Course {private int courseid;private String coursename;private ListStudent students;public String toString(){return 课程编号:getCourseid(),课程名称:getCoursename();}
}Student类如下添加一个属性courses和getter,setter方法。 private ListCourse courses;public ListCourse getCourses() {return courses;}public void setCourses(ListCourse courses) {this.courses courses;}【3】新建 StudentMapper.java 接口并添加一个方法如下
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Student;public interface StudentMapper {public Student searchStudentById(int id);
}
【4】配置对应的 StudentMapper.xml 映射代码如下
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecn.kgc.my01.mapper.StudentMapperresultMap idstudentMap2 typestudentid propertysid columnid /result propertysname columnstudentname /result propertysex columngender /result propertyage columnage /!-- 关联属性的映射关系 --collection propertycourses ofTypeCourseid propertycourseid columncourseid /result propertycoursename columncoursename //collection/resultMap!-- 多表连接查询 --select idsearchStudentById parameterTypeint resultMapstudentMap2select student.id,studentname,gender,age,course.courseid,coursename from course,student,studentcoursewhere course.courseidstudentcourse.courseidand student.idstudentcourse.studentid and student.id#{id}/select
/mapper【5】创建测试类 StudentMapperTest 类
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Classes;
import cn.kgc.my01.entity.Course;
import cn.kgc.my01.entity.Student;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class StudentMapperTest {SqlSessionFactory factorynull;Beforepublic void init(){try {InputStream resourceAsStream Resources.getResourceAsStream(config/mybatis-config.xml);factory new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}Testpublic void testSearchStudentsById() {SqlSession sqlSession factory.openSession(true);StudentMapper mapper sqlSession.getMapper(StudentMapper.class);Student student mapper.searchStudentById(1);System.out.println(student.show());System.out.println(-----该生选修了以下课程:-----------);ListCourse coursesstudent.getCourses();for(Course course:courses){System.out.println(course.toString());}}}测试结果 【6】新建 CourseMapper.java 接口并添加一个方法如下
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Course;public interface CourseMapper {//根据id查找课程,即时获取选个性该课程的学生public Course searchCourseById(int id);
}【7】配置对应的 CourseMapper.xml 映射代码如下
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecn.kgc.my01.mapper.CourseMapperresultMap idcourseMap typecourseid propertycourseid columncourseid /result propertycoursename columncoursename /!-- 关联属性的映射关系 --collection propertystudents ofTypeStudentid propertysid columnid /result propertysname columnstudentname /result propertysex columngender /result propertyage columnage //collection/resultMap!-- 多表连接查询 --select idsearchCourseById parameterTypeint resultMapcourseMapselect student.id,studentname,gender,age,course.courseid,coursename from course,student,studentcoursewhere course.courseidstudentcourse.courseidand student.idstudentcourse.studentid and course.courseid#{courseid}/select
/mapper【8】创建测试类 CourseMapperTest 类
package cn.kgc.my01.mapper;import cn.kgc.my01.entity.Course;
import cn.kgc.my01.entity.Employee;
import cn.kgc.my01.entity.Student;
import junit.framework.TestCase;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class CourseMapperTest{SqlSessionFactory factorynull;Beforepublic void init(){try {InputStream resourceAsStream Resources.getResourceAsStream(config/mybatis-config.xml);factory new SqlSessionFactoryBuilder().build(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}Testpublic void testSearchCourseById() {SqlSession sqlSession factory.openSession(true);CourseMapper mapper sqlSession.getMapper(CourseMapper.class);Course course mapper.searchCourseById(1);System.out.println(course.toString());System.out.println(-------该课程有以下学生选修:------);ListStudent studentscourse.getStudents();for(Student student:students){System.out.println(student.show());}}
}测试效果 码文不易本篇文章就介绍到这里如果想要学习更多Java系列知识点击关注博主博主带你零基础学习Java知识。与此同时对于日常生活有困扰的朋友欢迎阅读我的第四栏目《国学周更—心性养成之路》学习技术的同时我们也注重了心性的养成。