• springboot+mybatis实现一对多查询(某学生和课程的ER图如下图所示,根据ER图创建数据库表,往数据库表中添加若干测试数据,用SpringBoot+SpringMVC+ Mybatis)


    目录

    Gitee下载地址:springboot+mybatis实现多对一demo(JavaEE第二次作业)

    要求:

    技术要求

    其他要求

    创建项目:

    依赖包选择:

     数据库设计:

    course表:

    ​编辑

     student表:

     stu_course表:

    先pojo对象类:

    配置application.properties数据库文件

    mapper层

    StudentMapper接口:

     CourseMapper接口

    与mapper对应的xml文件

    StudentMapper..xml

    CourseMapper.xml

    Service层

    StudentService接口实现类

    Controller层:

    前端展示代码:

    studentlist.html

    courseList.html

    如何变为自己的代码

    Gitee下载地址:springboot+mybatis实现多对一demo(JavaEE第二次作业)

    要求:

    某学生和课程的ER图如下图所示,根据ER图创建数据库表,往数据库表中添加若干测试数据,用SpringBoot+SpringMVC+ Mybatis完成如下功能:
    1、用前端列表显示所有的学生的选课信息,学生的选课信息通过级联查询获取
    2、删除某条学生信息,并同步的删除该学生的选课信息
    3、前端完成输入用户的姓名后查询该用户所选的课程


    技术要求

    • 数据库使用Mysql8.0
    • 后端使用SpringBoot + SpringMVC+ Mybatis实现
    • 前端使用html+Thymeleaf

    其他要求

    • 后端工程的包名以com.hnucm.c+学号来命名(命名不符合要求得分不超过60分)
    • 数据库学生表以student+姓名拼音首字母命名如张三同学命名为student_zs,课程表以course _ + 姓名拼音首字母命名如张三同学命名为course_zs(命名不符合要求得分不超过60分)
    • 后端学生实体类以Student+姓名拼音首字母命名如张三同学命名为StudentZS,课程实体类以Course+姓名拼音首字母命名如张三同学命名为CourseZS(命名不符合要求得分不超过60分)
       

    真服了,写完了才发现自己的命名不符合要求。所以我会教你们如何把这个作业变成你们“自己”的作业!!!!当然如果单纯知识来学习知识的就不用关注这么多啦~~

    系列文章:

    springmvc实现增删改查博文参考:springmvc实现增删改查(创建一个bookstore数据库)

    新建一个springboot项目参考博文:springboot新建一个项目以及各种报错解决

    springboot整合mybatis实现简单增删改查参考博文:springboot整合mybatis实现简单增删改查

     springboot实现多表一对一查询参考博文:springboot+mybatis实现多表一对一查询

    创建项目:

    依赖包选择:

     手动补一个依赖:

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-thymeleafartifactId>
    4. dependency>

     数据库设计:

    course表:

     student表:

     stu_course表:

     

    先pojo对象类:

    新建两个Java类:

    Course:

    1. package com.hnucm.c202001090145.pojo;
    2. import lombok.Data;
    3. @Data
    4. public class Course {
    5. private int id;
    6. private String c_name;
    7. private float score;
    8. }
    Student类:
    
    1. package com.hnucm.c202001090145.pojo;
    2. import lombok.Data;
    3. import java.util.List;
    4. @Data
    5. public class Student {
    6. private String num;
    7. private String name;
    8. private String classname;
    9. private List courseList;
    10. }

    配置application.properties数据库文件

    我在这里数据库配置后面新增了一个属性:allowMultiQueries=true

    你们直接复制粘贴就OK。这条配置项的作用是允许执行多条sql语句,我这里是使用在delete标签删除时里面含有两条独立的SQL语句。不配置会报错

    1. #设置端口号
    2. server.port=9090
    3. #前缀值,路劲前面加上/springboot
    4. server.servlet.context-path=/springboot
    5. #设置静态文件访问地址
    6. spring.web.resources.static-locations=classpath:/templates
    7. #把你自己的数据库名写在‘3306/’ 后面
    8. #spring.datasource.url=jdbc:mysql://localhost:3306/homework_tow?
    9. characterEncoding=utf8&serverTimezone=UTC
    10. spring.datasource.url=jdbc:mysql://localhost:3306/homework_tow?characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true
    11. # 用户名密码
    12. spring.datasource.username=root
    13. spring.datasource.password=1234
    14. spring.datasource.name=defaultDataSource
    15. #改成你自己的路径。!!!!!!改
    16. mybatis.type-aliases-package=com.hnucm.c202001090145.pojo
    17. mybatis.mapper-locations=classpath:mappers/*.xml
    18. # 日志
    19. logging.level.com.example.csdn_release=debug

    简单的我就快速过了,仔细讲讲核心代码

    mapper层

    StudentMapper接口:

    在这里主要是定义了几个方法,以及与StudentMapper.xml文件关联

    1. package com.hnucm.c202001090145.mapper;
    2. import com.hnucm.c202001090145.pojo.CourseOYH;
    3. import org.apache.ibatis.annotations.Mapper;
    4. import java.util.List;
    5. @Mapper
    6. public interface StudentMapper {
    7. // 查询所有学生以及选课情况
    8. public List findAllStuAndCourse();
    9. int deleteStudentByNum(String num);
    10. }

     CourseMapper接口

    1. package com.hnucm.c202001090145.mapper;
    2. import com.hnucm.c202001090145.pojo.CourseOYH;
    3. import org.apache.ibatis.annotations.Mapper;
    4. import java.util.List;
    5. @Mapper
    6. public interface CourseMapper {
    7. public List findCourseById(String num);
    8. // 输入用户姓名查询所选课程
    9. List findCourseByName(String name);
    10. }

    与mapper对应的xml文件

    StudentMapper..xml

    着重讲xml文件。首先是一个select标签。因为要展示学生的所有信息,所以直接select*。与之对应的是resultMap标签,因为学生和选课是一对多的关系,所以需要一个集合关系。这也是为什么在pojo中的student加了一个List的原因。其实主要还是collection标签中的类容,里面的property=“courseList”  中的courseList是属性名,什么叫属性名呢?以及一些springboot中一些常用的名词解释可以看我这篇文章:springboot+mybatis实现多表一对一查询以及名词解释

    里面的column是

    select="com.hnucm.c202001090145.mapper.CourseMapper.findCourseById" 这个对应方法所需要的参数

    ofType意思是这个集合的类型。

    下面的delete标签是删除学生信息和选课信息。可以看见这里面包含了两条独立的sql语句。springboot默认是不允许的所以我们在上面的配置文件中加了spring.datasource.url=jdbc:mysql://localhost:3306/homework_tow?characterEncoding=utf8&serverTimezone=UTC&allowMultiQueries=true

    标红的部分就可以实现同时执行多条SQL语句了

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.hnucm.c202001090145.mapper.StudentMapper">
    4. <select id="findAllStuAndCourse" resultMap="studentCourse">
    5. select * from student_oyh
    6. select>
    7. <resultMap id="studentCourse" type="com.hnucm.c202001090145.pojo.StudentOYH">
    8. <id column="num" property="num">id>
    9. <result property="name" column="name">result>
    10. <result column="classname" property="classname">result>
    11. <collection property="courseList"
    12. ofType="com.hnucm.c202001090145.pojo.CourseOYH"
    13. column="num"
    14. select="com.hnucm.c202001090145.mapper.CourseMapper.findCourseById">
    15. collection>
    16. resultMap>
    17. <delete id="deleteStudentByNum" parameterType="String" >
    18. delete from student_oyh where student_oyh.num=#{num};
    19. delete from stu_course where stu_course.num=#{num}
    20. delete>
    21. mapper>

    CourseMapper.xml

    这里面的第一个select语句就是实现了学生信息以及选课信息的级联查询。只不过我们把它们放在了一条sql语句中了。解释一下,就是先执行

    select courseId from stu_course where num=#{num}这条代码,有人说这里的num参数 是怎么来的呢,其实就是StudentMapper.xml文件中collection中的colum传递过来的,并且是一条一条穿过来,所以这条sql语句就会查询出多个 courseId。之后继续执行
    select * from course_oyh where id in(一个courseId数组)这条语句。

    第二个select语句,就是输入学生信息查询选课信息。标准的查法应该是

    输入姓名查询student表中的num
    通过num查询在stu_course表中的所有courseId
    将id拿到继续在course中查询

    但是我不一样呀,我偷懒一句搞定算了~~~~

    1. "1.0" encoding="UTF-8"?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="com.hnucm.c202001090145.mapper.CourseMapper">
    4. <select id="findCourseById"
    5. resultType="com.hnucm.c202001090145.pojo.CourseOYH"
    6. parameterType="String">
    7. select * from course_oyh where id in(
    8. select courseId from stu_course where num=#{num}
    9. )
    10. select>
    11. <select id="findCourseByName" parameterType="String" resultType="com.hnucm.c202001090145.pojo.CourseOYH">
    12. SELECT DISTINCT course_oyh.id,course_oyh.c_name,course_oyh.score
    13. from stu_course,course_oyh,student_oyh
    14. where student_oyh.num=stu_course.num AND course_oyh.id=stu_course.courseId and student_oyh.`name`=#{name};
    15. select>
    16. mapper>

    Service层

    StudentService接口:

    一般接口没有什么好看的就是定义了一些方法

    1. package com.hnucm.c202001090145.service;
    2. import com.hnucm.c202001090145.pojo.CourseOYH;
    3. import java.util.List;
    4. public interface StudentService {
    5. public List findAllStuAndCourse();
    6. int deleteStudentByNum(String num);
    7. List findCourseByName(String name);
    8. }

    StudentService接口实现类

    这里也没什么好讲的,就是调用了Mapper层的接口。注意一下“deleteStudentByNum”这个方法上面我多加了一个注解@Transactional,目的是为了防止你只删除了学生信息而没有删除选课信息,从而实现事务回滚

    1. package com.hnucm.c202001090145.service;
    2. import com.hnucm.c202001090145.mapper.CourseMapper;
    3. import com.hnucm.c202001090145.mapper.StudentMapper;
    4. import com.hnucm.c202001090145.pojo.CourseOYH;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import org.springframework.transaction.annotation.Transactional;
    8. import java.util.List;
    9. @Service
    10. public class StudentServiceImpl implements StudentService{
    11. @Autowired
    12. StudentMapper studentMapper;
    13. @Autowired
    14. CourseMapper courseMapper;
    15. @Override
    16. public List findAllStuAndCourse() {
    17. return studentMapper.findAllStuAndCourse() ;
    18. }
    19. @Override
    20. @Transactional
    21. public int deleteStudentByNum(String num) {
    22. return studentMapper.deleteStudentByNum(num);
    23. }
    24. @Override
    25. public List findCourseByName(String name) {
    26. return courseMapper.findCourseByName(name);
    27. }
    28. }

    Controller层:

    这里浅浅讲一下,就是拦截了三个请求,第一个请求“studentlist”是展示所有的学生和选课信息。第二个请求时删除某个学生和它的选课信息。第三个是查询请求

    1. package com.hnucm.c202001090145.controller;
    2. import com.hnucm.c202001090145.service.StudentService;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.stereotype.Controller;
    5. import org.springframework.ui.Model;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. @Controller
    8. public class StudentController {
    9. @Autowired
    10. StudentService studentService;
    11. @RequestMapping("studentlist")
    12. public String StudentList(Model model){
    13. model.addAttribute("studentlist",studentService.findAllStuAndCourse());
    14. return "studentlist.html";
    15. }
    16. @RequestMapping("deletestudentbyid")
    17. public String deleteCourse(String num){
    18. studentService.deleteStudentByNum(num);
    19. return "redirect:/studentlist";
    20. }
    21. @RequestMapping("lookinfo")
    22. public String courseList(Model model, String name){
    23. model.addAttribute("courseList",studentService.findCourseByName(name));
    24. model.addAttribute("name",name);
    25. return "courseList.html";
    26. }
    27. }

    断点测试是否有数据。如果有数据就继续写html文件 

    前端展示代码:

    studentlist.html

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <title>用户列表title>
    7. head>
    8. <body>
    9. <table border="1px" cellspacing="0px">
    10. <tr>
    11. <th th:width="40px">学号th>
    12. <th th:width="40px">姓名th>
    13. <th th:width="150px">班级th>
    14. <th th:width="150px">选课信息th>
    15. <th >删除th>
    16. <th>更新th>
    17. tr>
    18. <tr th:each="student:${studentlist}">
    19. <td th:text="${student.num}">td>
    20. <td th:text="${student.name}">td>
    21. <td th:text="${student.classname}">td>
    22. <td>
    23. <ul th:each="course:${student.courseList}" >
    24. <li th:text="${course.c_name}">li>
    25. <li th:text="${course.score}">li>
    26. ul>
    27. td>
    28. <td><a th:href="@{'/deletestudentbyid?num='+${student.num}}">删除用户a> td>
    29. <td><a th:href="@{updatepersonbyid(num=${student.num},courseId=${student.courseList},classname=${student.classname})}">更新用户a> td>
    30. tr>
    31. table>
    32. <form th:action="@{/lookinfo} " method="post" style="margin-top: 20px">
    33. 请输入用户名:<input name="name"><br>
    34. <div><input type="submit" value="查询">div>
    35. form>
    36. body>
    37. html>

    courseList.html

    用户查询展示页面

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <title>用户列表title>
    7. head>
    8. <body>
    9. <h2>你所查询的用户:h2>
    10. <h2 th:text="${name}">h2>
    11. <h2>选课信息如下:h2>
    12. <table border="1px" cellspacing="0px">
    13. <tr>
    14. <th th:width="40px">课程号th>
    15. <th th:width="40px">课程名th>
    16. <th th:width="150px">学分th>
    17. tr>
    18. <tr th:each="course:${courseList}">
    19. <td th:text="${course.id}">td>
    20. <td th:text="${course.c_name}">td>
    21. <td th:text="${course.score}">td>
    22. tr>
    23. table>
    24. body>
    25. html>

    如何变为自己的代码

    学习知识的不用管这里,完成作业有需要的看看就好了。

    第一步修改数据库命名:直接在Navicat中右键表重命名就好了,之后继续在代码中改

    与数据库先关的只在xml文件中。只需在每一个xml文件Ctrl+F键搜索没改之前的数据库名,涉及到相关的一个一个手动改!!!注意一定是手动一个一个检查改,不要使用替换!!。

    第二步:修改pojo对象类命名:

    只需要右键那个类选择refactor,在选择里面的rename就OK了,这里其他的应该不用自己改。

     继续重命名Java下面的那个包名,只需要重命名然后在每个文件的最上方改成你的名字就好了。

    最容易忽视的地方就是数据库配置文件application.properties中的数据库名,用户名和密码。

    还有mybatis对应的pojo类。

    然后因为我在配置类中设置了前缀地址/springboot和端口号所以,你运行项目后记得是localhost:9090/springboot/xxx什么的

     

  • 相关阅读:
    测试环境搭建教程(APP+WEB)
    go: no such tool “compile“(一次糟糕体验)
    全球名校AI课程库(30)| MIT麻省理工 · 深度学习与无人驾驶课程『Deep Learning for Self-Driving Cars』
    【scikit-learn基础】--『监督学习』之 支持向量机回归
    摩尔信使MThings实用功能盘点
    安装elasticsearch
    小白必看,手把手教你重装系统
    快鲸智慧楼宇系统:助力商办楼宇快速实现智慧化、数字化运营
    Linux修改默认登录端口22
    怎么做好品牌营销,小红书爆款笔记怎么做?
  • 原文地址:https://blog.csdn.net/qq_51580852/article/details/127579549