Spring Boot教程 | 第二篇:使用Spring Data JPA、Hikari连接池操作MySQL数据库 - Go语言中文社区

Spring Boot教程 | 第二篇:使用Spring Data JPA、Hikari连接池操作MySQL数据库


一、简介

Spring Boot完整教程 | 主页及目录

Spring Data JPA,它的底层是用Hibernate实现的,相当于封装了一道Hibernate。目的是帮我们简化持久层的代码。

Hikari:截止2019年7月,Hikari号称java平台最快的连接池......

 

二、配置及操作

2.1引入依赖

pom中引入spring-boot-starter-data-jpa依赖,以及MySQL连接类mysql-connector-java依赖,springboot 2.0 后默认连接池就是Hikari了,所以引用parents后不用专门加依赖。

为了减少实体类或虚拟实体类的代码,引入lombok依赖。Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的实体类,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。

完整pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.kcsm.training</groupId>
    <artifactId>bootdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>bootdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2 配置数据源连接

在application.properties配置文件中进行配置,配置如下,:(更为详细的配置信息详见最后的附件)

#应用名称
spring.application.name=bootdemo
server.port=8080

# 数据库连接配置
# jdbc_config   datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url= jdbc:mysql://127.0.0.1:3306/alh?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=sa
spring.datasource.password=123456
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

# hibernate配置(jpa底层使用hibernate配置实现)
##映射方式配置,PhysicalNamingStrategyStandardImpl,名称不做修改加工。
##映射方式配置,若配置成SpringPhysicalNamingStrategy,在进行映射时,首字母小写,大写字母变为下划线加小写
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
##ddl-auto配置属性:create 启动时删数据库中的表,然后创建;create-drop 启动时删数据库中的表,然后创建,如果表不存在报错;
##update 如果启动时表格式不一致则更新表,原有数据保留;validate 项目启动表结构进行校验 如果不一致则报错
##生产环境中请勿配置,否则会导致严重的生产事故!,生产时使用spring cloud远程配置中心统一配置各项参数
spring.jpa.hibernate.ddl-auto=update

##控制台是否打印sql,默认false,生产时建议关闭
spring.jpa.show-sql=true

# 连接池配置
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
## 最小连接数
spring.datasource.hikari.minimum-idle=5
## 最大连接数
spring.datasource.hikari.maximum-pool-size=15
## 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
## 连接允许在池中闲置的最长时间,默认600000(10分钟),单位ms
spring.datasource.hikari.idle-timeout=30000
## 连接池名称
spring.datasource.hikari.pool-name=UserHikariCP
## 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟,单位ms
spring.datasource.hikari.max-lifetime=1800000
## 数据库连接超时时间,默认30秒,即30000,单位ms
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

创建entity包,创建实体类

@Data注解后自动生成getter/setter、equals、hashcode、toString方法(lombok提供的功能)

package com.kcsm.training.bootdemo.entity;

import lombok.*;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**
 * 学生实体类
 *
 * @author lqk
 * @date 2019/7/9 11:41
 */
@Entity
@Table(name = "STUDENT")
@Data
public class Student {

    /**
     * 主键
     */
    @Id
    @GeneratedValue(generator = "guidGenerator")
    @GenericGenerator(name = "guidGenerator", strategy = "uuid")
    @Column(name = "ID", unique = true, nullable = false, length = 32)
    private String id;

    /**
     * 姓名
     */
    @Column(name = "NAME",length = 50)
    private String name;

    /**
     * 年龄
     */
    @Column(name = "AGE")
    private Integer age;

    /**
     * 性别,male:男性,female:女性
     */
    @Column(name = "GENDER",length = 10)
    private String gender;

}

启动应用,发现数据库成功创建了表,说明数据库连接配置成功。

2.3 编写RESTful风格的接口

全部编写完成后项目结构如下,不清楚RESTful风格的同学请先自行搜索资料学习。

下面分步进行说明:

创建dao包,包下创建StudentDao接口,接口继承JpaRepository与JpaSpecificationExecutor

代码如下:

package com.kcsm.training.bootdemo.dao;

        import com.kcsm.training.bootdemo.entity.Student;
        import org.springframework.data.jpa.repository.JpaRepository;
        import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

/**
 * 学生信息数据库访问接口
 *
 * @author lqk
 * @date 2019/7/9 15:43
 */
public interface StudentDao  extends JpaRepository<Student, String>, JpaSpecificationExecutor<Student> {

}

创建service包,包下创建StudentService接口类。包下创建再建impl包,impl包下建StudentServiceImpl实现类。

StudentService接口代码如下:

package com.kcsm.training.bootdemo.service;

import com.kcsm.training.bootdemo.entity.Student;

import java.util.List;

/**
 * 学生信息业务接口
 *
 * @author lqk
 * @date 2019/7/9 18:29
 */
public interface StudentService {

    /**
     * 插入学生信息
     *
     * @author lqk
     * @return com.kcsm.training.bootdemo.entity.Student
     * @date 2019/7/10 9:19 
     */
    public Student insert();

    /**
     * 查询全部学生信息
     *
     * @author lqk
     * @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
     * @date 2019/7/10 9:16
     */
    public List<Student> getAll();

}

StudentServiceImpl实现类

package com.kcsm.training.bootdemo.service.impl;

import com.kcsm.training.bootdemo.dao.StudentDao;
import com.kcsm.training.bootdemo.entity.Student;
import com.kcsm.training.bootdemo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * 学生信息业务接口实现
 *
 * @author lqk
 * @date 2019/7/9 19:52
 */
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    StudentDao studentDao;

    @Override
    public Student insert(){
        Student student = new Student();
        student.setName("张三");
        return studentDao.save(student);
    }

    @Override
    public List<Student> getAll(){
        return  studentDao.findAll();
    }
}

