Java后端爱上SpringBoot 第二节:Spring-Data-Jpa应用
何为Spring-Data-Jpa?
首先要明确的是JPA是一个规范,并不是一个框架,Spring-data-jpa就是一群Spring的抠脚大汉写的一个符合JPA规范的一个封装了不易上手的Hibernate的易上手DAO框架。
为什么要用Spring-Data-Jpa?
- 能大大的简化我们DAO层的开发(这个现如今的DAO层框架都能做到,但是Spring-Data-Jpa做的更多)
- 可以解放写SQL的工作量
- 不用做数据库初始化建表语句的管理
- Jdk生成要实行ORM(现在还没有做到),在DAO层从一大堆SQL转变成关系-对象的模式
- 有成熟的生态圈
还有别的一些好处,就在此不在说了,有兴趣的道友可以自己搜一下。
使用JPA的一些思想上的转变
-
要把传统的在SQL上实现一大堆的业务逻辑分解成多的简单的业务逻辑
贫道的栗子:在日常开发中,特别是三五年前的项目,有些程序员就是要用一个很大很大的SQL(超过100行的SQL)来做一个复杂的业务逻辑,他写的代码让后人无法可写。 -
允许添加冗余的字段,以减少关联查询带来的效率问题
-
在插入数据时尽量多做,在查询数据时尽量少做
一些链接
- 【原创】纯干货,Spring-data-jpa详解,全方位介绍。
- spring data jpa 查询自定义字段,转换为自定义实体
- Spring Data JPA 介绍和使用
- Spring-Data-Jpa官网文档
SpringBoot整合Spring-Data-Jpa
上一节其实都说了,在这里再啰嗦一遍吧。
- Maven添加依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- 添加数据库配置和JPA配置
spring:
###数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/spring?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&allowPublicKeyRetrieval=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
username: hyn
password: hyn1234
###JPA配置
jpa:
properties:
hibernate:
hbm2ddl:
auto: update
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
generate-ddl: true
database: mysql
Spring-Data-Jpa应用
自动建表功能
创建一个实体SysUser
package com.hyn.spring.entity;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/**
*
* @Title: SysUser.java
* @Package com.hyn.spring.domain
* @Description: TODO
* @author hyn
* @date 2018年12月9日 下午1:38:53
* @version V1.0
*/
@Entity
@Table(name = "sys_user")
@EntityListeners(AuditingEntityListener.class)
public class SysUser implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GenericGenerator(name = "idGenerator", strategy = "uuid") // 这个是hibernate的注解/生成32位UUID
@GeneratedValue(generator = "idGenerator")
/**
* 用户ID
*/
@Column(columnDefinition="varchar(36) not null comment '用户ID' ")
String id;
/**
*
* 用户状态
*/
@Column(columnDefinition = "enum('true','false') default 'true' not null comment '用户状态' ")
String status;
/**
* 邮箱
*/
@Column(columnDefinition = "varchar(20) not null default '' comment '用户邮箱'" )
private String email;
/**
* 登录用户名
*/
@Column(columnDefinition = "varchar(20) not null unique default '' comment '登录用户名'" )
private String loginName;
/**
* 用户名名称
*/
@Column(columnDefinition = "varchar(10) not null default '' comment '用户名称'" )
private String userName;
/**
* 密码策略
*/
@Column(columnDefinition = "varchar(100) not null default '888888' comment '登录密码'" )
private String password;
/**
* 电话
*/
@Column(columnDefinition = "varchar(11) not null unique default '' comment '手机号码'" )
private String phone;
/**
* 更新时间
*/
@Temporal(TemporalType.TIMESTAMP)
@Column(columnDefinition = "timestamp default current_timestamp on update current_timestamp comment '更新时间'")
@UpdateTimestamp
private Date moditime;
//省略get set
启动项目会生成自动建表语句,如果你没有看到自动建表,请检查你的配置:
spring.jpa.properties.hibernate.hbm2ddl.auto有几种状态,我这里去贴一下别人的:
- validate 加载hibernate时,验证创建数据库表结构
- create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
- create-drop 加载hibernate时创建,退出是删除表结构
- update 加载hibernate自动更新数据库结构
- none 不自动建表,也不检查表结构
自动注入时间
细心的道友会发现为什么实体上会加一个 @EntityListeners(AuditingEntityListener.class) 这个注解,在这里解释一下,这个注解是用来自动更新时间用的,比如每个表都应该有一个moditime字段用来记录这条数据最后更新的时间,如果让自己手动去维护这个字段就很麻烦,JPA提供了一个 @UpdateTimestamp注解来自动更新moditime,@EntityListeners 是用来开启这个实体上自动更新时间的。不过除了需要加上这个注解以为,还去要在启动类上加上 @EnableJpaAuditing注解,来开启SpringBoot的Jpa的自动注解功能。
@SpringBootApplication
@EnableJpaAuditing
@EnableSwagger2
public class SpringFirstApplication {
public static void main(String[] args) {
SpringApplication.run(SpringFirstApplication.class, args);
}
}
单表操作
新增数据
创建DAO层
package com.hyn.spring.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import com.hyn.spring.entity.SysUser;
public interface ISysUserRepository extends JpaRepository<SysUser, String>,JpaSpecificationExecutor<SysUser>{
}
单个新增
@Override
public String save(SysUserVO sysUserVO) {
SysUser sysUser = new SysUser();
sysUser.setEmail(sysUserVO.getEmail());
sysUser.setLoginName(sysUserVO.getLoginName());
sysUser.setPassword(sysUserVO.getPassword());
sysUser.setPhone(sysUserVO.getPhone());
sysUser.setStatus(sysUserVO.getStatus());
sysUser.setUserName(sysUserVO.getUserName());
iSysUserRepository.save(sysUser);
return "success";
}
批量新增
@Override
@Transactional