SpringBoot 基础--整合相关资源

文章目录

      • 一、Spring Boot 整合连接池
        • 1.1 概述
        • 1.2 数据初始化
        • 1.3 整合HikariCP连接池
      • 二、Spring Boot 整合MyBatis框架
        • 2.1 概述
        • 2.2 初始配置
        • 2.3 业务分析及实现
        • 2.4 构建业务层接口及实现类
    • 三、Spring Boot整合SpringMVC应用
      • 3.1 概述
      • 3.2 初始配置
      • 3.3 Spring MVC 进行入门实践
      • 总:全部代码实现
      • FAQ分析


一、Spring Boot 整合连接池


1.1 概述

实际开发中应用程序与数据库交互时,“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术来重用连接Connection对象,如图所示:

SpringBoot 基础--整合相关资源_第1张图片
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。然后我们的应用程序中耦合与这个接口,便可以方便的切换不同厂商的连接池,常见的连接池有DBCP、C3P0,DRUID,HikariCP等。
通过连接池获取连接的一个基本过程,如图所示:

SpringBoot 基础--整合相关资源_第2张图片
用户通过DataSource对象的getConnection()方法,获取一个连接。假如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用Dirver(驱动,由数据库厂商进行实现)对象的connect方法从数据库获取,拿到连接以后,可以将连接在池中放一份,然后将连接返回给调用方法。

1.2 数据初始化

打开mysql控制台,然后按如下步骤执行goods.sql文件:
第一步:登录mysql

  • mysql –uroot –proot

第二步:设置控制台编码(MySql客户端)方式

  • set names utf8;

第三步:执行goods.sql文件

  • source d:/goods.sql

备注: 当mysql连接数据库失败时,检测服务是否启动,可尝试先启动服务(windows中需要以管理员打开控制台,然后在控制台执行net start mysql启动服务即可)

1.3 整合HikariCP连接池

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

第一步:添加依赖。
编辑项目中pom.xml,右键项目的pom.xml文件,选择spring,如图所示:
SpringBoot 基础--整合相关资源_第3张图片
查找mysql 驱动依赖,JDBC API依赖,如图所示:
SpringBoot 基础--整合相关资源_第4张图片
依赖添加以后,在pom.xml文件中会自动添加如下两个依赖配置:

  1. mysql数据库驱动依赖。

	mysql
	mysql-connector-java
	runtime

  1. spring对象jdbc支持(此时会默认帮我们下载HiKariCP连接池)。

	org.springframework.boot
	spring-boot-starter-jdbc

第二步:配置连接池
打开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 testConnection() throws Exception{
		System.out.println(dataSource.getConnection());
	}
   }

第四步:原理分析,如图所示:
SpringBoot 基础--整合相关资源_第5张图片
在图中,演示了我们在测试类DataSourceTests中基于DataSource获取连接的一个基本过程。对于图中的连接建立过程,可以在Driver接口的实现中的connect方法上添加断点,然后进行断点测试,如下图显示了API方法的调用执行过程(按箭头方向开代码),这个了解了解即可。
SpringBoot 基础--整合相关资源_第6张图片
当我们需要了解,基于HikariCP连接池获取数据库连接,并将获取到的连接放入到连
接池中的过程进行了解,可以参考下图中的断点设计进行查看即可(不做具体要求)。
SpringBoot 基础--整合相关资源_第7张图片
在基于上图中设置的断点序号位置进行单元测试时,可以每次按F8进行断点跟踪,了解HiKariCP连接池获取连接存储连接的过程,其中API不理解的可以在搜索引擎中进行查阅分析。


二、Spring Boot 整合MyBatis框架


2.1 概述

Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。Mybatis框架的简单应用架构,如图所示:
SpringBoot 基础--整合相关资源_第8张图片
在当今的互联网应用中项目,mybatis框架通常会由spring框架进行资源整合,作为数据层技术实现数据交互操作。

2.2 初始配置

2.2.1 添加mybatis启动依赖

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

	
			org.mybatis.spring.boot
			mybatis-spring-boot-starter
			2.1.1
	

注意:在添加此依赖时,一定指定其版本(version),因为在springboot默认配置中没有设置mybatis框架版本。

2.2.2 Mybatis简易配置

我们添加了mybatis依赖以后,spring框架启动时会对mybatis进行自动配置。例如SqlSessionFactory工厂对象的创建。假如需要对mybatis框架进行简易配置,可以打开application.properties文件,在此文件中进行基本配置(可选,暂时可以不配置),例如:

