通过Springboot +JPA+thymeleaf+MySQL+BootStrap写一个具有增删改查的系统 您所在的位置:网站首页 嵌套select用jpa怎么写 通过Springboot +JPA+thymeleaf+MySQL+BootStrap写一个具有增删改查的系统

通过Springboot +JPA+thymeleaf+MySQL+BootStrap写一个具有增删改查的系统

2023-07-10 14:52| 来源: 网络整理| 查看: 265

本篇项目是我根据我最近玩的游戏英雄联盟然后根据里面的一个小工具来写他们的位置

禁用率和登场率

首先写整个期末作业让我从什么都不懂到每个步骤 怎么样的思路我都看的很详细都能看懂

1:首先我创建了一个叫Hero的基本信息:包括名字、位置、禁用率、登场率

package com.example.demo.model; import jakarta.persistence.*; import lombok.Data; @Data @Entity @Table(name = "hero") public class Hero { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "name") private String name; @Column(name = "location") private String location; @Column(name = "Disable_rate") private String Disable_rate; @Column(name = "DAppearance_rate") private String Appearance_rate; }

2:业务逻辑层:里面实现了:获取指定id的英雄、新增/更新一个英雄、删除指定id的英雄,还有分页和通过位置查找英雄

package com.example.demo.repository; import com.example.demo.model.Hero; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface HeroRepository extends JpaRepository { @Query("select h from Hero h where h.location like %:location%") List findAllByHeroLocation(@Param("location") String location); }

3:控制层(Controller):接收用户的请求,调用相应的服务方法,并返回处理结果。

3.1接收和处理用户请求。当用户发起请求时,Controller层会根据请求的URL、HTTP方法等信息来判断请求的目标,并调用相应的方法进行处理。

3.2 调用Service层处理业务逻辑。当Controller需要进行业务逻辑处理时,会调用Service层的方法,Service层会根据具体业务需求进行相应的处理。

3.3 返回处理结果。Controller层在完成请求处理之后,会将处理结果封装成一个ModelAndView对象,然后将其发给前端页面进行显示。

3.4 控制页面跳转。当用户请求需要跳转到另一个页面时,Controller层负责选择正确的View并返回相应的ModelAndView,然后前端页面根据ModelAndView中的信息进行页面渲染,完成页面跳转。

*项目创建依赖包:Lombok+Mysql+thmyeleaf+JPA+Spring Web*

我的框架

我的过程是怎么写的思路是怎么样的呢:

1先连接数据库mysql 这样当你在网页上进行增删改查的时候会连接数据库这样你才能看到自己的功能在idea上有没有实现,先将代码写入application.properties(设置里面的ip和端口号 然后设置你的密码)

spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 spring.datasource.username= root spring.datasource.password= 123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # for Spring Boot 2 # spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect # for Spring Boot 3 spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQLDialect # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto= update #?????hibernate-sql logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type=TRACE

 

在里面的spring.jpa.hibernate.ddl-auto=updata:

指的是在启动应用时候,自动更新数据库的结构。

2创建我的model 层构建Hero类

这里我们添加了Data这样我们就不需要在用get与set、toString()等方法了大量减少了我们的时间。

我创建了id,英雄名字、位置、登场率和禁用率

package com.example.demo.model; import jakarta.persistence.*; import lombok.Data; @Data @Entity @Table(name = "hero") public class Hero { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(name = "name") private String name; @Column(name = "location") private String location; @Column(name = "Disable_rate") private String Disable_rate; @Column(name = "DAppearance_rate") private String Appearance_rate; }

3数据访问层(Repository)

在这里面我们添加了在我们后面需要用的查询方法 通过模糊查询的方式在我们的主页面进行位置的查询

package com.example.demo.repository; import com.example.demo.model.Hero; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface HeroRepository extends JpaRepository { @Query("select h from Hero h where h.location like %:location%") List findAllByHeroLocation(@Param("location") String location); }

4:业务逻辑层(Service)

在这里我们需要创建一个端口和一个执行层,端口里面是将我们写好的增删改查创造一个方法也是创造出一个参数让我们的执行层更加的好写,然后在IMpl中我们写了增删改查查询与分页的方法然后将Service传给我们的控制层去执行这些方法

