文章目录


1 引言

1.1 Spring 传统项目分析

<mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{核心:资源整合框架}

  • 资源小
  • 耦合小
  • 可扩展性大!

但是。
在传统的 spring 应用项目中:

  • 配置相对复杂(例如大量 xml )。
  • 依赖冲突严重( maven 依赖版本不同)。
  • 扩展相对复杂 (尤其是分布式部署,微服务架构)。

思考:如何让初级程序员从复杂的配置中解脱出来呢?

1.2 Spring 家族技术发展

Spring 诞生于2002年,成型于2003,目前已经发展到了 Spring5.x 版本,支持 JDK-11JavaEE8
现在的 spring 已经不仅仅是 framework ,还扩展了 spring bootspring cloud 等。

说明:学技术一定要了解技术发展史,并对技术的发展有一定的前瞻性。




文章目录


2 Spring Boot 简介

2.1 Spring Boot 概述

现在软件市场已经形成一定的规模,
系统从

  • 单体架构,
  • 分布式架构,
  • 再到微服务架构,

其整个架构体系正在发生很大变化,
企业现在更注重技术的<mark>开箱即用</mark>,更注重技术在<mark>生态圈</mark>中的深度<mark>融合</mark>,更注重<mark>轻量级的运维</mark>。

<mstyle mathcolor="&#35;f01"> s p r i n g b o o t </mstyle> \color{#f01}{由此spring boot诞生} springboot

2.2 Spring Boot 核心特性

Spring boot 构建于 Spring 框架基础之上,基于<mark>快速构建</mark>理念,提供了<mark>自动配置</mark>功能,可实现其<mark>开箱即用</mark>特性,可以简化整个项目的配置。

其核心主要包括如下几个方面:

  • 起步依赖(Starter Dependency)。
  • 自动配置(Auto Configuration)。
  • 健康检查(Actator)。

其中,Spring Boot官方地址为https://spring.io/projects/spring-boot


文章目录


3 Spring Boot 快速入门

3.1 初始环境配置

3.1.1 准备工作

工具下载

  1. 下载JDK1.8,并进行环境变量配置。
  2. 下载maven ( 例如apache-maven-3.6.2,网址 http://maven.apache.org/ ),并进行相关配置(本地库,***)。
  3. 下载 sts 最新版(例如 sts-4.4.2.RELEASE ,网址 https://spring.io/tools )。

工作区准备

定义新的工作区( <mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{要求没有中文目录} ),例如 d:/workspacests

3.1.2 Maven基本配置

打开 maven 中的 setting.xml 文件,并对其如下选项进行配置。

配置maven本地库,

<localRepository>${user.home}/maven/repository</localRepository>

配置maven***。

<mirror>
	<id>aliyun</id>
	<name>aliyun Maven</name>
	<mirrorOf>*</mirrorOf>
	<url>https://maven.aliyun.com/repository/central</url>
</mirror>

配置maven中的profile。

<profile>
      <id>jdk-1.8</id>
      <activation>
	    <activeByDefault>true</activeByDefault>
        <jdk>1.8</jdk>
      </activation>
      <properties>
	     <maven.compiler.source>1.8</maven.compiler.source>
		 <maven.compiler.target>1.8</maven.compiler.target>
		 <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
	  </properties>
 </profile>

3.1.3 STS整合maven配置

Maven Installations 配置, 如图-1所示:

Maven User Settings配置,如图-2所示:

项目工作区编码设置,如图-3所示

个人习惯,我gbk

3.1.4 STS工具使用基本优化

禁用拼写检查,取消图-4所示的拼写检查选项。

取消图-5所示的连接选项配置。

否则
Ctrl+v
Ctrl+c
时候会有卡顿

关掉图-6的校验功能。

否则可能会一直校验,导致无法编译

修改STS工具内存配置,打开SpringToolSuite4.ini文件,修改堆大小,如图-7所示:

堆内存越大越快(你电脑支持的话)

3.2 项目创建及结构分析

导入项目:如果是从 springboot 官网下载的模板,选择 Input Exist Maven Project
如果是已经存在的结构完整的目录,要导入,直接在 general 导入。

基于 STS 集成开发工具,创建 spring boot 项目,其具体步骤如下:

第一步:打开项目新建窗口(快捷键 ctrl+n), 搜索 spring ,选择 spring starter 项目。如图-8所示:

第二步:填写项目基本信息。如图-9所示:
<mstyle mathcolor="&#35;f01"> J a r </mstyle> \color{#f01}{注意选择 Jar 包} Jarwar包 现在越来越少用…

  • group
  • Artifact 项目名
  • package 包名 - 一般同 group

第三步:选择Spring Boot版本,如图-10所示:

3.3 项目业务初步实现及测试

业务描述:创建一个DefaultCache类然后交给spring 管理。

package com.cy.pj.common.cache;
@Component
@Scope("singleton")
public class DefaultCache {
	public Cache() {
	   System.out.println("cache()");
	}
	@PostConstruct
	public void init() {
		System.out.println("init()");
	}
	@PreDestroy
	public void destory() {
		System.out.println("destory");
	}
}

添加 springboot 测试类,进行 bean 的获取及测试。

@SpringBootTest
public class DefaultCacheTests {
	@Autowired
	private DefaultCache defaultCache;
	@Test
	public void testCache() {
		System.out.println(defaultCache);
	}
}

其中:

  • @SpringBootTest 注解用于告诉 spring 框架,此测试类交给 spring 管理。

3.4 项目业务增强实现及测试


第一步:定义业务 Cache 接口.

package com.cy.pj.common.cache;

public interface Cache {

}

第二步:定义 WeakCache 实现 Cache 接口.

package com.cy.pj.common.cache;

import org.springframework.stereotype.Component;

@Component
public class WeakCache implements Cache{

}

第三步:修改 DefaultCache ,让此类也实现 Cache 接口,关键代码如下:

@Component
public class DefaultCache implements Cache{}

第四步:定义单元测试类

package com.cy.pj.common.cache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class CacheTests {
	@Autowired
	@Qualifier("defaultCache")
	private Cache cache;
	
	@Test
	public void testCache() {
		System.out.println(cache);
	}
}

思考:

  1. @Autowired 注解应用规则?
  2. @Qualifier 注解的作用是什么?

文章目录


4 Spring Boot 整合数据源

测试类 - mybatis - DataBase

mybatis 内部

4.1 数据初始化

打开mysql控制台,然后按如下步骤执行goods.sql文件:
第一步:登录mysql
mysql –uroot –proot
第二步:设置控制台编码方式
set names utf8;
第三步:执行goods.sql文件(注意反斜杠问题)
source d:/goods.sql

4.2 单数据源整合实现 (重点掌握)

4.2.1 使用默认的HikariCP

第一步:添加依赖。
编辑项目中 pom.xml ,右键项目的 pom.xml 文件,选择 spring ,如图-11所示:

查找 mysql 驱动依赖, JDBC API 依赖,如图-12所示:

依赖添加以后,在pom.xml文件中会自动添加如下两个依赖配置:

  1. mysql 数据库驱动依赖。
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
  1. spring 对象jdbc支持。
<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

第二步:配置连接池
打开application.properties配置文件,添加如下内容。

spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

第三步:单元测试

@SpringBootTest
public class DataSourceTests {
    @Autowired
	private DataSource dataSource;
	@Test
	public void testDataSource() throws Exception{
		System.out.println(dataSource.getConnection());
	}
}

思考:市场说HiKariCP连接池性能相对较高,那么他的性能为什么好?在哪些方面做了优化设计?(课后拓展)

4.2.2 整合Druid对象

Druid是阿里巴巴推出一个为监控而生的开源连接池对象.在SpringBoot应用的使用步骤如下:
第一步:添加druid启动依赖(可以从mvnrepository.com站点去查找)

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.13</version>
</dependency>

Druid是阿里巴巴推出一个为 <mark>监控而生</mark> 的 源连接池对象.在SpringBoot应用的使用步骤如下:
第一步:添加druid启动依赖(可以从mvnrepository.com站点去查找)

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.13</version>
</dependency>

第二步:配置数据源

打开application.properties配置文件,修改连接池内容配置。
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///dbgoods?characterEncoding=utf-8&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

第三步:简化写法,可以省略驱动

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql:///dbgoods?characterEncoding=utf-8&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root

第四步:单元测试

@SpringBootTest
public class DataSourceTests {
    @Autowired
	private DataSource dataSource;
	@Test
	public void testDataSource() throws Exception{
		System.out.println(dataSource.getConnection());
	}
}

<mark>思考:为什么添加了druid依赖并进行了建议配置以后,再次获取数据源对象时,直接就是Druid对应的数据源对象呢?(与系统底层的自动配置有关)</mark>

4.3 多数据源整合实现(扩展)

本小节作为课后扩展练习(自己实现,也可以学了AOP以后再实现)。


文章目录


5 Spring Boot 整合MyBatis

5.1 初始配置

5.1.1 添加mybatis启动依赖

参考官网 mybatis.org/spring,找到springboot菜单选项.

	<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.1</version>
	</dependency>

5.1.2Mybatis简易配置

在spring boot的配置文件application.properties文件中添加如下内容
mybatis.configuration.default-statement-timeout=30
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.com.cy=DEBUG

其中,logging.level.com.cy=DEBUG 表示要对com.cy包中的DEBUG操作日志做输出。


5.2业务分析及实现

5.2.1基本业务实现及单元测试

定义商品业务数据层接口及业务方法。

package com.cy.pj.goods.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
@Mapper 
public interface GoodsDao {
	 @Delete("delete from tb_goods where id=#{id}")
	 int deleteById(Integer id);
}

其中:@Mapper是由MyBatis框架中定义的一个描述Mapper接口的的注解,用于告诉Spring框架此接口由底层(mybatis)创建其实现类对象,并存储到spring容器.
定义测试类

@SpringBootTest
public class GoodsDaoTests {    
    @Autowired
    private GoodsDao goodsDao;
	@Test
	public void testDeleteById() {
		int rows=goodsDao.deleteById(10);
		System.out.println("rows="+rows);
	}
}

5.2.2拓展业务分析及实现

Step01:
在GoodsDao中定义添加如下方法:

int deleteObjects(@Param("ids")Integer... ids);

说明:
<mark>当接口方法对应的映射语句相对比较复杂时,建议将映射语句写到对应映射文件</mark>。

Step02:
src/main/resources 目录下创建 mapper/goods 目录,然后在其目录添加
GoodsMapper.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.cy.pj.goods.dao.GoodsDao">
   <delete id="deleteObjects">
       delete from tb_goods
       where id in <!-- (1,2,3,4,5) -->
       <foreach collection="ids" open="(" close=")" separator="," item="id">
               #{id}
       </foreach>
   </delete>
</mapper>

Step03:
application.properties 文件中添加如下配置:
mybatis.mapper-locations=classpath:/mapper/*/*.xml

Step04:
在GoodsDaoTests类中添加如下单元测试方法进行单元测试:

@Test
public void testDeleteObjects() {
		int rows=goodsDao.deleteObjects(17,18);
		System.out.println(rows);
}

5.3构建业务层接口及实现类

参考图-13的设计,进行代码实现。
(课堂练习)

6 Spring Boot 整合WEB应用

6.1 初始配置

6.1.1 添加项目依赖

编辑pom.xml文件,添加web依赖,Thymeleaf依赖,代码如下:

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

其中:

  • Spring Web Starter 提供Spring MVC 依赖支持,<mark>并会自动添加一个tomcat依赖</mark>,作为嵌入式web服务器使用.
  • thymeleaf 是一个html模板引擎,提供了与Spring MVC进行整合的API,可作为MVC架构中Web应用的View层。

6.1.2 Spring Web简易配置

application.properties 文件中添加视图解析器配置。

spring.thymeleaf.prefix=classpath:/templates/pages/
spring.thymeleaf.suffix=.html

说明:要基于配置在 src/main/resources 目录下创建 templates/pages 目录

6.2 业务分析及实现

编写 GoodsController 类并将其交给 spring 管理。

package com.cy.pj.goods.controller;
@Controller
@RequestMapping("/goods/")
public class GoodsController {
      @Autowired
      public  GoodsService goodsService;
	  @RequestMapping("doDeleteObjects")
	@ResponseBody
	  public String doDeleteObjects(Integer …ids) {
          int rows=goodsService.deleteObjects(ids);
		  return "delete ok,rows="+rows;
	  }
	@RequestMapping("doGoodsUI")
	public String doGoodsUI() {
		   return "goods";
	}
}

说明:需要在/templates/page/目录下创建goods.html,然后启动项目进行访问测试实现。
课堂练习:基于图-14的设计,完成商品库中数据的删除操作.


6.3 服务器简易配置实现

6.3.1 内嵌服务器基本配置

打开application.properties文件,修改server端口等。

server.port=80
server.tomcat.uri-encoding=UTF-8
server.tomcat.max-threads=1000
server.tomcat.min-spare-threads=30
server.servlet.context-path=/

其中:
server.port 表示服务器启动端口。
server.tomcat.uri-encoding=UTF-8表示GET请求编码
server.tomcat.max-threads=1000 表示最大线程数。
server.tomcat.min-spare-threads=30 表示最小备用线程数。
server.servlet.context-path=/ 表示context路径配置。

6.3.2 使用Jetty替换tomcat(了解)

SpringBoot 默认使用Tomcat作为内嵌Servlet容器,可查看Spring-boot-starter-web依赖。假如需要使用其它的Web服务器,只需修改spring-boot-starter-web依赖即可。具体过程实现如下:
取消内嵌的tomcat依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			  <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>

添加jetty依赖,Jetty也是一个类似tomcat的web服务器,假如spring boot项目中使用Jetty服务器可以做如下依赖配置。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

文章目录


7 Spring Boot 应用扩展实现

7.1 健康检查配置及测试

在项目中添加健康检查依赖:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

健康检查分析:在浏览器中输入如下地址:

http://localhost/actuator/health

假如希望查看更多actuator选项,可以在spring boot中配置文件application.properties中添加如下语句:

management.endpoints.web.exposure.include=*

此时在浏览器地址栏可以输入.http://localhost/actuator/beans 查看所有的
spring 容器中的bean信息。
说明:当需要以一种更好的结构化方式查看bean相关信息,可以对Google浏览器安装jsonView插件或者使用Postman等工具进行资源请求然后查询bean信息,还可以直接在sts工具的Boot Dashboard中选中项目,查看其属性(show properties).

7.2 热部署配置及实现

Springboot web项目修改了某个类以后,默认不会自动重新部署加载,需要手动重启服务器,假如需要自动部署,可以添加如下依赖:

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<scope>runtime</scope>
</dependency>

说明:此依赖可通过STS 工具中的Edit starters方式进行添加。

7.3 Lombok插件应用

Lombok是一个第三库,可以基于lombok中提供的API在程序编译时自动织入一些属性或相关方法,例如省略pojo类中set/get/toString等方法的编写,我们写的java程序可以在编译时,自动将这些方法添加到.class文件中,其应用步骤如下:
第一步:添加依赖。

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
</dependency>

第二步:根据pom.xml文件中的配置,找到lombok文件夹下的lombok-xxx.jar文件的具***置。
第三步:启动操作系统命令行客户端,并切换到lombok-xxx.jar文件所在的目录,然后,利用java –jar 指令启动lombok插件,如图-15所示:

回车执行如上命令,会弹出选择安装对话框,如图-16所示:

然后在弹出的框中选择sts启动执行文件(SpringToolSuite4.exe)进行安***r> 安装成功以后会出现如下弹出框,如图-17所示:

安装成功以后可在STS工具的根目录看到一个lombok.jar文件,同时会在SpringToolSuite4.ini文件的尾部添加lombok.jar文件所在的具体路径,例如

-javaagent:D:\software\sts-4.2.2.RELEASE\lombok.jar。

其中lombok.jar会默认创建在sts软件的根目录,如图-18所示:

说明:安装成功以后重启sts 工具.(假如安装成功以后再次启动sts,此时无法启动,可能与STS所在目录有关系,可以将安装目录下的lombok.jar文件拷出到特定目录,然后修改SpringToolSuite4.ini文件的最后一行的lombok.jar路径即可,同时在配置文件中也不能有空格)。

Lombok 常用注解分析:

  • @Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
  • @Getter 使用方法同上,区别在于生成的是getter方法。
  • @ToString 注解在类,添加toString方法。
  • @EqualsAndHashCode 注解在类,生成hashCode和equals方法。
  • @NoArgsConstructor 注解在类,生成无参的构造方法。
  • @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
  • @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
  • @Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
  • @Slf4J为了类中添加一个日志属性对象
    private static final Logger log =
    LoggerFactory.getLogger(UserController.class);

代码案例分析:

@Slf4j
@Data //setter,getter,toString()
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Goods implements Serializable{
	private static final long serialVersionUID = 6239917530570596544L;
	//private static final Logger log=LoggerFactory.getLogger(Goods.class);
	private Long id;;
	private String name;
	private String remark;
	private Date createdTime;
	public String doPrint() {
		log.info("goods.display()");
		return toString();
	}
}

测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class LombokTests {
	 @Test
	 public void testGoods() {
		 Goods g=new Goods();
		 g.setId(1000L);
		 g.setName("spring boot");
		 g.setRemark("spring boot ...");
		 g.setCreatedTime(new Date());
		 System.out.println(g);
		 g=new Goods(200L, "lombok", "lombok...", new Date());
		 System.out.println(g);
		 g=new Goods()
				 .setId(300L)
				 .setName("framework")
				 .setRemark("framework...")
				 .setCreatedTime(new Date());
		 g.doPrint();
		 
	 }
}

7.4 Mybatis-Plus 插件应用(了解)

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,如图-19所示:

说明:Mybatis-plus插件的具体应用,自学实现。


文章目录


8 商品子系统综合实践(拓展练习)

8.1 业务需求分析

从数据库(dbgoods)查询所有商品(goods)信息,然后呈现在页面上(基于thymeleaf,标签应用参考官网thymeleaf.org)。对于软件开发人员在需求分析时通常会有这样的过程:

  • 第一:需求调研 (与软件使用人之间的一个沟通,了解其业务)
  • 第二:需求分析 (对需求调研内容的总结和细化)
  • 第三:原型设计 (是对需求分析结果的更好呈现)
  • 第四:需求评审 (签字确认)

8.2系统架构设计(重点是API设计)

如何理解架构设计?(所有的架构设计必须以业务前提,脱离业务谈架构就是耍流氓)

  • 第一:架构模式?(CS/BS)
  • 第二:单体架构,分布式架构,微服务架构?
  • 第三:部署架构?(web服务器一台,数据库服务器一台,…)
  • 第四:系统整体分层架构?基础设置,操作系统,中间件,应用软件,接入层)
  • 第五:软件应用的分层架构?(表示层,请求处理层,业务层,数据层)

8.3 业务代码实现(自己尝试实现)

参考CGB-GOODS-01项目

drop database if exists dbgoods;
create database dbgoods default character set utf8;
use dbgoods;
create table tb_goods(
     id bigint primary key,
     name varchar(100) not null,
     remark text,
     createdTime datetime not null
   )engine=InnoDB;
insert into tb_goods values (1,'java','very good',now());
insert into tb_goods values (2,'mysql','RDBMS',now());
insert into tb_goods values (3,'Oracle','RDBMS',now());


文章目录


9 总结

9.1 重难点分析

  • Spring boot 核心优势?
    (启动依赖,开箱即用)
  • Spring boot 项目的创建方式?
    ( https://start.spring.io,打包方式jar,内嵌tomcat)
  • Spring boot 整合数据源(DataSource),mybatis,spring mvc的实现。

9.2 FAQ分析

  • maven 工具(项目构建工具)哪里下载?
    (maven.apache.org)
  • STS(集成了 spring 插件的 eclipse)工具从哪里下载?
    spring.io/tools
  • STS 新版本怎么安***r> ( 例如 STS4.5.0 的安装 可使用:java -jar xxx.jar)
  • <mark>如何理解 Spring 框架</mark>?
    (资源整理框架、可约应用对象-资源、解耦)
  • 创建 spring starter 项目时 pom.xml 文件错误?
    (工具版本,maven***,本地库)
  • Spring Boot 项目中支持的配置文件后缀有哪些?
    (properties, yml …)
  • 项目中 application.properties 文件没有提示?
    (关闭重新打开)
  • SpringBoot 启动动类的包扫描位置?
    (启动类所在包以及子包)
  • SpringBoot 内置的连接池是什么?
    (HiKariCP)
  • SpringBoot 连接数据库的配置没有问题,数据库连不上?(服务是否启动,端口是否正确)
  • SpringBoot 整合mybatis时候是否可以同时存在注解和xml的映射?
  • SpringBoot 整合mybatis时如何实现SQL日志的输出?
  • SpringBoot 项目启动时哪些自动配置生效了,如何查看?(配置文件中定义debug=true)
  • SpringBoot默认支持热部署吗?(需要依赖)
  • lombok插件安装以后,注解不生效?(安装的软件(例如sts)位置和打开的软件不是同一个软件或者SpringToolSuite4.ini配置文件最后一行有特殊字符,例如中文,&,空格等符号)。
  • thymeleaf 模板引擎在项目的开发中,其属性cache的值为什么要设置为false?(修改了html页面,会在访问时自动重新加载并解析你的html页面.假如cache的值为true,修改html页面以后,要想看到变更,需要重启服务.)
  • SpringBoot项目中支持profiles配置吗?(application-{profile}.properties)

9.3 BUG分析

数据库版本及url配置问题,如图-20所示:


其解决方案为:
1)降低数据库驱动版本 (传统的maven项目通常会这么做)
2)在url中追加时区配置(serverTimezone=GMT%2B8)

数据库服务连接不上,如图-21所示:


问题分析:检查数据库服务是否启动,连接数据库的用户名,密码是否正确.

数据库版本或url配置问题,如图-22所示:

问题分析:检查数据的服务是否已启动,连接数据的url配置是否正确,数据库版本与驱动是否匹配.

访问的数据库不存在,如图-23所示:

问题分析:检查url配置的数据库是否存在.

指定命名空间下的元素ID已经存在。

Caused by: java.lang.IllegalArgumentException: 
Mapped Statements collection already contains value for 
com.cy.pj.goods.dao.GoodsDao.deleteObject. please check file 
[D:\WORKSPSTS\CGB-SBOOT-01\target\classes\mapper\ GoodsMapper.xml]
 and com/cy/pj/goods/dao/GoodsDao.java (best guess)

其解决方案为:
1)可能是GoodsDao接口或映射文件对应的映射元素有重复。

单元测试方法没有找到,如图-24所示:

其解决方案为:
1)单元测试方法可能使用了private修饰,有返回值或有参数。
2)单元测试方法没写@Test注解。
3)Spring Boot项目有多个启动类。
4)Spring Boot 单元测试类没有写在单元测试包中。

MyBatis 绑定异常,如图-25所示

问题分析:
1)检查接口类全名与映射文件中的命名空间是否不一致。
2)检查接口方法名与映射文件中的方法名是否不一致。
3)检查接口方法参数与映射文件可接收的参数不匹配。
4)检查接口对应的映射文件路径是否配置不正确(mapper-locations)。

MyBatis 参数绑定异常,如图-26所示

问题分析:检查调用的dao方法参数与对应的SQL参数是否有映射关系.(SQL中的使用的ids参数可能没有使用@Param注解进行描述)

JVM端口号被占用。

Caused by: java.net.BindException: Address already in use: bind
	at sun.nio.ch.Net.bind0(Native Method) ~[na:1.8.0_45]
	at sun.nio.ch.Net.bind(Unknown Source) ~[na:1.8.0_45]
	at sun.nio.ch.Net.bind(Unknown Source) ~[na:1.8.0_45]

其解决方案为:
1)关闭已启动的tomcat,重新启动。
2)杀进程(windows)

  • a)查找进程id:netstat -ano|findstr “8080”
  • b)基于进程id杀进程:taskkill /f /pid 进程id

URL请求资源不存在,如图-27所示:

其解决方案:
1)检查tomcat启动是否OK。
2)检查url对应的服务端资源是否匹配(客户端url与controller定义url)。
3)检查controller的包结构(所在包应在主启动类所在包的同包或子包中)。
4)检查项目中是否已添加thymeleaf依赖及配置(内置视图解析器)。

视图解析失败,如图-28所示

其解决方案:
1)检查tomcat启动是否OK。
2)检查url对应的服务端资源是否匹配(客户端url与controller定义url)。
3)检查controller的包结构(所在包应在主启动类所在包的同包或子包中)。
4)检查项目中是否已添加thymeleaf依赖及配置(内置视图解析器)。

视图解析失败,如图-28所示


其解决方案:
1)视图解析器的配置有问题(有可能方法没有实用@ReponseBody修饰)。
2)解决方案:检查视图解析器前缀,后缀的配置。


后续进行 ajax 学习