学习笔记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

相关文章

Spring实现Bean的初始化和销毁的方式

《Spring实现Bean的初始化和销毁的方式》:本文主要介绍Spring实现Bean的初始化和销毁的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Bean的初始化二、Bean的销毁总结在前面的章节当中介绍完毕了ApplicationContext,也就

Java的"伪泛型"变"真泛型"后对性能的影响

《Java的伪泛型变真泛型后对性能的影响》泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法,这篇文章主... 目录1、真假泛型2、性能影响泛型存在于Java源代码中,在编译为字节码文件之前都会进行泛型擦除(ty

Java中的getBytes()方法使用详解

《Java中的getBytes()方法使用详解》:本文主要介绍Java中getBytes()方法使用的相关资料,getBytes()方法有多个重载形式,可以根据需要指定字符集来进行转换,文中通过代... 目录前言一、常见重载形式二、示例代码三、getBytes(Charset charset)和getByt

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

idea报错java: 非法字符: ‘\ufeff‘的解决步骤以及说明

《idea报错java:非法字符:‘ufeff‘的解决步骤以及说明》:本文主要介绍idea报错java:非法字符:ufeff的解决步骤以及说明,文章详细解释了为什么在Java中会出现uf... 目录BOM是什么?1. BOM的作用2. 为什么会出现 \ufeff 错误?3. 如何解决 \ufeff 问题?最

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约