介绍
- JPA 是 Spring Boot 官方推荐的数据库访问组件。
- 和mybatis相反, Spring Data JPA 是通过实体对象去自动创建或修改数据库表的。
配置
ddl-auto如果配置成create或create-drop的话,每次重启或sessionFactory关闭时都会删除之前的表然后重新创建,然后造成数据丢失。
ddl-auto最常用的属性是update,也就是说每次重启都会更新表结构。
ddl-auto设置为update时,有几个细节需要留意
- 虽然属性名叫
update,但是其实只会做新增操作,也就是说在实体对象删除字段或修改属性数据库并不会同步更新。
- 如果增加字段的话,是直接在数据库末尾增加的。
spring:
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
实体对象
- 常用注解及说明
@Table(name = "fh_user")
- 数据库表名
@Column(name="user_name", length = 32)
- name 是数据库字段名,建议全部指定
- length 是数据长度 varChar(32)
@UpdateTimestamp
- 更新时间注解,数据更新是会刷新此字段的时间
- 更新机制是由框架实现的,不是数据库的
ON UPDATE CURRENT_TIMESTAMP
@CreationTimestamp
- 创建时间注解,插入数据时会取当前时间
- 更新机制是由框架实现的,不是数据库的
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扩展)
开始
- 在 Spring Data JPA 中,通过Repository来操作数据库。
- 将下面的
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)