Spring Boot---基础笔记

Spring Boot整合连接池

1.通过连接池获取连接的一个基本过程,如图所示:

在这里插入图片描述
在上图中,用户通过DataSource对象的getConnection()方法,获取一个连接。假如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用Dirver(驱动,由数据库厂商进行实现)对象的connect方法从数据库获取,拿到连接以后,可以将连接在池中放一份,然后将连接返回给调用方。

2.整合HikariCP连接池

HiKariCP号称是目前世界上最快的连接池,有江湖一哥的称号,目前在springboot工程默认推荐使用HiKariCP连接池,现在创建一个新的项目,在此工程中整合HiKariCP,其步骤如下:

1)添加mysql 驱动依赖,JDBC API依赖
2)配置连接池,打开application.properties配置文件,添加如下内容
spring.datasource.url=jdbc:mysql://localhost:3306/dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
3)单元测试(测试包中编写)
@SpringBootTest
public class DataSourceTests {
    @Autowired
	private DataSource dataSource;
	@Test
	public void testConnection() throws Exception{
		System.out.println(dataSource.getConnection());
	}
   }
4)原理分析,如图所示:

在这里插入图片描述

Spring Boot整合MyBatis框架

添加mybatis启动依赖

参考官网,找到springboot菜单选项.基于菜单项找到MyBatis启动依赖。

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

基本业务实现及单元测试

基于Spring对MyBatis框架的整合,实现对商品库中数据的删除操作,业务API架构设计,如图所示:
在这里插入图片描述

1)基于id执行商品信息删除,其业务时序,如图所示:

在这里插入图片描述

2)定义商品业务数据层接口及业务方法
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框架中定义的一个描述数据层接口的的注解(所有的注解只起到一个描述性的作用),用于告诉Spring框架此接口的实现由mybatis创建,并将其实现类对象存储到spring容器.

3)定义测试类,对GoodsDao对象进行应用测试
@SpringBootTest
public class GoodsDaoTests {    
   @Autowired
   private GoodsDao goodsDao;
 
	@Test
	public void testDeleteById() {
		int rows=goodsDao.deleteById(10);
		System.out.println("rows="+rows);
	}
}

业务进阶分析及实现

在MyBatis框架中定义SQL映射的方式有两种:一种是将SQL映射定义在我们的xml映射文件中,一种方式是借助注解将其声明在接口方法上。我们在实际项目中对于简单的SQL映射可以直接以注解方式进行声明即可,复杂SQL还是要写到xml中,充分利用动态SQL进行设计会更好一些。以下基于XML方式定义GoodsDao接口中的方法映射,并进行单元测试:

Step01:在GoodsDao中,定义删除方法,具体代码如下:
int deleteObjects(@Param("ids")Integer... ids);

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

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);
}

构建业务层接口及实现类

在这里插入图片描述
在图中,测试类GoodsServiceTest,通过耦合与GoodsService接口实现具体商品业务处理。而在GoodsService接口的实现类GoodsServiceImpl中通过耦合GoodsDao接口完成具体的数据逻辑处理。
具体步骤如下:

第一步:定义pojo对象(Goods)用于存储从数据库查询到的商品信息.
package com.cy.pj.goods.pojo;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * pojo对象,基于此对象封装从数据库查询到的数据
 * 思考:对象靠什么存储数据?属性
 */
public class Goods {
	private Long id;//id bigint primary key auto_increment
	private String name;//name varchar(100) not null
	private String remark;//remark text
	private Date createdTime;//createdTime datetime
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRemark() {
		return remark;
	}
	public void setRemark(String remark) {
		this.remark = remark;
	}
	public Date getCreatedTime() {
		return createdTime;
	}
	public void setCreatedTime(Date createdTime) {
		this.createdTime = createdTime;
	}
	@Override
	public String toString() {
		return "Goods [id=" + id + ", name=" + name + ", remark=" + remark + ", createdTime=" + createdTime + "]";
	}
}
第二步:定义dao方法,用于查询数据库数据。
@Select("select id,name,remark,createdTime from tb_goods")
List<Goods> findObjects();
第三步:定义业务层接口以及实现类,然后在类中添加商品查询的业务方法。
package com.cy.pj.goods.service;
import java.util.List;
import com.cy.pj.goods.pojo.Goods;
public interface GoodsService {
   List<Goods> findGoods();
}
package com.cy.pj.goods.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.cy.pj.goods.dao.GoodsDao;
import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;
/**
 * 商品业务层对象,负责业务逻辑处理。
 * @author qilei
 */
@Service
public class GoodsServiceImpl implements GoodsService {	
	//has a
	@Autowired
	private GoodsDao goodsDao;
	@Override
	public List<Goods> findGoods() {
		long start=System.currentTimeMillis();
		List<Goods> list=goodsDao.findObjects();
		long end=System.currentTimeMillis();
		System.out.println("query time:"+(end-start));
		return list;
	}
}
第四步:定义单元测试类,对业务层方法进行单元测试
package com.cy.pj.goods.service;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.cy.pj.goods.pojo.Goods;
@SpringBootTest
public class GoodsServiceTests {
	@Autowired
	private GoodsService goodsService;
	@Test
	public void testFindGoods() {
		List<Goods> list=goodsService.findGoods();
            list=goodsService.findGoods();
		//System.out.println(list);//toString()
		for(Goods g:list) {
			System.out.println(g);//toString()
		}
      }//
}

