个人博客:兰陵笑笑生,欢迎浏览博客!java
上一章 SpringBoot入门实践(六)-JSR实现请求参数的验证当中,咱们介绍了如何在项目中优雅的使用JSR实现请求参数的验证,本章将使用 Spring Data JPA来进行数据库的访问。mysql
Sping DATA JPA 中提供了主要的功能,第一个功能是对Repository的抽象,第二个功能是用于跟踪实体类的基本审计信息的监听,什么叫基本审计信息,就是实体中当中经常使用的5个字段 version、 createDate、 createBy 、lastModifiedBy、 lastModifiedDate,spring date jpa 可以根据实际的要求自动更新这个5个字段。spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
Repository是spring Data的主要的一个抽象概念,它是spring-data-commons 项目中的接口,CrudRepository也是spring-data-commons 项目中的接口,可是扩展了Repository的接口,CrudRepository定义了经常使用的方法。保存,查询、根据ID删除等。以下图,sql
import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size;import java.util.Date; /** *@Entity: 表示是一个实体 * @Table: 当项目启动时,能够建立对应的表,默认是实体的英文小写 * @Id: 若是沒有@Id注解 项目启动会报错 * @EntityListeners:5个经常使用字段的更新 */ @Entity @EntityListeners(AuditingEntityListener.class) @Table(name = "t_singer") public class Singer { /** *@GeneratedValue 主键的生成策略 序列 默认是AUTO */ @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) @Column(name = "singerId") private Long singerId; @Column(name = "fist_name") @NotNull(message = "名称不能为空") @Size(min = 2, max = 5) private String fistName; @Column(name = "LAST_NAME") private String lastName; @Phone private String phone; @Version @Column(name = "version") private int version; /**Temporal时间的格式 * 默认:2020-01-12 14:59:56.941 *TemporalType.DATE:2020-01-12 *TemporalType.TIME: 15:04:27.188 * TemporalType.TIMESTAMP 2020-01-12 15:05:25.758 */ @CreatedDate @Temporal(TemporalType.DATE) private Date createDate; @CreatedBy private String createBy; @LastModifiedBy private String lastModifiedBy; @LastModifiedDate private Date lastModifiedDate; ..... }
用来开启自动更新实体的5个字段,分别是数据库
private int version; private Date createDate; private String createBy; private String lastModifiedBy; private Date lastModifiedDate;
注意: 要确保字段可以自动更新在主类上添加@EnableJpaAuditingpublic注解segmentfault
@SpringBootApplication @EnableJpaAuditing public class Chapter2Application { public static void main(String[] args) { SpringApplication.run(Chapter2Application.class, args); } }
@Column(name = "fist_name") :对应数据库的字段,默认是java的字段名称,能够指定为数据库指定的字段。mybatis
固然还能够约定字段的长度和类型app
@Version @CreatedDate @CreatedBy @LastModifiedBy @LastModifiedDate :用来标记经常使用的五个字段dom
@Temporal(TemporalType.DATE) :时间的格式ide
## 数据库设置 spring: datasource: username: postgres password: 123456 url: jdbc:postgresql://localhost:5432/test driver-class-name: org.postgresql.Driver jpa: database : postgresql show-sql: true hibernate: #create 项目启动时会将数据库的表删除,并从新建立,致使数据丢失 #update ddl-auto: update properties: hibernate: #方言:我这里使用的是PostgreSQL ,固然也可使用mysql 等其余的数据库 dialect: org.hibernate.dialect.PostgreSQL9Dialect temp: use_jdbc_metadata_defaults : false
编写一个SingerRepository接口继承CrudRepository 接口, CrudRepository默认实现了保存、删除等方法,这里编写一个根据自定义的sql查询的方法:
package com.miroservice.chapter2.repository; import com.miroservice.chapter2.pojo.Singer; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import java.util.List; /** * Singer 当前查询的主体 */ public interface SingerRepository extends CrudRepository<Singer, Long> { /** * 查询 * @param fistName * @return */ @Query(value = " select * from t_singer where fist_name=:fistName", nativeQuery = true) List<Singer> findByFistName(String fistName); ..... }
实体的建立人和更新人输入
实现AuditorAware接口,目的获取当前的用户名称,用于在更新实体时候,从这类获取到用户名称等,当程序调用CrudRepository的save方法时,会从下面的方法getCurrentAuditor中获取当前的用户信息。
实现保存信息时自动更新信息的建立人和修改人。
import java.util.Optional; @Configuration public class AuditorAwareBean implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { return Optional.of("admin"); } }
建立SingerServiceImpl组件,调用singerRepository中的方法:实现保存、删除和查询等功能,在Controller层调用SingerService的方法,就能够实现查询了;
import com.miroservice.chapter2.pojo.Singer; import com.miroservice.chapter2.repository.SingerRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class SingerServiceImpl implements SingerService { @Autowired SingerRepository singerRepository; /** * 调用自定义方法查询 * @param fistName * @return */ @Override public List<Singer> findByFistName(String fistName) { return singerRepository.findByFistName(fistName); } /** * 保存歌手 * @param fistName * @return */ @Override public void save(Singer singer) { singerRepository.save(singer); } /** * 删除歌手 * @param fistName * @return */ @Override public void delete(Long id) { singerRepository.deleteById(id); } }
@RestController public class SingerController { @Autowired SingerService singerService; @GetMapping("/get") private HttpResponse get(@RequestParam("fistName") String fistName) { return HttpResponse.ok().setData(singerService.findByFistName(fistName)); } @PostMapping("/save") private HttpResponse add(@Valid @RequestBody Singer singer) { singerService.save(singer); return HttpResponse.ok(); } @GetMapping("/delete/{id}") private HttpResponse delete(@PathVariable Long id) { singerService.delete(id); return HttpResponse.ok(); }
除了CrudRepository接口以外,Spring JAP还提供JpaRepository接口,该接口提供批处理、分页、排序等操做。JpaRepository接口扩展了CrudRepository,所以,该接口提供了CrudRepository接口全部功能的实现,能够直接将CrudRepository换成JpaRepository,程序照样能够运行,固然咱们能够更具应用程序的复杂性选择使用不一样的接口。以下图,
import com.miroservice.chapter2.pojo.Singer; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.List; public interface SingerRepository extends JpaRepository<Singer, Long> { /** * * @param fistName * @return */ @Query(value = " select * from t_singer where fist_name=:fistName", nativeQuery = true) List<Singer> findByFistName(String fistName) ; }
在实际的开发中JPA的操做对单表的操做很是的方便,固然JPA同时支持多表的关联查询,可是在项目的迭代过程当中,多表的操做我都会使用springBoot+Mybatis,由于Mybatis能够在xml中定制化XML,并且随着项目的迭代,查询的需求不断的变化,xml方式的sql其实更容易去维护。更好的方法时集合mybatis和JPA 根据需求选择。
本章内容简单介绍了Spring Boot中如何使用JPA实现数据的访问操做,关于更详细的JPA的操做,能够在本章内容不详细展开,后续文章会继续讲解。
以上就是本期的分享,你还能够关注本博客的#Spring Boot入门实践系列!#
本文由博客一文多发平台 OpenWrite 发布!
个人博客[兰陵笑笑生] ( http://www.hao127.com.cn/),欢...!