学习笔记14——Springboot以及SSMP项目

2023-12-26 16:44

本文主要是介绍学习笔记14——Springboot以及SSMP项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SpringBoot

  • Springboot项目

    • IDEA2023只能创建jdk17和21的springboot项目解决 - 嘿嘿- - 博客园 (cnblogs.com)
    • 解决IntelliJ IDEA2022.03创建包时,包结构不自动分级显示的问题_idea建包不分级-CSDN博客
    • IDEA调出maven项目窗口_idea maven窗口-CSDN博客
  • 相比于spring的特点

    • parent:定义了几百个不冲突的版本信息和坐标,继承parent模块,直接使用就可以避免多个依赖版本冲突

      <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
      
    • starter:将一些常用的组合依赖坐标打包,简化每次配置xml的难度

    • 引导类:之前的main就是加载配置类springconfig,现在的入口直接就是一个配置类@SpringBootApplication,启动后创建并初始化spring容器,并默认扫描当前配置类所在包以及子包

    • 内嵌Tomcat:将tomcat服务器以对象的形式在spring容器运行起来,然后程序(别的对象)要在tomcat中运行

      		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
      
  • 配置、属性的修改【properities、yml、yaml】和不同读取【定义对象挨个value接收、用Environment对象整个接收,定义同样结构的对象@ConfigurationProperties 接收】

    • Common Application Properties (spring.io)

      # 对Application启动的容器中的tomcat属性进行修改
      server.port=80
      # 如果对应的包没有导入,那么这里的properities设置也会无效
      
    • 三种配置格式(properties > yml > ymal):共存叠加并相互覆盖,是所有配置的并集

      likes:- game- music- sleeplikes: [game,music,sleep]
      
    • 在这里插入图片描述

    • 在这里插入图片描述

  • 读取

    # 取变量值
    @Value("${country}")
    private String country;# 取对象的属性
    @Value("${User.name}")
    private String name;@Value("${likes[1]}")
    private String likes1;# 遇到数组用中括号
    @Value("${User[1].age}")
    private String age1;
    
  • 解决yaml的数据相互引用

    baseDir: c:\windows
    tempDir: ${baseDir}\temp# 转义\为制表位,加上双引号
    tempDir: "${baseDir}\temp"
    
  • 一次性加载到Environment对象中,不需要每次新建对象接收

    # 将属性数据封装成对象,通过Autowired自动装配@Autowired
    private Environment env;
    
  • 主流加载:对应的数据加载到对应的类中

    • 创建一个类,对应于ymal中的封装数据,给出set和get方法

    • 将该类定义为component

    • 指定加载yaml中的哪个数据

    • 该对象的属性得到对应的值

    • server就是这种类型

      @Component
      @ConfigurationProperties("datasource")
      

整合第三方配置

  1. junit【不需要勾选】

    • Test类需要加@SpringBootTest

    • 在Test类中直接装在对象进行测试

    • 两种情况

      • Test先在自己所属包范围下(上下两个层级都找)配置类,找到就装载
        • 如果test类和启动类不在同一个包下,那么就需要@SpringBootTest(classes = SpringbootJunitApplication.class)告诉配置类在哪里
  2. Mybatis【需要勾选mybatis framework 和 MySQL driver】

    • 导入包
    • 配置信息 【和tomcat一样,到这一步已经有了tomcat-spring/mybatis-spring对象了】
    • 用@Mapper来映射dao层
  3. Mybatis-plus

    • 导入包,可以手动去mvn网站去添加

    • 配置信息

    • Mapper映射(dao层可以简写,用BaseMapper映射到具体库中的表上)

      @Mapper
      public interface BookDao extends BaseMapper<Book> {
      }# 如果对象叫Book,但是表不叫这个名,就需要配置,就会默认在对象名字前加tbl找到表
      mybatis-plus:global-config:db-config:table-prefix: tbl_
      
  4. Druid【配合Mybatis使用】

    • 导入对应start包
    spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: rootpassword: 123456
    

