SpringBoot学习笔记总结

发布于:2023-01-04 ⋅ 阅读:(559) ⋅ 点赞:(0)

创建SpringBoot项目
1、使用maven创建SpringBoot项目:
正常创建maven项目,在pom.xml文件中导入依赖
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
  
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2、使用 Spring Initializr 创建:
创建时选择版本和依赖,最后自动生成完整的目录结构,还有完整的 Maven 配置,并默认生成了一个名为 HelloworldApplication 的主启动程序。和使用maven创建的区别:不需要手动添加修改pom.xml配置文件

等待下载完成即配置成功,注意要将Application启动类的位置放在最外侧,即包含所有子包 ,无需打成war包,因为Application类的主方法已经嵌入tomcat ,只需启动Application类,在controller包中配置访问路径,如/hello,再在地址栏访问localhost:8080/hello  (   @ResponseBody注解直接在页面上返回String类型数据)

导入项目时跟ssm一样找到对于项目下面的pom.xml文件打开即可。使用Spring Initializr和使用maven创建的区别:Spring Initializr在创建项目时勾选依赖就行,不需要手动添加依赖到pom.xml,只需要在创建项目时勾选就行,会发现pom.xml已经将勾选的依赖导入,而maven创建项目时,需要手动添加依赖到pom.xml文件。
SpringBoot就是简化了配置,只注重业务逻辑,至于spring和springmvc的配置文件无需再去管,springboot内部已经集成或者说自动配置好了。原本ssm是1创建maven项目后,2在pom.xml中添加依赖,3再去resources中配置spring springmvc mybatis的各种配置文件。现在使用springboot只需进行1和2。Spring Initializr只是说创建项目完成时不需要动pom.xml文件,因为创建时已经自动勾选了,后续需要引入其它依赖时还是要配置pom.xml的

SpringBoot打包
使用mvn clean package命令就可以打成jar包,进入打包的jar目录(target目录),cmd执行java -jar 打包名如(springbootdemo-0.0.1-SNAPSHOT).jar即可运行项目,再在浏览器输入地址访问即可
未使用Springboot之前web项目都是打包成war包,并部署tomcat上运行,使用Springboot之后只需打包成jar包,运行jar包即可。(因为springboot内置了tomcat,所以springboot项目打包成jar可以免去tomcat的配置,如果是打包成war包,则需要配置tomcat。)
异常解决
1、 打包成功,运行jar报错 : 没有注清单属性
出现这种情况的原因 :pom.xml 没有引入 SpringBoot Maven插件 . (第一步 在pom.xml中添加SpringBoot Maven插件 )
注意 : 即使你没有引入 SpringBoot Maven 插件也可以构建成功。是因为 maven 本身可以构建成功。但是Maven并不知道你的项目入口在哪里。这就是为什么要引入 SpringBoot maven 插件的原因。
2、打包失败
maven 打包jar的时候是要覆盖之前的jar的。但是maven发现之前的jar正在被使用 , 无法进行删除覆盖操作。
解决办法 :
这种情况一般是因为此 jar 被打开 或者 被 启动中。 我们只要关闭了使用他的程序即可。 比如 : 关闭启动他的 DOS 窗口。 关闭打开他的压缩工具等等。

SpringBoot热部署(更改文件不需要重新启动项目,直接刷新)
1、pom.xml添加配置
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
        </dependency>
2、setting->Compiler->Build project automatically(打钩)
3、ctrl+shift+a搜索Registry找到选项Compiler autoMake allow when app running打勾
4、配置文件中加上spring.devtools.restart.enabled = true