mybatis.configuration.default-statement-timeout=30
mybatis.configuration.map-underscore-to-camel-case=true

配置mybatis中的sql日志的输出:(com.cy为我们写的项目的根包)

logging.level.com.cy=DEBUG

2.3 业务分析及实现

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

基于Spring对MyBatis框架的整合,实现对商品库中数据的删除操作。
第一步:业务API架构设计,如图所示:
SpringBoot 基础--整合相关资源_第9张图片
第二步:基于id执行商品信息删除,其业务时序,如图所示:
SpringBoot 基础--整合相关资源_第10张图片
第三步:定义商品业务数据层接口及业务方法。

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容器.

第四步:定义测试类,对GoodsDao对象进行应用测试

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

第五步:删除业务时序图增强分析,如图所示(了解SqlSession应用):
SpringBoot 基础--整合相关资源_第11张图片
第六步:MyBatis API 对象应用过程分析,如图所示:
SpringBoot 基础--整合相关资源_第12张图片
在图中,展示业务设计中API对象的一种调用关系。例如我们的数据访问对象调用MyBatis API,然后MyBatis API底层通过使用用JDBC API(两大部分:java.sql.*,javax.sql.*)访问数据库。

2.3.2 业务进阶分析及实现

在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映射文件(文件名可自己指定),并添加如下内容:



<mapper namespace="com.cy.pj.goods.dao.GoodsDao">
   <delete id="deleteObjects">
       delete from tb_goods
       where id in 
       <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);
}

思考:对于本小节映射文件中deleteObjects元素的定义,是否还有更好的方式。例如增强其健壮性(可靠性-无论传什么数据,都可以保证sql的语法的正确),性能。

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

参考下图的设计,进行代码实现,具体业务自己设计(例如查询)。
SpringBoot 基础--整合相关资源_第13张图片
在图中,我们的测试类GoodsServiceTest,通过耦合与GoodsService接口实现具体商品业务处理。而在GoodsService接口的实现GoodsServiceImpl中通过耦合GoodsDao接口完成具体的数据逻辑处理。

基于上图的设计,实现商品信息的查询,并将查询到的数据在测试类中进行输出。具体步骤如下:

第一步:定义pojo对象(Goods)用于存储从数据库查询到的商品信息.
第二步:定义dao方法方法,用于查询数据库数据。
第三步:定义业务层接口以及实现类,然后在类中添加商品查询的业务方法。
第四步:定义单元测试类,对业务层方法进行单元测试

代码实现:
第一步: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 + "]";
	}
}

第二步:GoodsDao中添加查询方法(一行记录映射为一个Goods对象)

@Select("select id,name,remark,createdTime from tb_goods")
List<Goods> findObjects();

第三步:添加GoodsService接口和实现类
① 接口

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应用


3.1 概述

MVC(Model–view–controller)是软件工程中的一种软件架构模式,基于此模式把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。目的是通过这样的设计使程序结构更加简洁、直观,降低问题的复杂度。其中各个组成部分的职责为:

  • 视图(View) - UI设计人员进行图形界面设计,负责实现与用户交互。
  • 控制器(Controller)- 负责获取请求,处理请求,响应结果。
  • 模型(Model) - 实现业务逻辑,数据逻辑实现。

我们在软件设计时,通常要遵循一定的设计原则。MVC架构模式的设计中,首先基于单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样可以更好提高程序的可维护性和可扩展性。

JavaEE技术体系中,MVC设计思想的实现,如图所示:
SpringBoot 基础--整合相关资源_第14张图片
在图中,Servlet充当MVC中的Controller,负责调用model处理业务,负责转发或重定向某个页面,在页面(view)上呈现数据。
模块封装了对Servlet的技术的应用,简化了程序员对请求和响应过程中数据的处理。Spring MVC 是Spring 框架中基于MVC设计思想实现的一个用于处理Web请求的模块。其简易架构分析,如图所示:
SpringBoot 基础--整合相关资源_第15张图片
核心组件分析:

  • DispatcherServlet :前端控制器, 处理请求的入口。
  • HandlerMapping:映射器对象, 用于管理url与对应controller的映射关系。
  • Interceptors:拦截器,实现请求响应的共性处理。
  • Controller:后端控制器-handler, 负责处理请求的控制逻辑。
  • ViewResolver:视图解析器,解析对应的视图关系(前缀+viewname+后缀)。

备注:假如希望了解Spring MVC的详细处理流程可以基于断点调试法进行跟踪。

3.2 初始配置

3.2.1 添加Spring MVC依赖

