乐趣区

关于java:SpringBoot基础

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

  • 第二步:

关上控制台,登录 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, 如图所示:

查找 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=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());
        }
   }
  
  • 第四步:

原理剖析,如图所示

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

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

  • 第三步: 定义商品业务数据层接口及业务办法
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 利用):

  • 第六步: 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 类中增加如下单元测试办法进行单元测试:
@Test
public void testDeleteObjects() {int rows=goodsDao.deleteObjects(17,18);
                System.out.println(rows);
}

思考:对于本大节映射文件中 deleteObjects 元素的定义,是否还有更好的形式。例如加强其健壮性(可靠性 - 无论传什么数据,都能够保障 sql 的语法的正确),性能。

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

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

退出移动版