SpringBoot教学资料5-SpringBoot一对多查询(带简单前端)

news2025/1/16 5:53:29

项目展示:

 项目结构:

SQL:

CREATE TABLE `t_article` (
  `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '文章id',
  `title` varchar(200) DEFAULT NULL COMMENT '文章标题',
  `content` longtext COMMENT '文章内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

CREATE TABLE `t_comment` (
  `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '评论id',
  `content` longtext COMMENT '评论内容',
  `author` varchar(200) DEFAULT NULL COMMENT '评论作者',
  `a_id` int(20) DEFAULT NULL COMMENT '关联的文章id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

 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 https://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.6.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>springbootsy</groupId>
    <artifactId>sy2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sy2</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-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.properties:

spring.thymeleaf.cache=false
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML5
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

spring.datasource.url=jdbc:mysql://localhost:3306/springboottest
spring.datasource.username=root
spring.datasource.password=123456

mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=springbootsy.sy2.domain

articleList.html:

 
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www. .org/">
<head>
    <meta charset="UTF-8">
    <title>article列表</title>
</head>
<body>
<form method="get" th:action="@{'/article/findAll'}">
    <!--th:action相当于action-->
    <input type="submit" value="查询">
</form>
<table cellspacing="1">
    <thead>
    <tr>
        <th>id</th>
        <th>标题</th>
        <th>内容</th>
        <th>操作</th>
    </tr>
    </thead>

    <tbody th:each="article:${articleLists}">
    <tr>
        <td th:text="${article.id}"></td>
        <td th:text="${article.title}"></td>
        <td th:text="${article.content}"></td>
        <td>
            <a th:href="@{/article/findById(id=${article.id})}">查看详情</a>
        </td>
    </tr>
    </tbody>
</table>
</body>
</html>

 articleDetail.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head>
    <meta charset="UTF-8">
    <title>article 详情</title>
</head>
<body>
<!--自行发挥展示article的title、content、commentList等内容-->

<table>
    <tr>
        <td>title:</td>
        <td th:text="${article.title}"></td>
    </tr>
    <tr>
        <td>content:</td>
        <td th:text="${article.content}"></td>
    </tr>
</table>
<table cellspacing="1">
    <thead>
    <tr>
        <th>id</th>
        <th>author</th>
        <th>content</th>
    </tr>
    </thead>
    <tbody th:each="comment:${article.commentList}">
    <tr>
        <td th:text="${comment.id}"></td>
        <td th:text="${comment.author}"></td>
        <td th:text="${comment.content}"></td>
    </tr>
    </tbody>
</table>

</body>
</html>

Article.java:

package springbootsy.sy2.domain;

import java.util.List;

public class Article {
    private int id;
    private String title;
    private String content;
    private List<Comment> commentList;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public List<Comment> getCommentList() {
        return commentList;
    }

    public void setCommentList(List<Comment> commentList) {
        this.commentList = commentList;
    }

    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", commentList=" + commentList +
                '}';
    }
}

 Comment.java:

package springbootsy.sy2.domain;

public class Comment {
    private int id;
    private String content;
    private String author;
    private int aId;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getaId() {
        return aId;
    }

    public void setaId(int aId) {
        this.aId = aId;
    }

    @Override
    public String toString() {
        return "Comment{" +
                "id=" + id +
                ", content='" + content + '\'' +
                ", author='" + author + '\'' +
                ", aId=" + aId +
                '}';
    }
}

ArticleMapper.xml:

<?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>及<mapper>中内容自行补充-->
<mapper namespace="springbootsy.sy2.mapper.ArticleMapper">

    <resultMap id="articleWithComment" type="Article">
        <id property="id" column="id"/>
        <result property="title" column="title"/>
        <result property="content" column="content"/>
        <collection property="commentList" ofType="Comment">
            <id property="id" column="cid"/>
            <result property="content" column="bcontent"/>
            <result property="author" column="author"/>
            <result property="aId" column="a_id"/>
        </collection>
    </resultMap>

    <select id="findById" parameterType="Integer" resultMap="articleWithComment">
        select a.*,b.id as cid ,b.content as bcontent ,author,a_id
        from t_article a left join t_comment b
                                   on a.id=a_id
        where a_id=#{id}
    </select>

    <select id="findAll" parameterType="Integer" resultMap="articleWithComment">
        select *
        from t_article
    </select>


</mapper>

ArticleMapper.java:

package springbootsy.sy2.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import springbootsy.sy2.domain.Article;

import java.util.List;