Spring Boot整合SpringMVC应用

MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。目的是通过这样的设计使程序结构更加简洁、直观,降低问题的复杂度。其中各个组成部分的职责为:
· 视图(View) - UI设计人员进行图形界面设计,负责实现与用户交互。
· 控制器(Controller)- 负责获取请求,处理请求,响应结果。
· 模型(Model) - 实现业务逻辑,数据逻辑实现。

我们在软件设计时,通常要遵循一定的设计原则。MVC架构模式的设计中,首先基于单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样可以更好提高程序的可维护性和可扩展性。
JavaEE技术体系中,MVC设计思想的实现,如图所示:
在这里插入图片描述
在上图中,Servlet充当MVC中的Controller,负责调用model处理业务,负责转发或重定向某个页面,在页面(view)上呈现数据。模块封装了对Servlet的技术的应用,简化了程序员对请求和响应过程中数据的处理。
Spring MVC 是Spring 框架中基于MVC设计思想实现的一个用于处理Web请求的模块。其简易架构分析,如图所示:
在这里插入图片描述
上图中,核心组件分析:
· DispatcherServlet :前端控制器, 处理请求的入口。
· HandlerMapping:映射器对象, 用于管理url与对应controller的映射关系。
· Interceptors:拦截器,实现请求响应的共性处理。
· Controller:后端控制器-handler, 负责处理请求的控制逻辑。
· ViewResolver:视图解析器,解析对应的视图关系(前缀+viewname+后缀)。

初始配置

添加web依赖,Thymeleaf依赖

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

配置Spring MVC 核心对象

在application.properties文件中添加视图解析器配置(假如没有配置也会默认配置,在默认配置中prefix默认值为classpath:/templates/,后缀默认为.html)。

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

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

Spring MVC 进行入门实践

第一步:编写GoodsController类并将其交给spring管理。这样的Controller在SpringMVC 规范中通常称之为Handler(处理器),我们在企业中有时也会将此对象理解为一个后端控制器。

package com.cy.pj.goods.controller;
@Controller	
@RequestMapping("/goods/")
public class GoodsController {
     @RequestMapping("doGoodsUI")
public String doGoodsUI() {
	   return "goods";
}
}

第二步:需要在/templates/pages/目录下创建goods.html
第三步:启动服务器(默认项目嵌入的是tomcat),打开浏览器进行访问测试。
http://localhost:8080/goods/doGoodsUI

练习总结:

API应用设计,如图所示:
在这里插入图片描述
查询时序分析:如图所示
在这里插入图片描述
删除时序分析:如图所示:
在这里插入图片描述
添加时序分析:如图所示:
在这里插入图片描述

BUG分析

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

在这里插入图片描述
问题分析:在url中追加时区配置(serverTimezone=GMT%2B8)

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

在这里插入图片描述
问题分析:检查数据库服务是否启动,连接数据库的用户名,密码是否正确.

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

在这里插入图片描述
问题分析:检查数据的服务是否已启动,连接数据的url配置是否正确,数据库版本与驱动是否匹配.

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

在这里插入图片描述
问题分析:检查url配置的数据库是否存在.

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

在这里插入图片描述
问题分析:可能是GoodsDao接口或映射文件对应的映射元素有重复。

MyBatis 绑定异常,如图所示:

在这里插入图片描述
问题分析:
检查接口类全名与映射文件中的命名空间是否不一致。
检查接口方法名与映射文件中的元素是否不一致。
查接口方法参数与映射文件可接收的参数不匹配。
检查接口对应的映射文件路径是否配置不正确(mapper-locations)。

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

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

运行时的SQL语法问题,如图所示

在这里插入图片描述
问题分析:
认真分析操作中提示的SQL语法问题,以及出现的大概位置。
检测业务执行时传入的参数数据是否正常。

无限递归调用导致的栈内存溢出,如图所示:

在这里插入图片描述
问题分析:基于错误检查自己写的类,哪里出现了循环递归调用。

JVM端口号被占用,如图所示:

在这里插入图片描述
其解决方案为:
关闭已启动的tomcat,重新启动。
杀进程(windows)
查找进程id:netstat -ano|findstr “8080”
基于进程id杀进程:taskkill /f /pid 进程id

URL响应资源不存在,如图所示:

在这里插入图片描述
问题分析:检查tomcat启动是否OK,检查url对应的服务端资源是否匹配(客户端url与controller定义url),检查controller的包结构(所在包应在主启动类所在包的同包或子包中)。

视图解析失败,如图所示:

在这里插入图片描述
问题分析:检查视图解析器的配置是否有问题。

404问题(请求资源没找),如图所示:

在这里插入图片描述
问题分析:
1)检查tomcat启动是否OK.
2)检查url对应的服务端资源是否存在
3)检查访问的controller对象是否交给了spring管理。(例如是否有@Controller描述,包结构是否正确)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值