社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
Spring Data JPA,它的底层是用Hibernate实现的,相当于封装了一道Hibernate。目的是帮我们简化持久层的代码。
Hikari:截止2019年7月,Hikari号称java平台最快的连接池......
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>
在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
@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;
}
启动应用,发现数据库成功创建了表,说明数据库连接配置成功。
全部编写完成后项目结构如下,不清楚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 | - |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!