1 Spring Boot 整合连接池
1.1 概述
实际开发中应用程序与数据库交互时,“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术来重用连接Connection对象,如图-1所示:
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。然后我们的应用程序中耦合与这个接口,便可以方便的切换不同厂商的连接池,常见的连接池有DBCP、C3P0,DRUID,HikariCP等。
通过连接池获取连接的一个基本过程,如图-2所示:
在图-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连接池,现在我们创建一个新的项目,项目名为CGB-SBOOT-02,在此工程中整合HiKariCP,其步骤如下:
第一步:添加依赖。
编辑项目中pom.xml,右键项目的pom.xml文件,选择spring,如图-3所示:
查找mysql 驱动依赖,JDBC API依赖,如图-4所示:
依赖添加以后,在pom.xml文件中会自动添加如下两个依赖配置:
我们在软件设计时,通常要遵循一定的设计原则。MVC架构模式的设计中,首先基于单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样可以更好提高程序的可维护性和可扩展性。
JavaEE技术体系中,MVC设计思想的实现,如图-14所示:
- mysql数据库驱动依赖。
-
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- spring对象jdbc支持(此时会默认帮我们下载HiKariCP连接池)。
-
<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 testConnection() throws Exception{
System.out.println(dataSource.getConnection());
}
}
-
第四步:原理分析,如图-5所示:
-
-
在图-5中,演示了我们在测试类DataSourceTests中基于DataSource获取连接的一个基本过程。对于图-5中的连接建立过程,可以在Driver接口的实现中的connect方法上添加断点,然后进行断点测试,如图-6显示了API方法的调用执行过程(按箭头方向开代码),这个了解了解即可。
-
-
当我们需要了解,基于HikariCP连接池获取数据库连接,并将获取到的连接放入到连
接池中的过程进行了解,可以参考图-7中的断点设计进行查看即可(不做具体要求)。
-
-
在基于图-7中设置的断点序号位置进行单元测试时,可以每次按F8进行断点跟踪,了解HiKariCP连接池获取连接存储连接的过程,其中API不理解的可以在搜索引擎中进行查阅分析。
-
2 Spring Boot 整合MyBatis框架
2.1 概述
Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。Mybatis框架的简单应用架构,如图-8所示:
-
-
在当今的互联网应用中项目,mybatis框架通常会由spring框架进行资源整合,作为数据层技术实现数据交互操作。
-
2.2 初始配置
2.2.1 添加mybatis启动依赖
参考官网mybatis.org/spring,找到springboot菜单选项.基于菜单项找到MyBatis启动依赖。
-
注意:在添加此依赖时,一定指定其版本(version),因为在springboot默认配置中没有设置mybatis框架版本。
我们添加了mybatis依赖以后,spring框架启动时会对mybatis进行自动配置。例如SqlSessionFactory工厂对象的创建。
2.2.2 Mybatis简易配置
假如需要对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架构设计,如图-9所示:
-
-
第二步:基于id执行商品信息删除,其业务时序,如图-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);
}
}
-
第五步:删除业务时序图增强分析,如图-11所示(了解SqlSession应用):