写点什么

SpringBoot 实现对 HikariCP 连接池的整合

  • 2021 年 11 月 11 日
  • 本文字数:3077 字

    阅读完需:约 10 分钟

数据初始化


=====================================================================


打开 mysql 控制台,然后按如下步骤执行 goods.sql 文件。


第一步:登录 mysql。


mysql?–uroot –proot


第二步:设置控制台编码方式。


set?names?utf8;


第三步:执行 goods.sql 文件(切记不要打开文件复制到 mysql 客户端运行)。


source?d:/goods.sql


其中 goods.sql 文件内容如下:


drop database if exists dbgoods;


create database dbgoods default character set utf8;


use dbgoods;


create table tb_goods(


id bigint primary key auto_increment,


name varchar(100) not null,


remark text,


createdTime datetime not null


)engine=InnoDB;


insert into tb_goods values (null,'java','very good',now());


insert into tb_goods values (null,'mysql','RDBMS',now());


insert into tb_goods values (null,'Oracle','RDBMS',now());


insert into tb_goods values (null,'java','very good',now());


insert into tb_goods values (null,'mysql','RDBMS',now());


insert into tb_goods values (null,'Oracle','RDBMS',now());


insert into tb_goods values (null,'java','very good',now());


创建项目 Module 并添加相关依赖


=================================================================================


第一步:基于 IDEA 创建项目 Module,如图所示:



第二步:添加依赖


  1. mysql 数据库驱动依赖。


<dependency>


<groupId>mysql</groupId>


<artifactId>mysql-connector-java</artifactId>


<scope>runtime</scope>


</dependency>


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


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-jdbc</artifactId>


</dependency>


配置 HikariCP 连接池


=============================================================================


打开 application.properties 配置文件,添加如下内容(必写)。


spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8


spring.datasource.username=root


spring.datasource.password=root


hikariCP 其它额外配置(可选),代码如下(具体配置不清晰的可自行百度):


spring.datasource.type=com.zaxxer.hikari.HikariDataSource


spring.datasource.hikari.minimum-idle=5


spring.datasource.hikari.maximum-pool-size=15


spring.datasource.hikari.auto-commit=true


spring.datasource.hikari.idle-timeout=30000


spring.datasource.hikari.pool-name=DatebookHikariCP


spring.datasource.hikari.max-lifetime=1800000


spring.datasource.hikari.connection-timeout=30000


spring.datasource.hikari.connection-test-query=SELECT 1


HikariCP 连接池测试


==============================================================================


单元测试 API 设计及应用分析,如图所示:



在项目中添加单元测试类及测试方法,代码如下:


package com.cy.pj.common.datasource;


import java.sql.SQLException;


import javax.sql.DataSource;


import org.junit.jupiter.api.Test;


import org.springframework.beans.factory.annotation.Autowired;


import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest


public class DataSourceTests {


@Autowired


private DataSource dataSource;


@Test


public void testConnection() throws Exception{


System.out.println(dataSource.getConnection());


}


}


在当前测试类中我们需要:


  • 掌握单元测试类、测试方法编写规范。

  • 理解 DataSource 的设计规范及规范的实现。

  • 分析在测试类中 dataSource 属性指向的对象是谁?

  • 分析在测试类中 DataSource 的实现类对象由谁创建和管理?

  • 思考基于 DataSource 接口获取连接的基本过程是怎样的?


测试 BUG 分析


=======================================================================


  • 数据库不存在,如


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


图所示:



  • 类编译错误,DataSource 为 javax.sql 包中的类型,如图所示:



  • 连接错误:数据库连接不上,如图所示:



基于 HikariCP 实现 JDBC 操作(练习)


======================================================================================


业务分析


====================================================================


基于 HikariCP,借助 JDBC 技术访问商品库中的数据。


API 架构设计


=======================================================================


基于业务,进行 API 设计,如图所示:



业务时序图分析


=======================================================================


基于业务需求,进行商品查询过程的的时序图设计,如图所示:


[图片上传失败…(image-aeaa9e-1612504955913)]


业务代码设计及实现


=========================================================================


第一步:定义 GoodsDao 接口,例如:


package com.cy.pj.goods.dao;


import java.util.List;


import java.util.Map;


/**


  • 商品模块数据访问层接口


*/


public interface GoodsDao {


/**


  • 查询所有商品信息,将每一行记录存储到一个 map 对象,然后将多个存储到 list 集合.


*/ List<Map<String,Object>> findGoods();


}


第二步:创建 GoodsDao 接口实现类,代码如下:


package com.cy.pj.goods.dao;


/**


  • 此对象为一个商品数据层访问对象,现在要求在此类中定义一个方法,这个方法基于 JDBC 从从数据库获取商品信息,并将其封装到 map 集合,要求一个行记录一个 map 对象(key 为表中字段名,值为字段名对应的值),多个 map 存储到 list 集合. @Repository 此注解通常用于描述数据层实现类对象,本质上就是一个特殊的 @Component, 都是要交给 spring 框架管理的一个 Bean 对象


*/


@Repository


public class DefaultGoodsDao implements GoodsDao{


@Autowired


private DataSource dataSource;//hikariCP


/*查询商品信息,一行记录映射为内存中的一个 map 对象/


public List<Map<String,Object>> findGoods(){


Connection conn=null;//java.sql.*


Statement stmt=null;


ResultSet rs=null;


String sql="select * from tb_goods";


//1.获取连接(从连接池获取)


try {


conn=dataSource.getConnection();


//2.创建 statement 对象


stmt=conn.createStatement();


//3.发送 sql


rs=stmt.executeQuery(sql);


//4.处理结果


List<Map<String,Object>> list=new ArrayList<>();


while(rs.next()){//循环一次取一行,一行记录映射为一个 map 对象


list.add( rowMap(rs));//将存储了一行记录的 map 对象再存储到 list 集合


}


return list;


}catch (SQLException e){


e.printStackTrace();


throw new RuntimeException(e);//转换为非检查异常(编译时不检测的异常)


}finally{


//5. 释放资源


close(rs,stmt,conn);


}


}


定义行映射方法


private Map<String,Object> rowMap(ResultSet rs)throws SQLException{


Map<String,Object> rowMap=new HashMap<>();


//方法 1 映射


//rowMap.put("id",rs.getInt("id"));


//rowMap.put("name",rs.getString("name"));


//rowMap.put("remark",rs.getString("remark"));


//rowMap.put("createdTime",rs.getTimestamp("createdTime"));


//方法 2 映射


ResultSetMetaData rsmd=rs.getMetaData();//获取元数据(包括表中的字段名)


int columnCount=rsmd.getColumnCount();//获取列的数量


for(int i=0;i<columnCount;i++){


rowMap.put(rsmd.getColumnLabel(i+1),rs.getObject(rsmd.getColumnLabel(i+1)));


//getColumnLabel(i+1);获取表中字段名或字段名对应的别名


}


return rowMap;


}


定义释放资源的方法

评论

发布
暂无评论
SpringBoot实现对HikariCP连接池的整合