Spring Data JPA 入门

1,621 阅读2分钟

介绍

  1. JPA 是 Spring Boot 官方推荐的数据库访问组件。
  2. 和mybatis相反, Spring Data JPA 是通过实体对象去自动创建或修改数据库表的。

配置

  1. ddl-auto如果配置成createcreate-drop的话,每次重启或sessionFactory关闭时都会删除之前的表然后重新创建,然后造成数据丢失。
  2. ddl-auto最常用的属性是update,也就是说每次重启都会更新表结构。
  3. ddl-auto设置为update时,有几个细节需要留意
    1. 虽然属性名叫update,但是其实只会做新增操作,也就是说在实体对象删除字段或修改属性数据库并不会同步更新。
    2. 如果增加字段的话,是直接在数据库末尾增加的。
# application.yml
spring:
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
      ddl-auto: update # none validate update create create-drop

实体对象

  1. 常用注解及说明
    1. @Table(name = "fh_user")
      1. 数据库表名
    2. @Column(name="user_name", length = 32)
      1. name 是数据库字段名,建议全部指定
      2. length 是数据长度 varChar(32)
    3. @UpdateTimestamp
      1. 更新时间注解,数据更新是会刷新此字段的时间
      2. 更新机制是由框架实现的,不是数据库的 ON UPDATE CURRENT_TIMESTAMP
    4. @CreationTimestamp
      1. 创建时间注解,插入数据时会取当前时间
      2. 更新机制是由框架实现的,不是数据库的 DEFAULT CURRENT_TIMESTAMP
@Getter
@Setter
@Entity
@Table(name = "fh_user")
public class UserDO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    @Column(name="user_name", length = 32)
    private String userName;

    @Column(name="nike_name", length = 32)
    private String nikeName;

    @Column(name="sex")
    private Integer sex;

    @UpdateTimestamp
    @Column(name = "update_time")
    private Date updateTime;

    // 创建时间注解
    @CreationTimestamp
    @Column(name = "create_time")
    private Date createTime;
}

操作数据库(JpaRepository扩展)

开始

  1. 在 Spring Data JPA 中,通过Repository来操作数据库。
  2. 将下面的bean注入后,就可以直接使用JpaRepository接口中一些常用方法
@Repository
public interface UserRepository extends JpaRepository<UserDO, Integer> {
}
@Resource
UserRepository userRepository;

新增

UserDO user = new UserDO();
user.setSex(1);
user.setUserName("xxxx");
userRepository.save(user);

修改

Optional<UserDO> optional = userRepository.findFirstById(1);

// 当存在时,修改数据
optional.ifPresent((user) -> {
    user.setUserName("aaaa");
    userRepository.save(user);
});

删除

Optional<UserDO> option = userRepository.findById(1);

option.ifPresent((UserDO user) -> {
    userRepository.delete(user);
});

查询

Optional<UserDO> optional=userRepository.findById(1);
optional.ifPresent(user -> System.out.println(user.getUserName()));

操作数据库(自定义)

自定义方法名查询

自定义方法名官方文档

分页与排序查询

Sort.TypedSort<UserDO> sort = Sort.sort(UserDO.class);
Slice<UserDO> users = userRepository.findByUserName("xxxx", PageRequest.of(0, 10, sort.by(UserDO::getId).descending()));

example查询

UserDO userDO = new UserDO();
userDO.setSex(1);
Example<UserDO> example = Example.of(userDO);
List<UserDO> users = userRepository.findAll(example);