编辑pom.xml文件,添加web依赖,Thymeleaf依赖,代码如下:
Web依赖(提供了Spring MVC核心API,同时会嵌入一个Tomcat服务器)


		org.springframework.boot
		spring-boot-starter-web

Thymeleaf依赖(提供了一个视图解析器对象以及数据绑定机制)


	   org.springframework.boot
	   spring-boot-starter-thymeleaf

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

3.2.2 配置Spring MVC 核心对象

在application.properties文件中添加视图解析器配置(假如没有配置也会默认配置,在默认配置中prefix默认值为classpath:/templates/,后缀默认为.html)。
spring.thymeleaf.prefix=classpath:/templates/pages/
spring.thymeleaf.suffix=.html
说明:要基于配置在src/main/resources目录下创建templates/pages目录

3.3 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

还可以自己添加其他的功能,例如:

  • ① 将数据库中的商品数据查询出来更新到页面上。
  • ② 基于ID删商品库中的商品信息。
  • ③ 将页面用户输入的商品信息写入到数据库。

API应用设计,如图所示:
SpringBoot 基础--整合相关资源_第16张图片
① 查询时序分析:如图所示
SpringBoot 基础--整合相关资源_第17张图片
② 删除时序分析:如图所示:
SpringBoot 基础--整合相关资源_第18张图片
③ 添加时序分析:如图所示:
SpringBoot 基础--整合相关资源_第19张图片


总:全部代码实现


基本目录结构
SpringBoot 基础--整合相关资源_第20张图片
GoodsController.java

package com.cy.pj.goods.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.cy.pj.goods.pojo.Goods;
import com.cy.pj.goods.service.GoodsService;

/**
 * Spring MVC 中的后端处理器(Handler)
 * @author Administrator
 *
 */
@Controller
@RequestMapping("/goods/")
public class GoodsController {
	
	@Autowired
	private GoodsService goodsService;
	
	/*
	 * 删除选定的id对应的元素
	 */
	@RequestMapping("doDeleteById")
	public String doDeleteById(Integer id,Model model) {//model用来存储对象
		goodsService.deleteById(id);
		//获取商品信息
		List<Goods> list = goodsService.findObjects();
		//将商品信息保存到请求作用域
		model.addAttribute("list",list);
		//重定向页面
		return "redirect:doGoodsUI";
	}
	
	
	@RequestMapping("doGoodsUI")
	public String doGoodsUI(Model model) {//Model为springMVC中存储数据的一个对象
		//获取商品信息
		List<Goods> list = goodsService.findObjects();
		//将商品信息存储到请求作用域
		model.addAttribute("list",list);
		return "goods";//viewname
		/*
		 * 1)此view会返回给DispatchServlet对象
		 * 2)DispatchServlet对象将view传递给视图解析器ViewResolver
		 * 3)ViewResolver会对view的名字进行解析(例如添加前缀,后缀,...)
		 * 4)ViewResolver会将结果返回给DispatchServlet对象。
		 * 5)DispatchServlet将结果响应到客户端
		 */
	}
	
	/*
	 * 添加指定商品
	 */
	@RequestMapping("doSaveGoods")
	public String doSaveGoods(Goods entity,Model model) {
		goodsService.saveGoods(entity);
		List<Goods> list = goodsService.findObjects();
		model.addAttribute("list",list);
		return "redirect:doGoodsUI";
	}
}

GoodsDao.java

package com.cy.pj.goods.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * GoodsDao 是一个数据层商品信息访问接口
 * @Mapper 注解是由Mapper框架提供,此注解描述的接口由mybatis框架创建其实现类,
 * 	并交给spring容器管理
 *
 */
import org.apache.ibatis.annotations.Select;

import com.cy.pj.goods.pojo.Goods;
@Mapper
public interface GoodsDao {
	/**
	 * 基于多个商品id删除商品信息
	 * @param ids
	 * @return
	 */
	int deleteObjects(@Param("ids")Integer...ids);//三个点为可变参数
	
	/*
	 * 基于商品id删除商品信息
	 * mybatis框架中定义SQL映射方式有两种:
	 * 	1)注解(简单SQL)
	 * 	2)xml(复杂SQL)
	 */
	@Delete("delete from tb_goods where id = #{id}")
	int deleteById(Integer id);
	
	/**
	 * 查询所有商品
	 * @return
	 */
	@Select("select id,name,remark,createdTime from tb_goods")
	List<Goods> findObjects();
	
	/**
	 * 添加商品,将内存中的对象存储到数据库
	 */
	@Insert("insert into tb_goods values(null,#{name},#{remark},now())")
	int insertGoods(Goods entity);
}