@Repository
@Mapper
public interface ArticleMapper {
    public Article findById(int id);
    public List<Article> findAll();
}

MyConfig.java:

package springbootsy.sy2.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registraty){
        registraty.addViewController("/article/findAll").setViewName("articleDetail");
    }
}

ArticleController.java:

package springbootsy.sy2.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import springbootsy.sy2.domain.Article;
import springbootsy.sy2.mapper.ArticleMapper;

import java.util.List;

@Controller
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    private ArticleMapper articleMapper;

    @GetMapping("/findAll")
    public  String findAll(Model model){
        List<Article> articleList = articleMapper.findAll();
        model.addAttribute("articleLists",articleList);
        return "articleList";
    }

    @GetMapping("/findById")
    public String findById(int id,Model model){
        Article article = articleMapper.findById(id);
        model.addAttribute("article",article);
        return "articleDetail";
    }
}

Sy2Application.java:

package springbootsy.sy2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Sy2Application {

    public static void main(String[] args) {
        SpringApplication.run(Sy2Application.class, args);
    }

}

访问网址:http://localhost:8080/article/findAll


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/724290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自制交流自动稳压器电路设计

目前在我国偏远的山区及农村&#xff0c;电网电压极不稳定&#xff0c;而且电压普遍偏低&#xff0c;有的电网电压只有 120V 左右。在这样的电网中&#xff0c;电视机及其它家用电器就无法正常使用了。市场上虽有较多的稳压器&#xff0c;但使用起来效果并不怎么好&#xff0c;…

Stable Diffusion 中Civitai站点模型管理助手

对于AI画画的读者来说&#xff0c;一旦开始使用Stable Diffusion&#xff0c;看到未曾使用过的模型&#xff0c;无法抑制下载的冲动。然而随着模型的堆积&#xff0c;整理及选择变得困难。此时Civitai Helper来解决这个问题。 文章目录 Civitai Helper插件安装模型信息模型更新…

Python WSGI 与 Web 开发框架

目录 文章目录 目录WSGIWSGI 的工作原理environ 参数start_resposne 参数 WSGI 的中间件 WSGI Web 开发框架OpenStack 中的应用案例进程入口WSGI Application 加载Paste/PasteDeployRoutesWebOb WSGI Server 启动 WSGI WSGI&#xff08;Web Server Gateway Interface&#xff…

【UE 材质】磨砂玻璃材质

效果 步骤 新建一个材质&#xff0c;这里命名为“M_FrostedGlass” 打开“M_FrostedGlass”&#xff0c;设置混合模式为半透明 添加如下节点&#xff1a; 创建一个材质实例 将材质实例赋予到一个mesh 打开材质实例&#xff0c;调整一下玻璃颜色和模糊值 原视频链接&#xff1a…

微信小程序UV、PV量解释以及接口调用频率

微信小程序UV、PV量 浏览量(PV)&#xff1a;即通常说的Page View(PV)&#xff0c;用户每打开一个网站页面就被记录1次。用户多次打开同一页面&#xff0c;浏览量值累计。微信小程序中PV是打开小程序的打开次数。 访客数(UV)&#xff1a;一天之内网站的独立访客数(以Cookie为依…

建立LIS系统需注意解决的问题

建立LIS需注意解决的问题 数据接收的可靠性&#xff1a;不管是采用硬件方式还是软件方式接收数据&#xff0c;保证接收过程数据不丢失或出现错误&#xff0c;是建立LIS首先要解决好的技术问题&#xff0c;否则就不是一个成功的LIS&#xff0c;缺乏实际的应用价值。 系统运行的…

vue3+vite使用particles.js

上效果&#xff1a; 1、安装vue3-particles 注意&#xff1a; 这里不能直接安装2.0以上的版本&#xff0c;否则界面无法出来。至于根本原因目前还没查到 # 通过以下命令可以发现当前所具有的版本 $ pnpm view vue3-particles versions [1.42.1, 1.42.2, 1.42.3, 1.42.4,1.43.…

【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(场景问题分析+性能影响因素)

一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战&#xff08;场景问题分析性能影响因素&#xff09; 常见的几个场景问题问题1&#xff1a;过期还是不过期缓存数据保证最终一致性 问题2&#xff1a;维度化缓存与增量更新通过维度化缓存优点和好处 问题3…

总在谈流程,却又做不好,问题出在哪?

