MyBatis多表關聯查詢
(一)建立測試資料庫
CREATE TABLE `t_teacher` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
CREATE TABLE `t_student` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`tid` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
(二)根據測試資料庫建立實體類
-
學生類
package com.jarreet.test.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
-
老師類
package com.jarreet.test.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
(三)檔案配置
-
在 application.yml 配置 mybatis
mybatis
-
在 TestApplication 啟動類上加上包掃描註解
二、多對一查詢
我們根據上面搭建的環境,給出一個查詢需求:查詢所有學生的資訊及他們的老師
(一)資料持久化層
-
StudentDao.java
package com.jarreet.test.dao;
import com.jarreet.test.pojo.Student;
import org.springframework.stereotype.Repository;
import java.util.List;
-
StudentMapper.xml
(二)業務邏輯層
-
StudentService.java
package com.jarreet.test.service;
import com.jarreet.test.pojo.Student;
import java.util.List;
public interface StudentService {
List<Student> getAllStudents();
} -
StudentServiceImpl.java
package com.jarreet.test.service.impl;
import com.jarreet.test.dao.StudentDao;
import com.jarreet.test.pojo.Student;
import com.jarreet.test.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
(三)訪問控制層
StudentController.java
package com.jarreet.test.controller;
import com.jarreet.test.pojo.Student;
import com.jarreet.test.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
(四)結果展示
三、一對多查詢
我們根據上面搭建的環境,給出一個查詢需求:查詢所有老師的資訊及他們的學生
(一)資料持久化層
-
TeacherDao.java
package com.jarreet.test.dao;
import com.jarreet.test.pojo.Teacher;
import org.springframework.stereotype.Repository;
import java.util.List;
-
TeacherMapper.xml
(二)業務邏輯層
-
TeacherService.java
package com.jarreet.test.service;
import com.jarreet.test.pojo.Teacher;
import java.util.List;
public interface TeacherService {
List<Teacher> getAllTeachers();
} -
TeacherServiceImpl.java
package com.jarreet.test.service.impl;
import com.jarreet.test.dao.TeacherDao;
import com.jarreet.test.pojo.Teacher;
import com.jarreet.test.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
(三)訪問控制層
TeacherController.java
package com.jarreet.test.controller;
import com.jarreet.test.pojo.Teacher;
import com.jarreet.test.service.TeacherService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
(四)結果展示
四、多對多查詢
多對多查詢其實就是雙向的一對多查詢
這裡我們給出一個多對多的情境:網上選課,一個賬號可以選擇多個課程,而一個課程也有可能被多個賬號選擇
那麼我們現在需要一個賬號表 t_account ,一個課程表 t_course;但是這兩張表就夠了嗎?
當然不夠,開頭說了,多對多查詢是雙向的一對多,那麼我們就需要一張中間表 account_course 來實現
(一)建立資料庫表
CREATE TABLE `t_account`(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(11) DEFAULT NULL
);
CREATE TABLE `t_course`(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(11) DEFAULT NULL
);
CREATE TABLE `account_course`(
`id` INT(11) PRIMARY KEY AUTO_INCREMENT,
`aid` INT(11) DEFAULT NULL,
`cid` INT(11) DEFAULT NULL
);
(二)根據資料庫表建立實體類
-
賬戶類
package com.jarreet.test.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
-
課程類
package com.jarreet.test.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.util.List;
(三)資料持久化層
-
AccountDao.java
package com.jarreet.test.dao;
import com.jarreet.test.pojo.Account;
import org.springframework.stereotype.Repository;
-
AccountMapper.xml
-
CourseDao.java
package com.jarreet.test.dao;
import com.jarreet.test.pojo.Course;
import org.springframework.stereotype.Repository;
-
CourseMapper.xml
(四)業務邏輯層
-
AccountService.java
package com.jarreet.test.service;
import com.jarreet.test.pojo.Account;
public interface AccountService {
Account findAccountById(Integer id);
} -
AccountServiceImpl.java
package com.jarreet.test.service.impl;
import com.jarreet.test.dao.AccountDao;
import com.jarreet.test.pojo.Account;
import com.jarreet.test.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-
CourseService.java
package com.jarreet.test.service;
import com.jarreet.test.pojo.Course;
public interface CourseService {
Course findCourseById(Integer id);
} -
CourseServiceImpl.java
package com.jarreet.test.service.impl;
import com.jarreet.test.dao.CourseDao;
import com.jarreet.test.pojo.Course;
import com.jarreet.test.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
(五)訪問控制層
-
AccountController.java
package com.jarreet.test.controller;
import com.jarreet.test.pojo.Account;
import com.jarreet.test.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
-
CourseController.java
package com.jarreet.test.controller;
import com.jarreet.test.pojo.Course;
import com.jarreet.test.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
(六)結果展示
至此,關於 Mybatis 的多表查詢就講解完畢了,下面我們簡單做個總結。
Mybatis的多表查詢無非就是做好實體類屬性和mapper.xml檔案的對映,其中:
association 是將結果集封裝成⼀個實體類的物件(⼀個⽬標物件),並通過 JavaType 設定數型別;
collection 是將結果集封裝成⼀個集合物件(多個⽬標物件),並通過 ofType 設定資料型別;
當多對一時,使用 association
當一對多時,使用 collection;
而當多對多時,無非就是進行一個雙向的一對多繫結
特別要注意的幾個點:
搭建環境時,要在配置檔案中配置好 mybatis 資訊,否則有可能報錯
需要開啟包掃描,要麼在啟動類上加上 @MapperScan 註解,要麼在 持久化介面上加上 @Mapper 註解
當需要級聯的物件的屬性名和自身的屬性名相同時,需要起別名,防止衝突覆蓋