在controller包中创建StudentController类,代码如下:

package com.kcsm.training.bootdemo.controller;

import com.kcsm.training.bootdemo.entity.Student;
import com.kcsm.training.bootdemo.service.StudentService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;

/**
 * 学生信息控制类
 *
 * @author lqk
 * @date 2019/7/9 20:00
 */
@RestController
public class StudentController {

    @Resource(name = "studentServiceImpl")
    StudentService studentService;

    /**
     * 新增一条学生信息
     *
     * @author lqk
     * @return com.kcsm.training.bootdemo.entity.Student
     * @date 2019/7/10 9:31
     */
    @RequestMapping(value = "v1/student", method = RequestMethod.POST)
    public Student insert(){
        return studentService.insert();
    }

    /**
     * 返回所有学生信息
     *
     * @author lqk
     * @return java.util.List<com.kcsm.training.bootdemo.entity.Student>
     * @date   2019/7/10 9:41
     */
    @RequestMapping(value = "v1/student", method = RequestMethod.GET)
    public List<Student> getAll(){
        return  studentService.getAll();
    }

}

使用Postman先发POST请求http://localhost:8080/v1/student,如控制类代码所示,此时执行的是insert()方法。

 

成功返回新增对象,说明新增成功,再新增一条,执行成功!

使用Postman先发GET请求http://localhost:8080/v1/student,如控制类代码所示,此时执行的是getAll()方法。

成功返回表中的两条信息,执行成功!

三、总结

本篇介绍了data jpa的基本用法。后续会有更为详细的介绍,包括分页查,带参查询等等。此外开发规范,开发技巧会一直贯穿在全篇教程中,指导实际生产开发。对于单表、对外开放平台等而言,我们更倾向于使用RESTful API对外暴露接口。本篇中我们通过代码实现了RESTful API,那有没有什么工具能帮我们更为轻松,更为优雅的实现RESTful API呢?请继续后续章节的学习。

 

四、附件

配置项 描述 构造器默认值 默认配置validate之后的值 validate重置
autoCommit 自动提交从池中返回的连接 TRUE TRUE -
connectionTimeout 等待来自池的连接的最大毫秒数 SECONDS.toMillis(30) = 30000 30000 如果小于250毫秒,则被重置回30秒
idleTimeout 连接允许在池中闲置的最长时间 MINUTES.toMillis(10) = 600000 600000 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!=0且小于10秒,则会被重置为10秒
maxLifetime 池中连接最长生命周期 MINUTES.toMillis(30) = 1800000 1800000 如果不等于0且小于30秒则会被重置回30分钟
connectionTestQuery 如果您的驱动程序支持JDBC4,我们强烈建议您不要设置此属性 null null -
minimumIdle 池中维护的最小空闲连接数 -1 10 minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize
maximumPoolSize 池中最大连接数,包括闲置和使用中的连接 -1 10 如果maxPoolSize小于1,则会被重置。当minIdle<=0被重置为DEFAULT_POOL_SIZE则为10;如果minIdle>0则重置为minIdle的值
metricRegistry 该属性允许您指定一个 Codahale / Dropwizard MetricRegistry 的实例,供池使用以记录各种指标 null null -
healthCheckRegistry 该属性允许您指定池使用的Codahale / Dropwizard HealthCheckRegistry的实例来报告当前健康信息 null null -
poolName 连接池的用户定义名称,主要出现在日志记录和JMX管理控制台中以识别池和池配置 null HikariPool-1 -
initializationFailTimeout 如果池无法成功初始化连接,则此属性控制池是否将 fail fast 1 1 -
isolateInternalQueries 是否在其自己的事务中隔离内部池查询,例如连接活动测试 FALSE FALSE -
allowPoolSuspension 控制池是否可以通过JMX暂停和恢复 FALSE FALSE -
readOnly 从池中获取的连接是否默认处于只读模式 FALSE FALSE -
registerMbeans 是否注册JMX管理Bean(MBeans FALSE FALSE -
catalog 为支持 catalog 概念的数据库设置默认 catalog driver default null -
connectionInitSql 该属性设置一个SQL语句,在将每个新连接创建后,将其添加到池中之前执行该语句。 null null -
driverClassName HikariCP将尝试通过仅基于jdbcUrl的DriverManager解析驱动程序,但对于一些较旧的驱动程序,还必须指定driverClassName null null -
transactionIsolation 控制从池返回的连接的默认事务隔离级别 null null -
validationTimeout 连接将被测试活动的最大时间量 SECONDS.toMillis(5) = 5000 5000 如果小于250毫秒,则会被重置回5秒
leakDetectionThreshold 记录消息之前连接可能离开池的时间量,表示可能的连接泄漏 0 0 如果大于0且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为0 . 即如果要生效则必须>0,而且不能小于2秒,而且当maxLifetime > 0时不能大于maxLifetime
dataSource 这个属性允许你直接设置数据源的实例被池包装,而不是让HikariCP通过反射来构造它 null null -
schema 该属性为支持模式概念的数据库设置默认模式 driver default null -
threadFactory 此属性允许您设置将用于创建池使用的所有线程的java.util.concurrent.ThreadFactory的实例。 null null -
scheduledExecutor 此属性允许您设置将用于各种内部计划任务的java.util.concurrent.ScheduledExecutorService实例 null null -
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/tuoyun6647/article/details/95194236
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 22:32:19
  • 阅读 ( 1138 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