栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

最新Springboot详解和项目训练

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最新Springboot详解和项目训练

文章目录
      • SpringBoot入门案例
      • 隐藏文件或文件夹
      • 入门案例解析:parent
      • starter
      • 引导类
      • 内嵌tomcat
      • 复制模块
      • 基础配置
      • 属性提示消失解决方案
      • yaml数据格式
      • yml读取数据
      • yaml文件中的变量引用
      • 读取yaml全部属性数据
      • 读取yaml引用类型属性 数据
      • SpringBoot整合JUnit
      • SpringBoot整合MyBatis
      • SpringBoot整合MyBatis常见错误
      • SpringBoot整合mybatis plus
      • 整合Druid
      • SSMP整合案例制作分析
      • 模块创建
      • 实体类快速开发(lombok)
      • 数据层标准开发
      • 开启MP运行日志
      • 分页查询
      • 数据层标准开发(条件查询)
      • 业务层标准开发(基础CRUD)
      • 业务层快速开发
      • 表现层基础开发
      • 表现层数据一致性处理 (R对象)
      • 前后端调用(axios发送)
      • 列表功能
      • 添加功能
      • 删除功能
      • 修改功能 (加载数据)
      • 修改功能
      • 异常消息处理
      • 分页功能
      • 分页功能维护
      • 条件查询

SpringBoot入门案例

SpringBoot入门案例 (idea联网版)

  1. 建立一个空项目

  1. 确定当前Maven的版本

  1. 创建模块

选择Spring Initializr,选择jdk版本,其他都不用动,选择当前模块使用的技术集

选择Spring web

  1. 界面如下

  1. 写一个简单的类。然后运行,开发控制器类
package controller;


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//Rest模式
@RestController
@RequestMapping("/books")
public class BookController {
        @GetMapping 
        public String getById(){
            System.out.println("spingboot is runing..");
            return "springboot is running";
    }

}

运行成功

  1. 在网页中打开

到目前为止一个最简单的boot程序已经完成

这两个文件就组成了整体的结构

springboot对比spring的优点:就只需要写一个控制类。

最重要的一点是springboot需要联网操作

小结

  1. 开发SpringBoot程序可以根据向导进行联网快速制作
  2. SpringBoot程序需要基于JDK8进行制作
  3. SpringBoot程序中需要使用何种功能通过勾选选择技术
  4. 运行SpringBoot程序通过运行Application程序入口进行

SpringBoot创建 (idea不能联网,官网创建)

  1. 搜索spring官网

  2. 拉到最下面,点击Spring Initializr

  1. 填完后,点击添加依赖包,搜索web

  1. 点击下载springboot工程

  1. 把压缩目录复制到对应idea springboot目录中

  1. 在idea中将工程导入其中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z11IiGRT-1641018122084)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112251244884.png)]

  1. 创建完之后,我们将之前的control包复制下来,查看是否运行成功,出现springboot is running…2

  1. 运行完后,表示成功


springboot创建 (阿里云版)

  1. 点击新创建项目

  1. 测试

总结:国内访问spring官网可能回很慢,可以使用阿里云的网站,速度回变快


隐藏文件或文件夹
  1. 找到file types

  1. 文件中.mvn就消失了


入门案例解析:parent

SpringBoot简介

  • SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
  • Spring缺点
  1. 依赖设置繁琐
  2. 配置繁琐
  • SpringBoot程序优点
  1. 起步依赖
  2. 自动配置
  3. 辅助功能

小结:

  1. 开发SpringBoot程序要继承spring-boot-starter-parent
  2. spring-boot-starter-parent中定义了若干个依赖管理
  3. 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
  4. 继承parent的形式也可以采用引入依赖的形式实现效果(阿里云版)

starter
  • starter是springboot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
  • aprent所有SpringBoot项目要继承的项目,定义了若干个坐标版本号,以达到减少依赖冲突的目的
  • spring-boot-starter-parent各版本间存在着诸多坐标版本不同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tnHSRY7x-1641018122089)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271900273.png)]


引导类
  • 启动方式
@SpringBootApplication
public class SpringBoot0101QuickstartApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext ctx = SpringApplication.run(SpringBoot0101QuickstartApplication.class, args);
        BookController bean=ctx.getBean(BookController.class);
        System.out.println("bean====>"+bean);
    }

}
  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean

内嵌tomcat

变更依赖包

小结:

  1. 内嵌Tomcat服务器是SpringBoot辅助之一
  2. 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将对象交给Spring容器管理
  3. 变更内嵌服务器思想是取出现在服务器,添加全新服务器

复制模块
  • 原则
    • 保留工程继承结构
    • 抹掉原始工程痕迹
  1. 复制目录
  2. 修改pom.xml文件中的artifactId

  1. 导入项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EG7YOguZ-1641018122091)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271949920.png)]

  1. 修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rCTOEfo-1641018122091)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112271954490.png)]

