SpringBoot 小节总结
重难点分析
1.掌握Spring boot 实现HikariCP连接池整合与测试应用的过程
2.掌握Spring boot 实现Mybatis框架资源的整合与测试
3.掌握Spring boot实现Spring MVC资源的整合与测试
1,2,3见之前写的总结
4.掌握MyBatis框架中的核心API及应用关系
SqlSessionFactoryBuilder:
a) SqlSessionFactoryBuilder用于创建SqlSessionFacoty
b) SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了
c) 因为SqlSession是通过SqlSessionFactory创建的,所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。
SqlSessionFactory:
a) 是一个接口,用于创建SqlSession的工厂
b) 接口中定义了openSession的2不同重载方法
c) SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory
SqlSession:
a) 是连接数据库的一个会话
b) SqlSession中定义了数据库的操作方法
c) 每个线程都应该有它自己的SqlSession实例
d) SqlSeesion的实力不能共享使用,它也是线程不安全的.因此最佳范围是请求或方法范围
e) 绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中
Mybatis架构:
参考:https://www.cnblogs.com/lqgcn/p/10823444.html
5.掌握Spring MVC中的核心API对象以及这些对象之间的调用关系
Dispatcher Servlet(前端控制器)
在最简单的SpringMVC应用程序中,控制器是唯一的你需要在java web部署描述文件(即Web.xml文件)中配置Servlet。Spring MVC控制器—通常称做DispatcherServlet,实现了前端控制器设计模式,并且每个web请求必须通过他以便它能够管理请求的生命周期。
当一个web请求发送到SpringMVC应用程序,dispatcher servlet首先接受请求,然后他组织哪些在 Spring Web应用程序上下文配置的(例如实际请求处理控制器和视图解析器)或者使用注解配置的组件,所有者这些都需要处理该请求。
客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
客户端—发送请求===>DispatcherServlet(完成请求转发)—调用===>HandlerMapping(将请求映射到对应的处理器来处理请求)=>Controller=>
调用service或DAO进行数据操作(ModelAndView用于存放从DAO中取出的数据,还可以存放响应视图的数据)
ViewResolver根据Controller返回标识找到对应的视图
controller(将响应response返回)==>用户
HandlerMapping
HandlerMapping的使用主要分为两步:注册和查找
注册: 根据配置文件中的配置将一个字符串和一个Controller类以<key,value>的形式存入到Map中,这个key就是对应的url中的某个字段。
查找: HandlerMapping根据url中的的某个字段,在Map中以这个字段为key值对应的Controller类,并将Controller类封装成一个HandlerExecutionChain对象,HandlerExecutionChain中除了有Controller对象外,还有一组拦截器。
Controller(控制器)
负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示
ViewResolver(视图解析器)
通过解析MdoelAndView,将MdoelAndView中的逻辑视图名变为一个真正的View对象,并将MdoelAndView中的Model取出。
View(视图)
在获取到ViewResolve传来的View和Model,对Model进行渲染,通过View对象找到要展示给用户的物理视图,将渲染后的视图展示给用户。用很直白的话将就是将数据通过request存储起来,找到要展示给用户的页面,将这些数据放在页面中,并将页面呈现给用户。
在Spring3.0中定义一个控制器类,这个类必须标有@Controller注解。
当有@Controller注解的控制器收到一个请求时,它会寻找一个合适的handler方法去处理这个请求。这就需要控制器通过一个或多个handler映射去把每个请求映射到handler方法。为了这样做,一个控制器类的方法需要被@RequestMapping注解装饰,使它们成为handler方法。
handler方法处理完请求后,它把控制权委托给视图名与handler方法返回值相同的视图。为了提供一个灵活的方法,一个handler方法的返回值并不代表一个视图的实现而是一个逻辑视图,即没有任何文件扩展名。你可以将这些逻辑视图映射到正确的实现,并将这些实现写入到上下文文件,这样你就可以轻松的更改视图层代码甚至不用修改请求handler类的代码。
为一个逻辑名称匹配正确的文件是视图解析器的责任。一旦控制器类已将一个视图名称解析到一个视图实现。它会根据视图实现的设计来渲染对应对象。
HiKariCP连接池常用API
一、主要配置
1、dataSourceClassName
这是DataSourceJDBC驱动程序提供的类的名称。请查阅您的特定JDBC驱动程序的文档以获取此类名称,或参阅下表。注XA数据源不受支持。XA需要像bitronix这样的真正的事务管理器 。请注意,如果您正在使用jdbcUrl“旧式”基于DriverManager的JDBC驱动程序配置,则不需要此属性 。 默认值:无
2、jdbcUrl
该属性指示HikariCP使用“基于DriverManager的”配置。我们认为基于DataSource的配置(上图)由于各种原因(参见下文)是优越的,但对于许多部署来说,几乎没有显着差异。 在“旧”驱动程序中使用此属性时,您可能还需要设置该 driverClassName属性,但不要先尝试。 请注意,如果使用此属性,您仍然可以使用DataSource属性来配置您的驱动程序,实际上建议您使用URL本身中指定的驱动程序参数。 默认值:无
3、username
此属性设置从基础驱动程序获取连接时使用的默认身份验证用户名。请注意,对于DataSources,这通过调用DataSource.getConnection(username, password)基础DataSource 以非常确定的方式工作。但是,对于基于驱动程序的配置,每个驱动程序都不同。在基于驱动程序的情况下,HikariCP将使用此username属性来设置传递给驱动程序调用的user属性。如果这不是你所需要的,例如完全跳过这个方法并且调用。 默认值:无PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty(“username”, …)
4、password
此属性设置从基础驱动程序获取连接时使用的默认身份验证密码。请注意,对于DataSources,这通过调用DataSource.getConnection(username, password)基础DataSource 以非常确定的方式工作。但是,对于基于驱动程序的配置,每个驱动程序都不同。在基于驱动程序的情况下,HikariCP将使用此password属性来设置传递给驱动程序调用的password属性。如果这不是你所需要的,例如完全跳过这个方法并且调用。 默认值:无PropertiesDriverManager.getConnection(jdbcUrl, props)addDataSourceProperty(“pass”, …)
二、常用配置
5、autoCommit
此属性控制从池返回的连接的默认自动提交行为。它是一个布尔值。 默认值:true
6、 connectionTimeout
此属性控制客户端(即您)将等待来自池的连接的最大毫秒数。如果在没有可用连接的情况下超过此时间,则会抛出SQLException。最低可接受的连接超时时间为250 ms。 默认值:30000(30秒)
7、 idleTimeout
此属性控制允许连接在池中闲置的最长时间。 此设置仅适用于minimumIdle定义为小于maximumPoolSize。一旦池达到连接,空闲连接将不会退出minimumIdle。连接是否因闲置而退出,最大变化量为+30秒,平均变化量为+15秒。在超时之前,连接永远不会退出。值为0意味着空闲连接永远不会从池中删除。允许的最小值是10000ms(10秒)。 默认值:600000(10分钟)
8、 maxLifetime
此属性控制池中连接的最大生存期。正在使用的连接永远不会退休,只有在关闭后才会被删除。在逐个连接的基础上,应用较小的负面衰减来避免池中的大量消失。 我们强烈建议设置此值,并且应该比任何数据库或基础设施规定的连接时间限制短几秒。 值为0表示没有最大寿命(无限寿命),当然是idleTimeout设定的主题。 默认值:1800000(30分钟)
9、connectionTestQuery
如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性。这是针对不支持JDBC4的“传统”驱动程序Connection.isValid() API。这是在连接从池中获得连接以确认与数据库的连接仍然存在之前将要执行的查询。再一次,尝试运行没有此属性的池,如果您的驱动程序不符合JDBC4的要求,HikariCP将记录一个错误以告知您。 默认值:无
10、minimumIdle
该属性控制HikariCP尝试在池中维护的最小空闲连接数。如果空闲连接低于此值并且连接池中的总连接数少于此值maximumPoolSize,则HikariCP将尽最大努力快速高效地添加其他连接。但是,为了获得最佳性能和响应尖峰需求,我们建议不要设置此值,而是允许HikariCP充当固定大小的连接池。 默认值:与maximumPoolSize相同
11、maximumPoolSize
此属性控制池允许达到的最大大小,包括空闲和正在使用的连接。基本上这个值将决定到数据库后端的最大实际连接数。对此的合理价值最好由您的执行环境决定。当池达到此大小并且没有空闲连接可用时,对getConnection()的调用将connectionTimeout在超时前阻塞达几毫秒。请阅读关于游泳池尺寸。 默认值:10
12、metricRegistry
该属性仅通过编程配置或IoC容器可用。该属性允许您指定池使用的Codahale / Dropwizard 实例MetricRegistry来记录各种指标。有关 详细信息,请参阅Metrics维基页面。 默认值:无
13、healthCheckRegistry
该属性仅通过编程配置或IoC容器可用。该属性允许您指定池使用的Codahale / Dropwizard 的实例HealthCheckRegistry来报告当前的健康信息。有关 详细信息,请参阅健康检查 wiki页面。 默认值:无
14、poolName
此属性表示连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置。 默认:自动生成
三、不常用配置
15、 initializationFailTimeout
如果池无法成功初始化连接,则此属性控制池是否将“快速失败”。任何正数都取为尝试获取初始连接的毫秒数; 应用程序线程将在此期间被阻止。如果在超时发生之前无法获取连接,则会引发异常。此超时被应用后的connectionTimeout 期。如果值为零(0),HikariCP将尝试获取并验证连接。如果获得连接但未通过验证,将抛出异常并且池未启动。但是,如果无法获得连接,则会启动该池,但后续获取连接的操作可能会失败。小于零的值将绕过任何初始连接尝试,并且在尝试获取后台连接时,池将立即启动。因此,以后努力获得连接可能会失败。 默认值:1
16、isolateInternalQueries
此属性确定HikariCP是否在其自己的事务中隔离内部池查询,例如连接活动测试。由于这些通常是只读查询,因此很少有必要将它们封装在自己的事务中。该属性仅适用于autoCommit禁用的情况。 默认值:false
17、allowPoolSuspension
该属性控制池是否可以通过JMX暂停和恢复。这对于某些故障转移自动化方案很有用。当池被暂停时,呼叫 getConnection()将不会超时,并将一直保持到池恢复为止。 默认值:false
18、readOnly
此属性控制默认情况下从池中获取的连接是否处于只读模式。注意某些数据库不支持只读模式的概念,而其他数据库则在Connection设置为只读时提供查询优化。无论您是否需要此属性,都将主要取决于您的应用程序和数据库。 默认值:false
19、registerMbeans
该属性控制是否注册JMX管理Bean(“MBeans”)。 默认值:false
20、catalog
该属性设置默认目录为支持目录的概念数据库。如果未指定此属性,则使用由JDBC驱动程序定义的默认目录。 默认:驱动程序默认
21、connectionInitSql
该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。如果这个SQL无效或引发异常,它将被视为连接失败并且将遵循标准重试逻辑。 默认值:无
22、driverClassName
HikariCP将尝试通过DriverManager仅基于驱动程序来解析驱动程序jdbcUrl,但对于一些较旧的驱动程序,driverClassName还必须指定它。除非您收到明显的错误消息,指出找不到驱动程序,否则请忽略此属性。 默认值:无
23、transactionIsolation
此属性控制从池返回的连接的默认事务隔离级别。如果未指定此属性,则使用由JDBC驱动程序定义的默认事务隔离级别。如果您有针对所有查询通用的特定隔离要求,请仅使用此属性。此属性的值是从不断的名称Connection 类,如TRANSACTION_READ_COMMITTED,TRANSACTION_REPEATABLE_READ等 默认值:驱动程序默认
24、 validationTimeout
此属性控制连接测试活动的最长时间。这个值必须小于connectionTimeout。最低可接受的验证超时时间为250 ms。 默认值:5000
25、 leakDetectionThreshold
此属性控制在记录消息之前连接可能离开池的时间量,表明可能存在连接泄漏。值为0意味着泄漏检测被禁用。启用泄漏检测的最低可接受值为2000(2秒)。 默认值:0
26、 dataSource
此属性仅通过编程配置或IoC容器可用。这个属性允许你直接设置DataSource池的实例,而不是让HikariCP通过反射来构造它。这在一些依赖注入框架中可能很有用。当指定此属性时,dataSourceClassName属性和所有DataSource特定的属性将被忽略。 默认值:无
27、schema
该属性设置的默认模式为支持模式的概念数据库。如果未指定此属性,则使用由JDBC驱动程序定义的默认模式。 默认:驱动程序默认
28、 threadFactory
此属性仅通过编程配置或IoC容器可用。该属性允许您设置java.util.concurrent.ThreadFactory将用于创建池使用的所有线程的实例。在一些只能通过ThreadFactory应用程序容器提供的线程创建线程的有限执行环境中需要它。 默认值:无
29、 scheduledExecutor
此属性仅通过编程配置或IoC容器可用。该属性允许您设置java.util.concurrent.ScheduledExecutorService将用于各种内部计划任务的实例。如果为ScheduledThreadPoolExecutor 实例提供HikariCP,建议setRemoveOnCancelPolicy(true)使用它。 默认值:无
thymeleaf模板引擎的基本应用过程(基于官方文档可以查询使用)
FAQ分析
Java中连接池对象的标准API是什么?
DataSource
Java中基于DataSource接口定义的连接池有哪些?
DBCP,C3P0,DRUID,HikariCP…
Java中标准JDBC API中哪个对象负责与数据库建立连接?
Driver
SpringBoot 内置的连接池配置是什么?
HiKariCP
SpringBoot 连接数据库的配置没有问题,数据库连不上?
服务,驱动
SpringBoot 整合MyBatis时,为什么需要添加mybatis版本?
@Mapper注解的作用什么?(
描述数据层接口,是由mybatis框架定义的规范
@Mapper 描述数据层接口时,底层会为接口做点什么?
创建实现类,创建实现类对象,并将对象存储到spring容器-bean池。
SpringBoot 整合mybatis时候是否可以同时存在注解和xml的映射?
我们在spring中用@Autowired获取mybatis mapper时,其实是Spring通过mybatis的sqlSessionFactory获取到的,mybatis-starter在启动过程中会在spring容器中注册好sqlSessionFactory, 但这starter并不会读取xml中配置的mapper。但如果你先让spring通过bean xml注册了sqlSessionFactory并读取了xml中的mapper配置,mybatis-stater中的autoconfigure就会失败,你用纯注解写的那个mapper就加载不上了。
所以先让springboot在启动时候先执行完成mybatis-starter中的MybatisAutoConfiguration,这时候在spring容器中sqlSessionFactory已经注册好了,然后把关于mapper的springbean xml配置文件读取并配置,配置过程中spring会先尝试注册sqlSessionFactory,其实已经有了,就会用这个factory把xml中mapper再加载一遍,因为spring中默认都是单例, 所以不会重建mybatis-starter中创建的sqlSessionFactory, 这里非常关键的一点就是加载xml必须在MybatisAutoConfiguration完成后,具体配置代码如下。
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
@Configuration
@ImportResource(locations={"classpath:application-bean.xml"})
@AutoConfigureAfter(MybatisAutoConfiguration.class) //这里就是保证xml在MybatisAutoConfiguration完成配置的核心
public class ApplicationConfig {
private void test(){
}
}
application-bean.xml里就是用来注册mybatis mapper的spring bean配置文件。
application-bean.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="dataSource" class="here is your datasource class" init-method="init">
<property name="user" value="xxx"/>
<property name="passwd" value="xxxx"/>
</bean>
<bean id="mysqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源配置,必须-->
<property name="dataSource" ref="dataSource"/>
<!-- mybatis的一些基本属性的配置 -->
<property name="configLocation" value="classpath:mybatisConfig.xml"/>
<!-- 如果mapper文件与mapper类放在相同的路劲下,则不需要配置路径 -->
<property name="mapperLocations"
value="classpath*:/config/*mapper.xml"/>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类,并帮你自动生成相关bean -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="me.xindoo.dao" />
<property name="sqlSessionFactoryBeanName" value="mysqlSessionFactory"></property>
</bean>
</beans>
转自:https://blog.csdn.net/xindoo/article/details/78867843
SpringBoot 整合mybatis时如何实现SQL日志的输出?
在 springboot 的 application.yml配置文件中配置如下
logging.level.mapper接口所在的包路径: debug
Spring MVC 应用中请求参数的映射过程?
直接量,pojo对象
Spring MVC 应用的请求转发和重定向?
服务端跳转-转发,客户端跳转-重定向
Thymeleaf 是什么,应用场景,官网的地址?
thymeleaf.org
Thymeleaf 模板引擎中的标签属性如何使用?
查询官方docs文档