1. Spring Boot 整合连接池
1.1 概述
为了解决“建设连贯”、“开释资源”造成的零碎耗费性能问题,咱们采纳连接池技术来重用Connection
对象,如图:
Java为数据库连接池提供了公共的接口:javax.sql.DataSource
,各个厂商须要让本人的连接池实现这个接口。而后咱们的应用程序中耦合与这个接口,便能够不便的切换不同厂商的连接池,常见的连接池有DBCP、C3P0,DRUID,HikariCP等。
通过连接池获取连贯的一个根本过程,如图所示:
在图中,用户通过DataSource
对象的getConnection()
办法,获取一个连贯。如果池中有连贯,则间接将连贯返回给用户。如果池中没有连贯,则会调用Dirver
(驱动,由数据库厂商进行实现)对象的connect
办法从数据库获取,拿到连贯当前,能够将连贯在池中放一份,而后将连贯返回给调用方。
1.2 数据初始化
- 第一步:
新建txt文件并编辑:
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());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());
编辑后更改文件扩大名为.sql
- 第二步:
关上控制台,登录mysqlmysql -uroot -proot
(-p后为登录sql明码)
- 第三步:
设置控制台编码(MySql客户端)形式set names utf8;
- 第四步: 执行goods.sql文件
source d:/goods.sql
(source 后为.sql的门路)
备注:当mysql连贯数据库失败时,检测服务是否启动,可尝试先启动服务(windows中须要以管理员关上控制台,而后在控制台执行net start mysql
启动服务即可)
1.3 整合HikariCP连接池
HiKariCP号称时目前世界上最快的连接池,有江湖一哥的名称,目前在springboot工程默认举荐应用HiKariCP连接池,当初咱们创立一个新的我的项目,我的项目名为CGB-SBOOT-03,在此工程中整合HiKariCP,其步骤如下:
- 第一步: 增加依赖
编辑我的项目中pom.xml,右键我的项目的pom.xml文件,抉择spring,如图所示:
查找mysql驱动依赖,JDBC API依赖,如图:
依赖增加当前,在pom.xml文件中会主动增加如下两个依赖配置:
1.mysql数据库驱动依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>
2.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&characterEncoding=utf8spring.datasource.username=rootspring.datasource.password=root
- 第三步:单元测试(测试包中编写)
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;@SpringBootTestpublic class DataSourceTests { @Autowired private DataSource dataSource; private DataSource dataSource; @Test public void testConnection() throws Exception{ System.out.println(dataSource.getConnection()); } }
- 第四步:
原理剖析,如图所示
2.Spring Boot 整合MyBatis框架
2.1 概述
Mybatis是一个优良的长久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的根底上做了封装和优化,它借助灵便的SQL定制,参数及后果集的映射形式,更好的适应了以后互联网技术的倒退。Mybatis框架的简略利用架构,如图所示:
2.2初始配置
2.2.1 增加mybatis启动依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
留神: 在增加此依赖时,肯定指定其版本(version),因为在springboot默认配置中是没有设置mybatis框架版本的。
2.2.2Mybatis 倡议配置
咱们增加了mybatis依赖当前,spring框架启动时会对mybatis进行主动配置。例如SqlSessionFactory
工厂对象的创立。如果须要对mybatis框架进行繁难配置,能够关上application.properties文件,在此文件中进行根本配置(可选,临时能够不配置),例如:
mybatis.configuration.default-statement-timeout=30mybatis.configuration.map-underscore-to-camel-case=true
配置mybatis中的sql日志的输入:(com.cy为咱们写的我的项目的根包)logging.level.com.cy=DEBUG
2.3 业务剖析及实现
2.3.1根本业务实现及单元测试
基于Spring对MyBatis框架的整合,实现对商品库中数据的删除操作。
- 第一步: 业务API架构设计,如图所示:
- 第二步: 基于id执行商品信息删除,其业务时序,如图所示:
- 第三步: 定义商品业务数据层接口及业务办法
import org.apache.ibatis.annotations.Delete;import org.apache.ibatis.annotations.Mapper;@Mapperpublic interface GoodsDao{ @Delete("delete from tb_goods where id=#{id}") int deleteById(Integer id);}
其中:@Mapper
是由MyBatis框架中定义的一个形容数据层接口的注解(所有的注解只起到一个描述性的作用),用于通知Spring框架此接口的实现由MyBatis创立,并将其实现类对象存储到spring容器。
- 第四步: 定义测试类,对GoodsDao对象进行利用测试
@SpringBootTestpublic class GoodsDaoTests { @Autowired private GoodsDao goodsDao; @Test public void testDeleteById() { int rows=goodsDao.deleteById(10); System.out.println("rows="+rows); }}
- 第五步: 删除业务时序图加强剖析,如图所示(理解SqlSession利用):
- 第六步: MyBatis API 对象利用过程剖析,如图所示:
在图中,展现业务设计中API对象的一种调用关系。例如咱们的数据拜访对象调用MyBatis API,而后MyBatis API底层通过应用用JDBC API(两大部分:java.sql.*
,javax.sql.*
)拜访数据库。
2.3.2业务进阶剖析及实现
在MyBatis框架中定义SQL映射的形式有两种:一种是将SQL映射定义在咱们的xml映射文件中,一种形式是借助注解将其申明在接口办法上。咱们在理论我的项目中对于简略的SQL映射能够间接以注解形式进行申明即可,简单SQL还是要写到xml中,充分利用动静SQL进行设计会更好一些。
本大节,基于XML形式定义GoodsDao接口中的办法映射,实现批量删除操作,并进行单元测试:
- 第一步: 在GoodsDao中,定义删除办法,具体代码如下:
int deleteObjects(@Param("ids")Integer... ids);
阐明:当接口办法对应的映射语句绝对比较复杂时,倡议将映射语句写到对应映射文件。
- 第二步: 在src/main/resources目录下创立mapper/goods目录,而后在其目录中增加GoodsMapper.xml映射文件(文件名可本人指定),并增加如下内容:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.cy.pj.goods.dao.GoodsDao"> <delete id="deleteObjects"> delete from tb_goods where id in <!-- (1,2,3,4,5) --> <foreach collection="ids" open="(" close=")" separator="," item="id"> #{id} </foreach> </delete></mapper>
第三步: 在application.properties文件中增加如下配置:
mybatis.mapper-locations=classpath:/mapper/*/*.xml
- 第四步: 在GoodsDaoTests类中增加如下单元测试办法进行单元测试:
@Testpublic void testDeleteObjects() { int rows=goodsDao.deleteObjects(17,18); System.out.println(rows);}
思考:对于本大节映射文件中deleteObjects元素的定义,是否还有更好的形式。例如加强其健壮性(可靠性-无论传什么数据,都能够保障sql的语法的正确),性能。
2.4 构建业务层接口及实现类
参考下图的设计,进行代码实现,具体业务本人设计(例如查问)。