小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cGAxbRvJ-1641018122092)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112272012263.png)]


基础配置
  • 属性配置
  1. 找到application.properties文件。application.properties是springBoot默认文件,通过键值对配置对应属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rIjNll0g-1641018122092)(https://cdn.jsdelivr.net/gh/1wenjinjie/picture/img/202112272014305.png)]

  1. 修改端口

  1. 查看

  • springboot提供了多种属性配置方式
  1. application.properties
server.port=80
  1. application.yml
server:
	port:81
  1. application.yaml
server:
	port:82

属性提示消失解决方案
  1. 打开项目结构


yaml数据格式
  • yaml是一种数据序列格式
  • 优点
  1. 容易阅读
  2. 容易与脚本交互
  3. 以数据为核心,重数据轻格式
  • YAML文件扩展名

1 .yml(主流)

2 .yaml


yml读取数据
  • 使用@value读取单一数据,属性名引用方式:${一级属性名,二级属性名…}


yaml文件中的变量引用
  • 引用格式读取数据


读取yaml全部属性数据
  • 封装全部数据到Environment对象


读取yaml引用类型属性 数据
  • 自定义对象封装指定数据

  • 例如

  • 创建类

  • 写类

package com.itheima.springboot_01_02quickstart;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

//1.定义数据模型封装yaml文件对应的数据
//2.定义spring管控的bean
@Component
//3.指定加载的数据
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource {
    private String driver;
    private String url;
    private String username;
    private String password;

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "MyDataSource{" +
                "driver='" + driver + ''' +
                ", url='" + url + ''' +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                '}';
    }
}
// datasource:
//         driver: com.mysql.jdbc.Driver
//         url: jdbc:mysql://localhost/springboot_db
//         username: root
//         password: root666
  • 在control类中加载,并打印

小结:

  1. 使用@ConfigurationProperties注解绑定配置信息到封装类
  2. 封装类需要定义为Spring管理的bean,否则无法进行属性注入

SpringBoot整合JUnit
  • 创建新模块

  • 找类,该类可以整合junit

小结:

  • springboot中的classes

小结:


SpringBoot整合MyBatis
  1. 需要勾选依赖项

  1. 将配置文件改为.yml结尾

  1. 写配置文件连接数据库

  1. 建立数据层和实体类
  • 实体类

package com.itheima.domain;

