Spring Boot - 整合JPA

283 阅读2分钟

JPA 介绍

JPA (Java Persistence API)

集成JPA

jap 依赖

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

当然,你需要添加spring-boot-starter-jdbcmysql-connector-java数据库依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

核心概念

JPA 的核心接口是Repository,接口Repository有两个泛型参数<T, ID>,其中T是我们需要操作的实体类对象,ID是我们数据库实体类对象的唯一主键字段,在JPA中,接口CrudRepository 继承Repository接口为我们提供了复杂的CRUD功能。

下段代码为CrudRepository

@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

在接口CrudRepository的基础上,JPA提供了PagingAndSortingRepository接口用于实现排序和分页操作。

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort var1);

    Page<T> findAll(Pageable var1);
}

查询page为1,pageSize为20的数据

 repository.findAll(PageRequest.of(1, 20));

Jpa 为我们提供了JpaRepository,在使用Jpa进行数据库操作时,我们可以直接依赖这个接口。

@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
    List<T> findAll();

    List<T> findAll(Sort var1);

    List<T> findAllById(Iterable<ID> var1);

    <S extends T> List<S> saveAll(Iterable<S> var1);

    void flush();

    <S extends T> S saveAndFlush(S var1);

    void deleteInBatch(Iterable<T> var1);

    void deleteAllInBatch();

    T getOne(ID var1);

    <S extends T> List<S> findAll(Example<S> var1);

    <S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

实际操作

定义Entity

创建s_user表

CREATE TABLE `s_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(30) NOT NULL COMMENT '用户名',
  `password` varchar(50) NOT NULL COMMENT '密码',
  `real_name` varchar(30) NOT NULL COMMENT '用户真实姓名',
  `mnemonic_code` varchar(30) DEFAULT NULL COMMENT '助记码',
  `sex` varchar(30) DEFAULT NULL COMMENT '性别 0 男 1 女',
  `created_by` int(11) DEFAULT NULL COMMENT '创建人',
  `created_time` datetime(6) DEFAULT NULL COMMENT '创建时间',
  `last_modified_by` int(11) DEFAULT NULL COMMENT '更新人',
  `last_modified_time` datetime(6) DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Entity

@Data
@Entity
@Table(name = "s_user")
public class SUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "user_name")
    private String userName;
    @Column(name = "pass_word")
    private String passWord;
    @Column(name = "real_name")
    private String realName;
    @Column(name = "mnemonic_code")
    private String mnemonicCode;
    @Column(name = "sex")
    private String sex;
    @Column(name = "created_by")
    private Integer createdBy;
    @Column(name = "created_time",updatable = false)
    private Date createdTime;
    @Column(name = "last_modified_by")
    private Integer lastModifiedBy;
    @Column(name = "last_modified_time")
    private Date lastModifiedTime;
}

Entity 中常用注解

@Id 表明该字段为数据库主键
@GeneratedValue 表明主键值生成策略
@Cloumn 字段注解
  • name 字段名
  • unique 是否唯一
  • nullable 是否为空
  • length 长度
  • columnDefinition 列定义 例如TEXT

Repository

@Repository
public interface UserRepository extends JpaRepository<SUser,Integer> {
}