1. Spring Boot 整合连接池

1.1 概述

为了解决“建立连接”、“释放资源”造成的系统消耗性能问题,我们采用连接池技术来重用Connection对象,如图:
image.png
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。然后我们的应用程序中耦合与这个接口,便可以方便的切换不同厂商的连接池,常见的连接池有DBCP、C3P0,DRUID,HikariCP等。
通过连接池获取连接的一个基本过程,如图所示:
image.png
在图中,用户通过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

  • 第二步:

打开控制台,登录mysql
mysql -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,如图所示:
image.png
查找mysql驱动依赖,JDBC API依赖,如图:
image.png
依赖添加以后,在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=utf8
spring.datasource.username=root
spring.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;
@SpringBootTest
public class DataSourceTests {
  @Autowired
              private DataSource dataSource;        
  private DataSource dataSource;        
  @Test
        public void testConnection() throws Exception{  
            System.out.println(dataSource.getConnection());
        }
   }
  
  • 第四步:

原理分析,如图所示
image.png

2.Spring Boot 整合MyBatis框架

2.1 概述

Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。Mybatis框架的简单应用架构,如图所示:
image.png

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=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架构设计,如图所示:

image.png

  • 第二步: 基于id执行商品信息删除,其业务时序,如图所示:

image.png

  • 第三步: 定义商品业务数据层接口及业务方法
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);
        }
}
  • 第五步: 删除业务时序图增强分析,如图所示(了解SqlSession应用):

image.png

  • 第六步: MyBatis API 对象应用过程分析,如图所示:

image.png
在图中,展示业务设计中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类中添加如下单元测试方法进行单元测试:
@Test
public void testDeleteObjects() {
                int rows=goodsDao.deleteObjects(17,18);
                System.out.println(rows);
}
思考:对于本小节映射文件中deleteObjects元素的定义,是否还有更好的方式。例如增强其健壮性(可靠性-无论传什么数据,都可以保证sql的语法的正确),性能。

2.4 构建业务层接口及实现类

参考下图的设计,进行代码实现,具体业务自己设计(例如查询)。

image.png


Tsuki
1 声望1 粉丝

« 上一篇
SpringBoot入门
下一篇 »
MySQL安装