public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;

    public Integer getId() {
        return id;
    }

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

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", type='" + type + ''' +
                ", name='" + name + ''' +
                ", description='" + description + ''' +
                '}';
    }
}

  • 数据层接口
package com.itheima.dao;

import com.itheima.domain.Book;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;


@Mapper
public interface BookDao {
   @Select("select * from tbl_book where id= #{id}")
    public Book getById(Integer id);
}

  • 测试类
package com.itheima.springboot_05_mybitis;

import com.itheima.dao.BookDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Springboot05MybitisApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void contextLoads() {
        System.out.println(bookDao.getById(1));
    }

}

小结:

  1. 勾选MyBatis技术,也就是导入MyBatis对应的starter
  2. 数据库连接相关信息转换成配置
  3. 数据库SQL映射需要添加@Mapper被容器识别到

SpringBoot整合MyBatis常见错误
  1. 如果将版本降低

SpringBoot整合mybatis plus
  1. 使用阿里云服务器

  1. 通过官网创建
  • 先创建普通的项目(需要勾选1个mysql driver)

  • 然后去maven官网找

  • 添加依赖

  • 在.yml文件中设置Mp相关配置
#2.??????
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    username: root
    password: 123456
    #设置Mp相关的配置
mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_


  • 定义数据层接口与映射配置,继承baseMapper

小结:


整合Druid
  1. 创建项目,和之前一样勾选两个

  2. 导入依赖包坐标

  1. 配置druid在application.yml(两种方式)

小结:

  1. 整合Druid需要导入Druid对应的starter
  2. 根据Druid提供的配置方式进行配置
  3. 整合第三方技术通用方式
  • 导入对应的starter
  • 根据提供的配置格式,配置非默认值对应的配置项

SSMP整合案例制作分析

总体:

  • SSMP案例制作流程解析
  1. 先开发基础CRUD功能,做一层测一层
  2. 调通页面,确认异步提交成功后,制作所有功能
  3. 添加分页功能与查询功能

模块创建
  • 创建项目

  1. 修改pom.xml文件

  1. 在pom.xml文件中手动添加德鲁伊和mybatis plus依赖包

  1. 修改配置文件为.yml

实体类快速开发(lombok)
  • Lombok,一个Java类库,提供了一组注解,简化POJO实体类开发

  • 如何使用

  1. 在pom.xml中添加lombok依赖包

  1. 在POJO实体类添加@Data注解,,提供了get/set方法,toString方法,hashode方法,equals方法等


数据层标准开发
  1. 配置.yml文件

  1. 用Mp形式创建接口,继承于baseMapper

  1. 在test目录下创建测试类
package com.itheima.springboot_08_ssmp.dao;


import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookDaoTest {

    @Autowired
    private BookDao bookDao;


    @Test
    void testGetId(){
        System.out.println(bookDao.selectById(5));
    }
    @Test
    void testSave(){
        Book book = new Book();
        book.setType("测试数据123");
        book.setName("测试数据123");
        book.setDescrption("测试数据123");
        bookDao.insert(book);
    }
    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(9);
        book.setType("测试数据123aaa");
        book.setName("测试数据123");
        book.setDescrption("测试数据123");
        bookDao.updateById(book);
    }
    @Test
    void testDelete(){
    bookDao.deleteById(10);
    }
    @Test
    void testGetAll(){

        System.out.println(  bookDao.selectList(null));
    }
    @Test
    void testGetPage(){

    }
    @Test
    void testGetBy(){}
}

小结:

  • 手工导入starter坐标两个 mybatisplus和druid
  • 配置数据源与MyBatis-plus对应配置
  • 开发Dao接口 继承与baseMapper
  • 制作测试类测试Dao功能是否有效

开启MP运行日志
  1. 在.yml文件下添加


分页查询
  • 测试方法
  @Test
    void testGetPage(){
        IPage page = new Page(2,5);
        bookDao.selectPage(page,null);

    }
  • 写个配置类,分页拦截器
package com.itheima.config;


import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration  //配置类
public class MPconfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());  //分页拦截器
        return interceptor;

    }
}


数据层标准开发(条件查询)
  1. 使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装方法调用

  2. 所有查询操作封装成方法调用

  3. 查询条件支持动态条件拼装

 @Test
    void testGetBy(){
        QueryWrapper qw = new QueryWrapper();
        qw.like("name","spring");
        bookDao.selectList(qw);

    }


    @Test   //使用Lambda表达式减少写错
    void testGetBy2(){

        String name = "spring";
        LambdaQueryWrapper lqw=new LambdaQueryWrapper();

        lqw.like(name!=null,Book::getName,name);
        bookDao.selectList(lqw);

    }

业务层标准开发(基础CRUD)

业务层开发

  • Service层接口与数据层接口定义具有较大区别,不要混淆
  • selectByUserNameAndPassword(String username,String password);
  • login(String username,String password);
  1. 定义接口
package com.itheima.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.domain.Book;

import java.util.List;

public interface BookService {
    Boolean save(Book book);
    Boolean update(Book book);
    Boolean delete(Integer id);
    Book getById(Integer id);
    List getAll();
    IPage getPage(int currentPage,int pageSize);
}

  • 实现类定义
package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.dao.BookDao;
import com.itheima.domain.Book;
import com.itheima.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service   //业务层对应的bean
public class BookServiceImpl  implements BookService {

    //转调数据层,进行注入
    @Autowired
    private BookDao bookDao;

    @Override
    public Boolean save(Book book) {
		//将业务状态设置为操作是否完成
        return bookDao.insert(book)>0;
    }

    @Override
    public Boolean update(Book book) {
        return bookDao.updateById(book)>0;
    }

    @Override
    public Boolean delete(Integer id) {
        return bookDao.deleteById(id)>0;
    }

    @Override
    public Book getById(Integer id) {
        return bookDao.selectById(id);
    }

    @Override
    public List getAll() {
        return bookDao.selectList(null);
    }

    @Override
    public IPage getPage(int currentPage, int pageSize) {
        IPage page = new Page(currentPage,pageSize);
         bookDao.selectPage(page,null);
         return page;
    }
}

  • 测试类

package com.itheima.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookServiceTestCase {
    @Autowired
    private BookService bookService;

    @Test
    void testGetById(){  //业务层需要打印出来
        System.out.println(bookService.getById(4));
    }

    @Test
    void testSave(){
        Book book = new Book();
        book.setType("测试数据122223");
        book.setName("测试数据123");
        book.setDescrption("测试数据123");
        bookService.save(book);
    }
    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(9);
        book.setType("测试123aaa");
        book.setName("测试数据123");
        book.setDescrption("测试数据123");
        bookService.update(book);
    }
    @Test
    void testDelete(){
        bookService.delete(10);
    }
    @Test
    void testGetAll(){

        bookService.getAll();
    }
    @Test
    void testGetPage(){
        IPage page = bookService.getPage(2, 5);

    }

}

小结:

  1. Service接口名称定义成业务名称,并与Dao接口名称进行区别
  2. 制作测试类测试Service功能是否有效

业务层快速开发
  • 使用MyBatisPlus提供有业务层通用接口(ISerivce)与业务层通用实现类(ServiceImpl)
  • 在通用类基础上做功能重载或功能追加
  • 注意重载时不用覆盖原始操作,避免元素提供的功能丢失
  1. 业务层通用接口

  1. 业务层通用实现类

  1. 测试类
package com.itheima.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class BookServiceTest {
    @Autowired
    private IBookService bookService;

    @Test
    void testGetById(){  //业务层需要打印出来
        System.out.println(bookService.getById(4));
    }

    @Test
    void testSave(){
        Book book = new Book();
        book.setType("测试数据122223");
        book.setName("测试数据123");
        book.setDescrption("测试数据123");
        bookService.save(book);
    }
    @Test
    void testUpdate(){
        Book book = new Book();
        book.setId(9);
        book.setType("测试123aaa");
        book.setName("测试数据123");
        book.setDescrption("测试数据123");
        bookService.updateById(book);
    }
    @Test
    void testDelete(){
        bookService.removeById(12);
    }
    @Test
    void testGetAll(){

        bookService.list();
    }
    @Test
    void testGetPage(){

        IPage page = new Page<>(2,5);
        bookService.page(page);
    }

}

小结:


表现层基础开发

表现层开发

  • 基于Restful进行表现层接口开发
  • 使用Postman测试表现层接口功能
  1. 功能测试

  • 表现层接口开发
 @Autowired
    private IBookService bookService;

    @GetMapping
    public List getAll(){
        return bookService.list();
    }
    @PostMapping
    public Boolean save(@RequestBody Book book){
        return bookService.save(book);
    }
    @PutMapping
    public Boolean update(@RequestBody Book book){
        return bookService.modifyBook(book);
    }
    @DeleteMapping("{id}")
    public Boolean delete(@PathVariable Integer id){
        return bookService.delete(id);
    }
    @GetMapping("{id}")
    public Book getById(@PathVariable Integer id){
        return bookService.getById(id);
    }
    @GetMapping("{currentPage}/{pageSize}")
    public IPage getPage(@PathVariable int currentPage,@PathVariable int pageSize){
        return bookService.getPage(currentPage, pageSize);
    }

小结:

  1. 基于Restful制作表现层接口
  • 新增:POST
  • 删除:DELETE
  • 修改:PUT
  • 查询:GET
  1. 接收参数
  • 实体数据:@RequestBody
  • 路径变量:@PathVariable

表现层数据一致性处理 (R对象)
  1. 设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议

  • 表现层接口统一返回值类型结果
    @Autowired
    private IBookService bookService;

    @GetMapping
    public R getAll(){

        return new R(true,bookService.list());
    }
    @PostMapping
    public R save(@RequestBody Book book){
        return new R(bookService.save(book));
    }
    @PutMapping
    public R update(@RequestBody Book book){

        return new R(bookService.modifyBook(book));
    }
    @DeleteMapping("{id}")
    public R delete(@PathVariable Integer id){

        return new R(bookService.delete(id));
    }
    @GetMapping("{id}")
    public R getById(@PathVariable Integer id){

        return new R(true,bookService.getById(id));
    }
    @GetMapping("{currentPage}/{pageSize}")
    public R getPage(@PathVariable int currentPage,@PathVariable int pageSize){

        return new R(true,bookService.getPage(currentPage, pageSize));

    }

小结:


前后端调用(axios发送)

前后端协议联调

  • 前后端分离结果设计中页面归属前端服务器
  • 单体工程中页面放在resource目录下的static目录(建立clean)
  1. 前端发送异步请求,调用后端接口

  1. 小结


列表功能

  1. 将查询数据返回到页面,利用前端数据双向绑定进行数据展示

添加功能
  1. 弹出添加窗口

  1. 清除数据

  1. 添加

小结:


删除功能
  • 删除,row是当前行数据

  • 删除,防止删除错误

  • 小结


修改功能 (加载数据)
  • 弹出窗口修改

  • 删除信息维护

小结:


修改功能

小结:


异常消息处理
  • 对于异常进行统一处理,出现异常后,返回指定消息

  • 修改表现层返回的模型类,封装出现异常后对应的信息

小结:


分页功能
  • 页面使用el分页组件添加分页功能

  • 定义分页组件需要使用的数据并将数据绑定到分页组件

  • 替换查询全部功能为分页功能

  • 分页查询

  • 加载分页数据

  • 分页页码切换

小结:


分页功能维护
  • 对查询结果进行校验,如果当前页码值大于最大页码值,使用最大页码作为当前页码值查询查询


条件查询
  • 查询条件数据封装
  1. 单独封装
  2. 与分页操作混合封装

  • 组织数据成为get请求发送的数据

  • 后台接收参数,controller接收参数

小结:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/691622.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号