Goods.java

package com.cy.pj.goods.pojo;

import java.util.Date;

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;
	}
	
	//重写toString()
	@Override
	public String toString() {
		return "Goods [id=" + id + ", name=" + name + ", remark=" + remark + ", createdTime=" + createdTime + "]";
	}
	
}

GoodsService.java

package com.cy.pj.goods.service;
/**
 * 商品模块业务层接口,负责商品业务的定义及处理
 * 
 */

import java.util.List;

import com.cy.pj.goods.pojo.Goods;

public interface GoodsService {
	
	List<Goods> findObjects();

	int deleteById(Integer id);

	int saveGoods(Goods entity);
}

GoodsServiceImpl.java

package com.cy.pj.goods.service.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

/*
 * 商品业务层对象,负责业务逻辑处理
 * 	1)核心业务(例如存钱--将金额更新到自己的账户)
 * 	2)拓展业务(存储过程中进行日志的记录,权限校验)
 */

@Service
public class GoodsServiceImpl implements GoodsService {
	private static final Logger logger = LoggerFactory.getLogger(GoodsServiceImpl.class);
	@Autowired
	private GoodsDao goodsDao;
	
	
	@Override
	public List<Goods> findObjects(){
		long start = System.currentTimeMillis();
		List<Goods> list = goodsDao.findObjects();
		long end = System.currentTimeMillis();
		//测试时间
//		System.out.println("执行时间:" + (end-start));
		logger.info("execute time:{}",(end-start));
//		System.out.println(logger.getClass().getName());//ch.qos.logback.classic.Logger
//		System.out.println(log.getClass().getName());//org.apache.ibatis.logging.slf4j.Slf4jImpl
		return list;
	}
	
	@Override
	public int deleteById(Integer id) {
		long start = System.currentTimeMillis();
		int rows = goodsDao.deleteById(id);
		long end = System.currentTimeMillis();
		//测试时间
//		System.out.println("总时长:" + (end-start));
		logger.info("删除执行时间:{}",(end-start));
		return rows;
	}
	
	@Override
	public int saveGoods(Goods entity) {
		long start = System.currentTimeMillis();
		int rows = goodsDao.insertGoods(entity);
		long end = System.currentTimeMillis();
		logger.info("添加执行时间:{}",(end-start));
		return rows;
	}
	
}


FAQ分析


  1. Java中连接池对象的标准API是什么?(
    ----DataSource
  2. Java中基于DataSource接口定义的连接池有哪些?
    ----DBCP,C3P0,DRUID,HiKariCP,…
  3. Java中标准JDBC API中哪个对象负责与数据库建立连接?
    ----Driver
  4. Java 中连接池中的连接也是通过Driver对象获取的吗?
  5. SpringBoot 内置的连接池配置是什么?
    ----HiKariCP
  6. SpringBoot 连接数据库的配置没有问题,数据库连不上?
    ----服务,驱动
  7. SpringBoot 整合MyBatis时,为什么需要添加mybatis版本?
  8. @Mapper注解的作用什么?
    ----描述数据层接口,是由mybatis框架定义的规范
  9. @Mapper 描述数据层接口时,底层会为接口做点什么?
    ---- 创建实现类,创建实现类对象,并将对象存储到spring容器-bean池。
  10. 框架底层基于@Mapper描述的接口创建实现类对象,其内部做什么?
  11. SpringBoot 整合mybatis时候是否可以同时存在注解和xml的映射?
  12. SpringBoot 整合mybatis时如何实现SQL日志的输出?
  13. Spring MVC 核心组件对象有哪些?
    ----DispatcherServlet,HandlerMapping,…
  14. Spring MVC 核心组件中DispatcherServlet的作用什么?
  15. Spring MVC 应用中请求参数的映射过程?
    -----直接量,pojo对象
  16. Spring MVC 应用的请求转发和重定向?
    ----服务端跳转-转发,客户端跳转-重定向)
  17. Thymeleaf 是什么,应用场景,官网的地址?
    ----thymeleaf.org
  18. Thymeleaf 模板引擎中的标签属性如何使用?
    ----查询官方docs文档
  19. STS 工具常用快捷键(
    ----al+/,ctrl+shift+t,ctrl+t,ctrl+o,…
  20. 断点操作时f5不能进入方法内部
    ----可以参考此博客的解决方法:https://blog.csdn.net/fly_sky333/article/details/79516566

你可能感兴趣的:(Spring,mybatis,spring,java,spring,boot,数据库)