SSM结构流程

  • 深入剖析 MVC 模式与三层架构_jsp的mvc三层架构-CSDN博客

  • 配好需要的包:springweb,mybatisplus+druid+Lombok

  • 配置,一般这里需要配置的是jdbc/durid的datadriver,配置mybatis的prefix,配置服务器端口号

  • domain+Lombok:新建数据库对象,作为操作的基本返回

    • @Getter
    • @Setter
    • @Data:最常用
  • 写Dao层的语句(两种方法写操作,并将操作mapper到数据库,对于每个操作都需要在test测试)

    • mybatis-plus :@Mapper + extends BaseMapper

      // 操作对象是Book,表是prefix+Book
      @Mapper
      public interface BookDao extends BaseMapper<Book> {
      }
      
      // 如果是分页功能@Testvoid testGetPage(){IPage page = new Page(1,5);bookDao.selectPage(page,null);}// 需要加配置器,动态拼接SQL语句
      @Configuration
      public class MPConfig {// 拦截器// 传入要拦截的对象,此处是分页功能@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
      }
      
      // 查询功能
      @Testvoid testGetBy(){QueryWrapper<Book> qw = new QueryWrapper<>();qw.like("name","Spring");bookDao.selectList(qw);}// 不需要记住列名,直接通过Book调用@Testvoid testGetBy2(){LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();lqw.like(Book::getName,"Spring");bookDao.selectList(lqw);}// 都有动态条件拼装,name为空就不拼接筛选条件@Testvoid testGetBy2(){String name = null;LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<>();lqw.like(name!=null,Book::getName,name);bookDao.selectList(lqw);}
      
    • mybatis:@Mapper + 自己写语句

      @Mapper
      public interface BookDao {@Select("select * from tbl_book where id = #{id}")Book getById(int id);
      }
      
  • 业务层Service

    • 业务层接口

    • 业务层实现类

    • // 分页:返回值bookDao.selectPage和IPage<Book>是一样的@Overridepublic IPage<Book> getPage(int currentPage, int pageSize) {IPage page = new Page(currentPage,pageSize);return bookDao.selectPage(page,null);}
      
    • public interface IBookService extends IService<Book> {// 可以自己新增方法// 不要覆盖原始操作
      }@Service
      public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements IBookService {
      }// 以上写法,就可以直接开启下边的测试
      @Testvoid testGetPage(){IPage<Book> page = new Page<>(1,4);bookService.page(page);System.out.println(page.getRecords());}
      
  • 表现层

    • @RestController
      @RequestMapping("/books")
      public class BookController {@Autowiredprivate IBookService bookService;@GetMappingpublic List<Book> getAll(){return bookService.list();}@PostMappingpublic Boolean save(@RequestBody Book book){return bookService.save(book);}@PutMappingpublic Boolean update(@RequestBody Book book){return bookService.updateById(book);}@DeleteMapping("{id}")public Boolean delete(@PathVariable int id){return bookService.removeById(id);}@GetMapping("{id}")public Book getById(@PathVariable int id){return bookService.getById(id);}@GetMapping("{currentPage}/{page}")public IPage<Book> getPage(@PathVariable int currentPage, @PathVariable int page){return bookService.getPage(currentPage,page);}
      }
      
  • 异常处理:利用AOC来拦截所有异常,统一进行处理,要添加@RestControllerAdvice,设置该类为切面类可以被扫描到

    • @ExceptionHandler(Exception.class)public R deException(Exception ex){// 控制台要写报错信息ex.printStackTrace();return new R("服务器故障");}// 没有遇到异常,正常执行时
      // 所有消息提示应该来自于同一层,不要前后端各自定义
      Boolean flag = bookService.save(book);
      return new R(flag,flag? "添加成功":"添加失败");
      
  • el分页组件

    • // 每次需要更新页面的信息,不然就一直会是初始值		axios.get("/books/"+this.pagination.currentPage+"/"+this.pagination.pageSize+param).then((res)=>{this.pagination.pageSize = res.data.data.size;this.pagination.currentPage = res.data.data.current;this.pagination.total = res.data.data.total;this.dataList = res.data.data.records;});// 防止删页问题
      @GetMapping("{currentPage}/{pageSize}")public R getPage(@PathVariable int currentPage, @PathVariable int pageSize){IPage<Book> page = bookService.getPage(currentPage,pageSize);if (currentPage>page.getPages()){page = bookService.getPage((int) page.getPages(),pageSize);}return new R(true,page);}
      
  • 查询功能

    • v-model:就是拿Vue的data中的数据进行填充或者给到这个值,建立==关系

    • 根据拿到的值,按照规定传参:路径+实体类直接传参

      @GetMapping("{currentPage}/{pageSize}")public R getPage(@PathVariable int currentPage, @PathVariable int pageSize,Book book)
      
    • 利用LambdaQueryWrapper进行查询

      @Overridepublic IPage<Book> getPage(int currentPage, int size, Book book) {LambdaQueryWrapper<Book> lqw = new LambdaQueryWrapper<Book>();lqw.like(!book.getType().isEmpty(),Book::getType,book.getType());lqw.like(!book.getName().isEmpty(),Book::getName,book.getName());lqw.like(!book.getDescription().isEmpty(),Book::getDescription,book.getDescription());IPage<Book> page = new Page<>(currentPage,size);bookDao.selectPage(page,lqw);return page;}
      

like(!book.getType().isEmpty(),Book::getType,book.getType());
lqw.like(!book.getName().isEmpty(),Book::getName,book.getName());
lqw.like(!book.getDescription().isEmpty(),Book::getDescription,book.getDescription());
IPage page = new Page<>(currentPage,size);
bookDao.selectPage(page,lqw);
return page;
}
```

这篇关于学习笔记14——Springboot以及SSMP项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540147

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template