写点什么

SpringBoot- 整合 HikariCP 连接池,java 三层架构登录功能实现

用户头像
极客good
关注
发布于: 刚刚

第二步:添加依赖


  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


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


spring.datasource.username=root


spring.datasource.password=1234


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 org.junit.jupiter.api.Test;


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


import org.springframework.boot.test.context.Spri


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


ngBootTest;


import javax.sql.DataSource;


@SpringBootTest


public class DataSourceTests {


/**


  • DataSource 由谁定义? java 官方

  • DataSource 定义了什么? 定义了从数据库或连接池获取连接 Connection 的一种规范

  • 我们为什么要耦合于它? 类与之间存在依赖(耦合)时,尽量依赖于抽象规范。

  • 程序运行时这个变量指向的对象类型是谁?HikariDataSource 你是怎么知道的?


*/


@Autowired


private DataSource dataSource; //interface


@Test


public void testConnection() throws Exception{


//通过 datasource 获取连接的一个过程是怎么样的


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


//HikariProxyConnection@524566446 wrapping com.mysql.cj.jdbc.ConnectionImpl@73ba6fe6


}


}


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


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

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

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

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

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


[](


)基于 HikariCP 实现 JDBC 操作


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


[](


)业务分析


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


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


[](


)API 架构设计


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


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



[](


)业务时序图分析


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


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



[](


)业务代码设计及实现


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


第一步:定义 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;


}


定义释放资源的方法


private void close(ResultSet rs,Statement stmt,Connection conn){


if(rs!=null)try{rs.close();}catch(Exception e){e.printStackTrace();}


if(stmt!=null)try{stmt.close();}catch(Exception e){e.printStackTrace();}


//这里的连接是返回到了池中


if(conn!=null)try{conn.close();}catch(Exception e){e.printStackTrace();}


}


}


[](


)测试代码的编写及运行


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


定义单元测试类,并对其查询过程进行单元测试,例如:

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot-整合HikariCP连接池,java三层架构登录功能实现