Mapper.xml中查詢返回帶有List屬性的實(shí)體類結(jié)果問(wèn)題
剛?cè)肼毠?,參與到一個(gè)項(xiàng)目中,由于是剛畢業(yè)的菜鳥(niǎo),只能分配寫一些查詢的接口代碼。
其中有一個(gè)就是需要返回一個(gè)實(shí)體類的信息,該實(shí)體類帶有List屬性,返回的結(jié)果類似于下圖。
我的解決辦法是將查詢分成兩步,第一步是查詢到對(duì)應(yīng)的表的實(shí)體類結(jié)果,第二部查詢到一個(gè)List集合然后將這個(gè)集合通過(guò)set方法復(fù)制給實(shí)體類。
后來(lái)看了同事的代碼豁然開(kāi)朗,這里用學(xué)生的信息模擬一下。
1.建立學(xué)生關(guān)系表
建了五張表,分別是school(學(xué)院)class(班級(jí))student(班級(jí))course(課程)stu_course(學(xué)生選課表),表結(jié)構(gòu)如下
學(xué)院表
班級(jí)表
學(xué)生表
課程表
學(xué)生選課表
班級(jí)表通過(guò)school_id與學(xué)院表關(guān)聯(lián),學(xué)生表通過(guò)class_id與班級(jí)表關(guān)聯(lián),學(xué)生選課表關(guān)聯(lián)學(xué)生表和課程表。
2.建立springboot項(xiàng)目
在STS中新建springboot項(xiàng)目,application.properties配置如下
pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.cheng</groupId> <artifactId>testspringboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>testspringboot</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter --> <!-- <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.0</version> </dependency> --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatisplus-spring-boot-starter</artifactId> <version>1.0.5</version> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>2.3</version> </dependency> <!--MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> <!-- lombok需要的jar包 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
項(xiàng)目建好后使用mybatis plus自動(dòng)生成實(shí)體類service和controller以及Mapper,生成好的如下圖。
并創(chuàng)建要返回的學(xué)生詳細(xì)信息的實(shí)體類StudentDto,該實(shí)體類包含List類型的學(xué)生選課的課程信息
package com.example.chapter3.dto; import java.io.Serializable; import java.util.List; import com.baomidou.mybatisplus.activerecord.Model; import com.example.chapter3.model.Course; public class StudentDto extends Model<StudentDto>{ private static final long serialVersionUID = 1L; /** * 學(xué)生ID */ private String studentId; /** * 學(xué)生姓名 */ private String studentName; /** * 學(xué)生年齡 */ private Integer studentAge; /** * 學(xué)生性別 */ private String studentSex; /** * 學(xué)校ID */ private String schoolId; /** * 班級(jí)ID */ private String classId; private String shcoolName; private String className; private List<Course> courses; @Override protected Serializable pkVal() { // TODO Auto-generated method stub return studentId; } public String getStudentId() { return studentId; } public void setStudentId(String studentId) { this.studentId = studentId; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public Integer getStudentAge() { return studentAge; } public void setStudentAge(Integer studentAge) { this.studentAge = studentAge; } public String getStudentSex() { return studentSex; } public void setStudentSex(String studentSex) { this.studentSex = studentSex; } public String getSchoolId() { return schoolId; } public void setSchoolId(String schoolId) { this.schoolId = schoolId; } public String getClassId() { return classId; } public void setClassId(String classId) { this.classId = classId; } public String getShcoolName() { return shcoolName; } public void setShcoolName(String shcoolName) { this.shcoolName = shcoolName; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public List<Course> getCourses() { return courses; } public void setCourses(List<Course> courses) { this.courses = courses; } public static long getSerialversionuid() { return serialVersionUID; } @Override public String toString() { return "StudentDto [studentId=" + studentId + ", studentName=" + studentName + ", studentAge=" + studentAge + ", studentSex=" + studentSex + ", schoolId=" + schoolId + ", classId=" + classId + ", shcoolName=" + shcoolName + ", className=" + className + ", courses=" + courses + "]"; } }
3.編寫要查詢的studentMapper.xml(也是自動(dòng)生成的,需要寫部分內(nèi)容)
<?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.example.chapter3.mapper.StudentMapper"> <!-- 通用查詢映射結(jié)果 --> <resultMap id="BaseResultMap" type="com.example.chapter3.model.Student"> <id column="student_id" property="studentId" /> <result column="student_name" property="studentName" /> <result column="student_age" property="studentAge" /> <result column="student_sex" property="studentSex" /> <result column="school_id" property="schoolId" /> <result column="class_id" property="classId" /> </resultMap> <!-- 通用查詢結(jié)果列 --> <sql id="Base_Column_List"> student_id, student_name, student_age, student_sex, school_id, class_id </sql> <resultMap type="com.example.chapter3.dto.StudentDto" id="stuDtoResultMap"> <id column="student_id" property="studentId" /> <result column="student_name" property="studentName" /> <result column="student_age" property="studentAge" /> <result column="student_sex" property="studentSex" /> <result column="school_id" property="schoolId" /> <result column="class_id" property="classId" /> <result column="shcool_name" property="shcoolName" /> <result column="class_name" property="className" /> <collection property="courses" ofType="com.example.chapter3.model.Course" column="student_id" select="com.example.chapter3.mapper.CourseMapper.selectCourseByStuId"> </collection> </resultMap> <select id="selectStudentDetails" resultMap="stuDtoResultMap"> SELECT sc.school_name, sc.school_id, sc.adress, cl.class_id, cl.class_name, stu.student_id, stu.student_name, stu.student_age, stu.student_sex FROM school sc LEFT JOIN class cl ON sc.school_id = cl.school_id LEFT JOIN student stu ON stu.class_id = cl.class_id WHERE stu.student_id = #{studentId} </select> </mapper>
其對(duì)應(yīng)的StudentMapper.class文件如下
該Mapper有一個(gè)查詢學(xué)生信息的方法對(duì)應(yīng)studentMapper.xml里的selectStudentDetails。
通過(guò)聯(lián)合查詢返回stuDtoResultMap,這是個(gè)resulMap類型,type="com.example.chapter3.dto.StudentDto"是學(xué)生的詳細(xì)信息實(shí)體類,其中的
<collection property="courses" ofType="com.example.chapter3.model.Course" column="student_id" select="com.example.chapter3.mapper.CourseMapper.selectCourseByStuId"> </collection>
表示的是StudentDto的List集合,返回的是List<Course>,property是StudentDto類中的集合屬性名,也就是courses,ofType是集合中的類型,是Course, column是查詢傳遞的參數(shù),select是要查詢的語(yǔ)句,同一個(gè)Mapper直接使用id,不同Mapper使用查詢方法的全類名,這里把student_id作為參數(shù)傳遞給Course表的查詢函數(shù)selectCourseByStuId。
CourseMapper如下。
其對(duì)應(yīng)的Mapper文件如下
4.查詢學(xué)生詳細(xì)信息的service和controller
5.測(cè)試
訪問(wèn)請(qǐng)求localhost:8081/student/studentDetails/st001得到結(jié)果如下
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot打包不同環(huán)境配置以及shell腳本部署的方法
這篇文章主要給大家介紹了關(guān)于springboot打包不同環(huán)境配置以及shell腳本部署的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03SpringBoot Maven打包如何根據(jù)環(huán)境排除文件
文章介紹了在SpringBoot項(xiàng)目中,根據(jù)不同的環(huán)境(開(kāi)發(fā)、測(cè)試、生產(chǎn))進(jìn)行JSP文件打包處理的方法,通過(guò)配置`pom.xml`文件中的``標(biāo)簽,可以實(shí)現(xiàn)開(kāi)發(fā)環(huán)境保留`index.jsp`文件,測(cè)試環(huán)境和生產(chǎn)環(huán)境排除該文件2024-12-12IDEA Error:java: 無(wú)效的源發(fā)行版: 17錯(cuò)誤
本文主要介紹了IDEA Error:java: 無(wú)效的源發(fā)行版: 17錯(cuò)誤,這個(gè)錯(cuò)誤是因?yàn)槟腎DEA編譯器不支持Java 17版本,您需要更新您的IDEA編譯器或者將您的Java版本降級(jí)到IDEA支持的版本,本文就來(lái)詳細(xì)的介紹一下2023-08-08