package com.example.demo.service; import com.example.demo.model.Hero; import org.springframework.data.domain.Page; import java.util.List; public interface HeroService { List getAllHero(); //新增/更新一个员工 void saveHero(Hero hero); Hero getHeroById(long id); void deleteHeroById(long id); //分页 Page findPaginated(int pageNo, int pageSize, String sortField, String sortDirection); //查询 ListfindByHeroLocation(String location); }

package com.example.demo.service; import com.example.demo.model.Hero; import com.example.demo.repository.HeroRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; @Service public class HeroServiceImpl implements HeroService { @Autowired private HeroRepository heroRepository; @Override public List getAllHero() { return heroRepository.findAll(); } @Override public void saveHero(Hero hero) { this.heroRepository.save(hero); } @Override public void deleteHeroById(long id) { this.heroRepository.deleteById(id); } @Override public Page findPaginated(int pageNo, int pageSize, String sortField, String sortDirection) { //设置排序参数,升序ASC/降序DESC? Sort sort = sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(sortField).ascending() : Sort.by(sortField).descending(); //根据页号/每页记录数/排序依据返回某指定页面数据。 Pageable pageable = PageRequest.of(pageNo - 1, pageSize, sort); return this.heroRepository.findAll(pageable); } //通过位置查找 @Override public List findByHeroLocation(String location) { return heroRepository.findAllByHeroLocation(location); } @Override public Hero getHeroById(long id) { //调用数据访问层查找指定ID的员工,返回Optional对象 Optional< Hero > optional = heroRepository.findById(id); Hero hero = null; //如果存在指定id的员工 if (optional.isPresent()) { //从Optional对象中获取员工对象 hero = optional.get(); } else { //否则抛出运行时异常 throw new RuntimeException(" 找不到员工ID :: " + id); } return hero; } }

最后终于等到我们的控制层 ,其实在写整个项目的时候也是用了很多的时间,要将一个个的功能去一一实现然后才能往下面去写,比如在查询的时候就卡了很多天,通过上网查询的方式看别人是怎么写查询的方法。

5:控制层(controller):

控制层是MVC架构的接口处,是用来接受前端数据和返回页面请求消息的,然后当我们写好一个功能的时候我们通过@GetMapping注释的源代码将他传入后面的html中去,最后在html中写入页面就可以了

从上到下分别是新增、更新 删除、分页和查询

package com.example.demo.controller; import com.example.demo.model.Hero; import com.example.demo.service.HeroService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; @Controller public class HeroController { @Autowired private HeroService heroService; // @GetMapping("/") // public String viewHomePage(Model model) { // model.addAttribute("listHero", heroService.getAllHero()); // return "index"; // } @GetMapping("/") public String viewHomePage(Model model) { return findPaginated(1, "id", "asc", model); } @GetMapping("/showNewHeroForm") public String showNewGenieForm(Model model) { Hero hero = new Hero(); model.addAttribute("hero", hero); return "add_Hero"; } //保存英雄 @PostMapping("/saveHero") public String saveGenie(@ModelAttribute("hero") Hero hero) { heroService.saveHero(hero); return "redirect:/"; } @GetMapping("/showFormForUpdate/{id}") public String showFormForUpdate(@PathVariable(value = "id") long id, Model model) { Hero hero = heroService.getHeroById(id); // set employee as a model attribute to pre-populate the form model.addAttribute("hero", hero); return "updata_Hero"; } @GetMapping("/deleteHero/{id}") public String deleteEmployee(@PathVariable(value = "id") long id) { this.heroService.deleteHeroById(id); return "redirect:/"; } //获取分页数据 @GetMapping("/page/{pageNo}") public String findPaginated(@PathVariable(value = "pageNo") int pageNo, @RequestParam("sortField") String sortField, @RequestParam("sortDir") String sortDir, Model model) { int pageSize = 5; Page page = heroService.findPaginated(pageNo, pageSize, sortField, sortDir); List listHero = page.getContent(); model.addAttribute("currentPage", pageNo); model.addAttribute("totalPages", page.getTotalPages()); model.addAttribute("totalItems", page.getTotalElements()); model.addAttribute("sortField", sortField); model.addAttribute("sortDir", sortDir); model.addAttribute("reverseSortDir", sortDir.equals("asc") ? "desc" : "asc"); model.addAttribute("listHero", listHero); return "index"; } //按位置查询 @GetMapping("/find") public String findByHeroLocation(@RequestParam("location") String location, Model model){ List byHeroLocation = heroService.findByHeroLocation(location); model.addAttribute("byHeroLocation", byHeroLocation); return "find_result"; } }

通过一个个的方法写完其实就可以去写html看效果了不要一下子全部写完不然后面的话你们在找错误的时候真的很难找到

1:首先必须在resources中创建一个目录名为templates,然后将你写好的方法分别创建数据库我的模板是这样的:

里面分别是

新增功能、查找功能、index是主页面(里面写了更新与和删除)、与更新页面

Employee Management System 英雄管理系统 新增英雄 添加 返回英雄列表 >

 

查询:

查询我通过英雄位置的查询方式,在里面我写了一个晓得box是搜索框,

然后其他的就差不多将主页面的复制过来,仔细看你会看到很多相似之处

搜索结果 英雄列表 搜索英雄位置 添加英雄位置 英雄id 英雄名字 英雄位置 禁用率 登场率 操作 更新英雄 删除 返回英雄列表

更新功能:

Employee Management System 英雄管理系统 更新英雄 添加 返回英雄列表 >

主页面:index.html

在pom.xml文件中添加Thymeleaf的场景启动器spring-boot-starter-thymeleaf。

英雄管理系统 英雄列表 搜索英雄位置 添加英雄 英雄id 英雄名字 英雄位置 禁用率 登场率 操作 更新英雄 删除 Total Rows: [[${totalItems}]] [[${i}]] [[${i}]] ; ; Next Next Last Last

 

最终效果:

谢谢



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有