Mapper.xml中查询返回带有List属性的实体类结果

刚入职公司,参与到一个项目中,由于是刚毕业的菜鸟,只能分配写一些查询的接口代码。其中有一个就是需要返回一个实体类的信息,该实体类带有List属性,返回的结果类似于下图。

Mapper.xml中查询返回带有List属性的实体类结果_第1张图片

我的解决办法是将查询分成两步,第一步是查询到对应的表的实体类结果,第二部查询到一个List集合然后将这个集合通过set方法复制给实体类。后来看了同事的代码豁然开朗,这里用学生的信息模拟一下。

1.建立学生关系表

建了五张表,分别是school(学院)class(班级)student(班级)course(课程)stu_course(学生选课表),表结构如下

学院表

Mapper.xml中查询返回带有List属性的实体类结果_第2张图片

班级表

Mapper.xml中查询返回带有List属性的实体类结果_第3张图片

学生表

Mapper.xml中查询返回带有List属性的实体类结果_第4张图片

课程表

Mapper.xml中查询返回带有List属性的实体类结果_第5张图片

学生选课表

Mapper.xml中查询返回带有List属性的实体类结果_第6张图片

班级表通过school_id与学院表关联,学生表通过class_id与班级表关联,学生选课表关联学生表和课程表。

2.建立springboot项目

在STS中新建springboot项目,application.properties配置如下

Mapper.xml中查询返回带有List属性的实体类结果_第7张图片

pom.xml文件如下


    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.5.RELEASE
        
    

    com.cheng
    testspringboot
    0.0.1-SNAPSHOT
    war
    testspringboot
    Demo project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
        
            org.apache.tomcat.embed
            tomcat-embed-jasper
            provided
        

        
            javax.servlet
            jstl
            provided
        

        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.10
        

        
    
        
            com.baomidou
            mybatisplus-spring-boot-starter
            1.0.5
        

        
        
            com.baomidou
            mybatis-plus
            2.3
        

        
        
            mysql
            mysql-connector-java
        

        
            org.apache.velocity
            velocity
            1.7
        

        
            org.freemarker
            freemarker
            2.3.20
        

        
        
            org.projectlombok
            lombok
        

    
    
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            

            
        

    

 

项目建好后使用mybatis plus自动生成实体类service和controller以及Mapper,生成好的如下图。

Mapper.xml中查询返回带有List属性的实体类结果_第8张图片

并创建要返回的学生详细信息的实体类StudentDto,该实体类包含List类型的学生选课的课程信息

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{
    private static final long serialVersionUID = 1L;
    
    /**
     * 学生ID
     */
    private String studentId;
    /**
     * 学生姓名
     */
    private String studentName;
    /**
     * 学生年龄
     */
    private Integer studentAge;
    /**
     * 学生性别
     */
    private String studentSex;
    /**
     * 学校ID
     */
    private String schoolId;
    /**
     * 班级ID
     */
    private String classId;
    private String shcoolName;
    private String className;
    
    private List 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 getCourses() {
        return courses;
    }

    public void setCourses(List 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(也是自动生成的,需要写部分内容)



   
   
       
       
       
       
       
       
   

    
    

   
   
        student_id, student_name, student_age, student_sex, school_id, class_id
   

    
   
        
       
       
       
       
       
       
       
        
        
                     column="student_id" select="com.example.chapter3.mapper.CourseMapper.selectCourseByStuId">
         
       
    
   

    
   

其对应的StudentMapper.class文件如下

Mapper.xml中查询返回带有List属性的实体类结果_第9张图片

该Mapper有一个查询学生信息的方法对应studentMapper.xml里的selectStudentDetails。通过联合查询返回stuDtoResultMap,这是个resulMap类型,type="com.example.chapter3.dto.StudentDto"是学生的详细信息实体类,其中的

            column="student_id" select="com.example.chapter3.mapper.CourseMapper.selectCourseByStuId">
 
 

表示的是StudentDto的List集合,返回的是List,propertyStudentDto类中的集合属性名,也就是courses,ofType是集合中的类型,是Course, column是查询传递的参数,select是要查询的语句,同一个Mapper直接使用id,不同Mapper使用查询方法的全类名,这里把student_id作为参数传递给Course表的查询函数selectCourseByStuId。CourseMapper如下。

Mapper.xml中查询返回带有List属性的实体类结果_第10张图片

其对应的Mapper文件如下

Mapper.xml中查询返回带有List属性的实体类结果_第11张图片

4.查询学生详细信息的service和controller

Mapper.xml中查询返回带有List属性的实体类结果_第12张图片

Mapper.xml中查询返回带有List属性的实体类结果_第13张图片

Mapper.xml中查询返回带有List属性的实体类结果_第14张图片

5.测试

访问请求localhost:8081/student/studentDetails/st001得到结果如下

Mapper.xml中查询返回带有List属性的实体类结果_第15张图片

你可能感兴趣的:(springboot)