SpringBoot异常处理(全局)
1、自定义异常类使用 @ControllerAdvice 注解该类,即可开启全局异常处理,使用该注解表示开启了全局异常的捕获。
2、使用 @ExceptionHandler 注解方法,定义捕获异常的类型即可对这些捕获的异常进行统一的处理 例如 NullPointerException 异常,则只需要@ExceptionHandler(value = {NullPointerException.class},所有类型异常只需@ExceptionHandler(value =Exception.class)。
3、在方法体中写对异常的处理,如统一跳转到error.html页面(当然也可根据异常类型,跳转不同页面,此处只阐述全局异常处理,不管类型),使注解的该方法返回 ModelAndView类型,即可跳转到错误页面(在resources/templates下定义)html页面用thymeleaf模板引擎(因为springboot使用thymeleaf,不使用jsp,需要在pom.xml中添加依赖),在html页面中取后端model的值${message}要配合th表达式来使用,不用的话浏览器会忽略未定义的 Thymeleaf 标签属性,展示静态效果。

SpringBoot配置端口号和上下文路径
常用的:配置文件最外面的优先级最大(对应3),其次resources下面的config下的配置文件(对应4),最后resources下面直接的配置文件(对应5),同样的配置使用优先级最大的,没有的取并集。
1、file:./config/*/    2、file:./config/    3、file:./    4、classpath:/config/    5、classpath:/
修改端口号,上下文路径或者其它配置,在配置文件中修改即可,如server.port=8888,server.servlet.context-Path= /test (跟tomcat配置中修改端口号和访问路径一样,tomcat是图形化配置界面鼠标点,这里是在配置文件中代码改)

SpringBoot通过核心配置文件来指定使用其它的配置文件,(比如有时候在本地测试是使用8080端口,可是上线使用的又是80端口。 此时就可以通过多配置文件实现多配置支持与灵活切换,免去了每次上线还要修改端口号的麻烦。)
3个配置文件:
核心配置文件:application.properties
开发环境用的配置文件:application-dev.properties
生产环境用的配置文件:application-pro.properties
这样就可以通过application.properties里的spring.profiles.active 灵活地来切换使用哪个环境了如spring.profiles.active=pro或者spring.profiles.active=dev
不仅可以通过修改application.properties文件进行切换,还可以在部署(打包jar包部署运行时)环境下,指定不同的参数来确保生产环境总是使用的希望的那套配置。如java -jar target/springboot-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro

springboot配置文件除了使用.properties外,还支持 .yml格式。
在application.yml 文件书写注意:
1. 不同“等级” 用冒号隔开
2. 次等级的前面是空格,不能使用制表符(tab)
3. 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着
application.yml看起来不如application.properties,要保持缩进还不能用tab,键值之间还需要保持一个空格。。。。。。 要么用application.properties 要么用 application.yml,不要都用,不要折磨Springboot和自己,看懂yml格式就行,主要目的还是为了读懂其他人的项目。

SpringBoot使用mybatis操作数据库
一:注解方式:
1、pom.xml文件中导入依赖 
 <!--导入数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--引入 mybatis-spring-boot-starter 的依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
2、配置文件application.properties中配置数据源信息
spring.datasource.url=jdbc:mysql://localhost/数据库名?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=limengqi0422
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
3、其它操作同之前的,entity controller services mapper各层正常写,
4、跳转到html显示要用th表达式
<tr th:each="user: ${user}">
    <span th:text="${user.userId}"></span>
    <span th:text="${user.userName}"></span>
    <span th:text="${user.email}"></span>
二、xml方式
1、同样导入依赖,
2、application.properties中除了添加数据源时,
添加mybatis.mapper-locations=classpath:com/hty/springbootdemo/mapper/*.xml  在mapper文件夹下创建对应的xml文件
mybatis.type-aliases-package=com.hty.springbootdemo.entity
指明去哪里找对应的xml文件和实体类
3、其它操作同之前的,entity controller services 各层正常写,mapper不使用注解,而是使用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 namespace="com.hty.springbootdemo.mapper.UserMapper">
    <select id="getByUserNameAndPasswordxml" resultType="User" >
            select * from user
        </select>
</mapper>
mapper 映射文件中 namespace 必须与对应的 mapper 接口的完全限定名一致。
mapper 映射文件中 statement 的 id 必须与 mapper 接口中的方法的方法名一致
mapper 映射文件中 statement 的 parameterType 指定的类型必须与 mapper 接口中方法的参数类型一致。
mapper 映射文件中 statement 的 resultType 指定的类型必须与 mapper 接口中方法的返回值类型一致。
4、报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
是因为:比如mybatis的mapper.xml文件,我们习惯把它和Mapper.java放在一起,都在src/main/java下面,maven认为src/main/java只是java的源代码路径,只编译java文件,不编译xml文件,所以需要在pom.xml<build></build>中添加如下配置
<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
 </resources>
5、跳转到html显示要用th表达式

注解和xml方式操作步骤差不多,导入依赖相同,xml配置数据源要配置xml和实体的位置,最后xml要在pom.xml<build></build>中添加编译mapper.xml的配置 
注意事项:
mapper 接口中的任何一个方法,都只能使用一种配置方式,即注解和 mapper 映射文件二选一,但不同方法之间,这两种方式则可以混合使用,例如方法 1 使用注解方式,方法 2 使用 mapper 映射文件方式。
我们可以根据 SQL 的复杂程度,选择不同的方式来提高开发效率。
如果没有复杂的连接查询,我们可以使用注解的方式来简化配置,因为可以省的配置mapper.xml文件,步骤少一点。
如果涉及的 sql 较为复杂时,则使用 XML (mapper 映射文件)的方式更好一些

JPA和Mybatis区别,JPA对于简单的crud已经写好了,不需要再写sql语句,高度解耦,使Dao层开发难度降低,效率提高。
1、添加依赖JPA和mysql
 <!--导入mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
2、JPA中对实体类注解,
@Entity 注解表示这是个实体类
@Table(name = "user") 表示这个类对应的表名是 user
@Id 表明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表明自增长方式
@Column(name = "id") 表明对应的数据库字段名 可以自动创建数据库表,
3、除了SpringBoot使用mybatis操作数据库中配置文件的配置外,还要再在配置文件中加上spring.jpa.properties.hibernate.hbm2ddl.auto=update表示会自动更新表结构,所以不需要用sql语句创建表这一步。
4、后创建dao接口UserDAO,继承了JpaRepository,并且提供泛型<User,Integer> 表示这个是针对User类的DAO,Integer表示主键是Integer类型。JpaRepository 这个父接口,就提供了CRUD, 分页等等一系列的查询了,直接拿来用,都不需要二次开发的了。
Mybatis中就正常使用,正常写sql语句就行,mybatis半自动ORM框架,用户无需关心如何配置,只需关注如何写sql语句,JPA只需直接调用即可。

jpa中自定义方法有命名规则,其JPA 条件查询方式很有意思,是不需要写 SQL 语句的,只需要在 dao 接口里按照规范的命名定义对应的方法名,及可达到查询相应字段的效果了。比如findByName,根据name 查询分类表, findByNameLikeAndIdGreaterThanOrderByNameAsc,根据名称模糊查询,id 大于某值, 并且名称正排序查询。其它命名规则可网上查询(虽然 JPA 没有自己手动写sql 语句,但是通过反射获取自定义的接口方法里提供的信息,就知道用户希望根据什么条件来查询了。 然后 JPA 底层再偷偷摸摸地拼装对应的 sql 语句,丢给数据库,就达到了条件查询的效果啦。)

分页中JPA和Mybatis区别
JPA自身有pageable类来帮助实现分页,所以不需要导入依赖,mybatis借助pagehelper插件,所以需要导入依赖
jpa主要就是修改controller类   mybatis除了需要修改controller,还有依赖导入,还有PageHelperConfig配置类,还有dao层CRUD的sql语句书写。 还有html页面th表达式的书写,jpa也要。
JPA和Mybatis的分页不同步骤对比,可见SpringBootDemo项目,可以根据需要将mybatis和jpa搭配使用(可以一起操作同一个实体,即同一张数据表,见Springbootdemo中的JpaAndMybatisController
) 。JPA方便之处就在于表与表之间关联不大的查询,多表建议mybatis,也可以一起用,通过调用不同的dao。比如简单的查询jpa中有的那就直接调用jpa的dao;复杂的sql,需要自己写sql的就调用mybatis的dao进行自己写。见Springbootdemo中的JpaAndMybatisController

thymeleaf th表达式书写
遍历:th:each="p:${ps}"  遍历ps传过来的对象或集合,p为别名。 遍历为select或者radio看how2j
如:<tr th:each="p: ${ps}">
                <td th:text="${p.id}"></td>
                <td th:text="${p.name}"></td>
                <td th:text="${p.price}"></td>
            </tr>
判断:th:if="${test}"  如:<p th:if="${test}" >如果test是 true ,本句话就会显示</p> 其中false,0,null都判断为false
显示:th:text="${p}"

thymeleaf 内置工具十六种
1、日期内置工具<p th:text="${#dates.format(now,'yyyy-MM-dd HH:mm:ss')}"></p> now是由后端controller中将Date加入model中的,可以在前端格式化日期,也可以在后端格式化好在传过来。具体如何使用根据业务选择
像 #date 这样的 thymeleaf内置工具有很多种,一共有如下16种。并不是每一种都用得到,所以这里把他们的用法手册列出来了,将来用到的时候再来查看就行了,(查看how2j)。
Execution Info    获取页面模板的处理信息
Messages        在变量表达式中获取外部消息的方法,与使用#{...}语法获取的方法相同
URIs/URLs    转义部分URL / URI的方法
Conversions    用于执行已配置的转换服务的方法
Dates        时间操作和时间格式化等
Calendars        用于更复杂时间的格式化
Numbers        格式化数字对象的方法
Strings        字符串工具类
Objects        一般对象类,通常用来判断非空
Booleans        常用的布尔方法
Arrays        数组工具类
Lists        List 工具类
Sets        Set 工具类
Maps        常用Map方法
Aggregates    在数组或集合上创建聚合的方法
IDs        处理可能重复的id属性的方法

在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
定义拦截器;注册拦截器;指定拦截规则(如果是拦截所有,静态资源也会被拦截)。
定义拦截器:创建一个拦截器类,并实现 HandlerInterceptor 接口即可。接口中共三个方法,需要在何时拦截就在对应的方法中提供方法体执行
注册拦截器:创建一个 MyMvcConfig实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。
指定拦截规则:修改 MyMvcConfig 配置类中 addInterceptors() 方法的代码,继续指定拦截器的拦截规则,拦截哪些放行哪些进行指定。
在指定拦截器拦截规则时,调用了两个方法,这两个方法的说明如下:
addPathPatterns:该方法用于指定拦截路径,例如拦截路径为“/**”,表示拦截所有请求,包括对静态资源的请求。
excludePathPatterns:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。

基本操作同springmvc,springboot中注册拦截器和指定拦截规则可合并,因为都是在同一类中。springmvc注册拦截器和指定拦截规则(其中配置了拦截的作用路径,不需要拦截的作用路径),也是都在xml配置文件中。区别就是springmvc中注册拦截器是在springmvc.xml配置文件中注册,springboot是创建配置类实现接口,在方法中注册拦截器。

单元测试
有时候呢,springboot 里要做单元测试,而不是直接跑起来。 比如 jpa 章节的查询数据,想跑个测试,看看数据库里的数据。
操作:导入junit和spring-boot-starter-test依赖,在src/test/java包下面建一个对应的test类,类加上@SpringBootTest,方法加上@Test,方法体中写要测的东西,运行测试类就可以在控制台看见效果

日志
在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析。Spring Boot 默认使用 SLF4J+Logback 记录日志,并提供了默认配置,即使我们不进行任何额外配,也可以使用 SLF4J+Logback 进行日志输出。日志配置比如输出格式,输出位置可在springboot的配置文件中配置
日志门面,日志抽象层,为 Java 日志访问提供一套标准和规范的 API 框架,其主要意义在于提供接口,如 SLF4J。    
日志实现,日志门面的具体的实现,如 Logback 。

Spring REST 风格可以简单理解为:使用 URL 表示资源时,每个资源都用一个独一无二的 URL 来表示(url前面同,但后面的method不同),并使用 HTTP 方法表示操作,即准确描述服务器对资源的处理动作(GET获取、POST提交、PUT修改、DELETE删除),实现资源的增删改查。即使用同一个url,但是约定不同的method来实施不同的业务,这就是Restful的基本考虑
以前用的注解叫做@RequestMapper,现在分别叫做 GetMapper, PutMapper, PostMapper 和 DeleteMapper 用于表示接受对应的Method 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到