时至今日&#xff0c;流程这个概念无论是在理论层面还是实践层面&#xff0c;都已为大家所熟知。 特别是随着华为的崛起&#xff0c;流程的吸引力与日俱增&#xff0c;为数不少的企业都在服用流程这剂灵丹妙药。 可是&#xff0c;真正搞明白流程概念的企业还不算多&#xff0…

win10开启远程桌面,win10开启3389端口

文章目录 前言一、不能远程桌面的原因1.1、系统设置未开启远程桌面功能1.2、开启防火墙3389端口1.3、开启3389端口 二、开启3389端口2.1、查看是否开启端口2.2、启动远程桌面服务2.3、远程连接administrator账号提示由于账户限制无法登录 三、其他 前言 最近重装了一下小主机系…

Unity 非父子物体保持相对静止

非父子物体保持相对静止 &#x1f354;效果&#x1f96a;食用 &#x1f354;效果 保持两个非父子关系的物体坐标、旋转相对静止 &#x1f96a;食用 插件下载 using System.Collections; using System.Collections.Generic; using UnityEngine;namespace ZYF {public class…

IntelliJ IDEA路径里面的反斜杠变成了其他符号解决办法

IntelliJ IDEA里面配置任何路径的时候路径里面的反斜杠分隔符变成了其他符号解决办法。 问题如图&#xff1a; 路径都变成了W加删除线。 原因&#xff1a; 字体设置问题&#xff0c;字体把斜杠转义了。 解决&#xff1a; 别用Gothic的相关字体&#xff0c;换成其他字体即…

如何在可视化页面中保证数据安全?Sugar BI通过URL参数标识用户,灵活实现用户权限

公开分享之后的大屏/报表页面中&#xff0c;由于不需要用户登录账号&#xff0c;因此页面中 数据模型的行级别权限、SQL 建模中嵌入用户邮箱、API 后端获取当前登录用户 这些需要用户登录账号才能进行的权限限制功能都不可用。 但是在一些场景下&#xff0c;是期望这些权限功能…

滴水逆向三期笔记与作业——02C语言——04 IF语句逆向分析上

OneNote防丢失。 海哥牛逼。 IF语句逆向分析上 一、内存图二、如何判断函数的参数2.1 一般情况 三、if的汇编案例根据汇编还原if 四、作业 一、内存图 二、如何判断函数的参数 2.1 一般情况 三、if的汇编 案例 根据汇编还原if 四、作业 海哥牛逼。

macbook安装chatglm2-6b

1、前言 chatglm安装环境还是比较简单的&#xff0c;比起Stable diffusion安装轻松不少。   安装分两部分&#xff0c;一是github的源码&#xff0c;二是Hugging Face上的模型代码&#xff1b;安装过程跟着官方的readme文档就能顺利安装。以下安装内容&#xff0c;绝大部分是…

自然语言处理:多层感知机MLP和Word2vec

文章目录 多层感知机MLP1.神经网络2.反向传播算法3.激活函数4.损失函数5.神经网络的使用场景 Word2vec参考 多层感知机MLP 1.神经网络 神经网络是一种计算模型&#xff0c;它受到人脑神经元之间连接和信息处理方式的启发。它由许多简单的处理单元&#xff08;称为神经元或节点…

初始Liunx线程

文章目录 前言1.初始Liunx下线程2.关于虚拟地址的补充知识3.线程的相关特点1.线程的优点2.线程的缺点3.线程异常4.线程和进程的比较 4.线程相关操作接口线程控制相关接口 5.关于线程id的理解 前言 本文主要是对Liunx之下线程的前置知识铺垫&#xff0c;同时也是对之前进程的相…

Spring Boot 中的认证是什么,如何使用

Spring Boot 中的认证是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;认证是一项重要的安全措施。Spring Boot 提供了丰富的认证机制&#xff0c;可以帮助我们轻松地实现各种认证需求。本文将介绍 Spring Boot 中的认证是什么&#xff0c;以及如何使用 Spring Boot…

2023上半年软考系统分析师科目一整理-16

2023上半年软考系统分析师科目一整理-16 信息系统的性能评价指标是客观评价信息系统性能的依据&#xff0c;其中&#xff0c;&#xff08; &#xff09;是指系统在单位时间内处理请求的数量。 A.系统响应时间 B.吞吐量 C.资源利用率 D.并发用户数 运用互联网技术&#xff0c;在…

软件工程——第7章实现知识点整理

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.实现由哪两个部分组成&#xff1f; 2.编码是什么&#xff1f;所选用的程序设计语言对程序的哪些特性有着深远影响&#xff1f; 3.软件测试在软件生…