SpringData JPA
基本介绍
Spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。
同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。
依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
Springboot配置
spring:# 数据源datasource:# mysql 驱动driver-class-name: com.mysql.jdbc.Driver# 数据库地址url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8# 数据库用户名username: root# 数据库密码password: 123456jpa:hibernate:# 启动数据库创建新的表ddl-auto: update# 控制台显示SQLshow-sql: true
配置文件
hibernate.hbm2ddl.auto 参数的作用主要用于:自动创建、更新、验证数据库表结构,有四个值。
参数名 | 说明 |
---|---|
create | 每次加载 Hibernate 时都会删除上一次生成的表,然后根据 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行, 这就是导致数据库表数据丢失的一个重要原因。 |
create-drop | 每次加载 Hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。 |
update | 最常用的属性,第一次加载 Hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库), 以后加载 Hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。 要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。 |
validate | 每次加载 Hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 |
JPA相关注解
注解 | 解释 |
---|---|
@Entity | 声明类为实体或表。 |
@Table | 声明表名。 |
@Basic | 指定非约束明确的各个字段。 |
@Embedded | 指定类或它的值是一个可嵌入的类的实例的实体的属性。 |
@Id | 指定的类的属性,用于识别(一个表中的主键)。 |
@GeneratedValue 指 | 定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。 |
@Transient | 指定的属性,它是不持久的,即:该值永远不会存储在数据库中。 |
@Column | 指定持久属性栏属性。 |
@SequenceGenerator | 指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。 |
@TableGenerator | 指定持久属性栏属性。 |
@Column | 指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。 |
@AccessType | 指定持久属性栏属性。 |
@Column | 这种类型的注释用于设置访问类型。如果设置@AccessType(FIELD),则可以直接访问变量并且不需要getter和setter,但必须为public。 如果设置@AccessType(PROPERTY),通过getter和setter方法访问Entity的变量。 |
@JoinColumn | 指定一个实体组织或实体的集合。这是用在多对一和一对多关联。 |
@UniqueConstraint | 指定的字段和用于主要或辅助表的唯一约束。 |
@ColumnResult | 参考使用select子句的SQL查询中的列名。 |
@ManyToMany | 定义了连接表之间的多对多一对多的关系。 |
@ManyToOne | 定义了连接表之间的多对一的关系。 |
@OneToMany | 定义了连接表之间存在一个一对多的关系。 |
@OneToOne | 定义了连接表之间有一个一对一的关系。 |
@NamedQueries | 指定命名查询的列表。 |
@NamedQuery | 指定使用静态名称的查询。 |
小栗子
新增、修改、删除、查询、分页查询等基础操作。
dao 层
@Repository
public interface BookRepository extends JpaRepository<Book, Long> {
}
实体类
@Data
@Entity
@Table(name = "book")
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "book_name")private String bookName;@Column(name = "author")private String author;@Column(name = "create_time")private Date createTime;@Overridepublic String toString() {return "Book{" +"id=" + id +", bookName='" + bookName + '\'' +", author='" + author + '\'' +", createTime=" + createTime +'}';}
}
新增
@Test
public void saveBook(){Book book=new Book();book.setBookName("Helo");book.setAuthor("ddddd");book.setCreateTime(new Date());System.out.println(bookRepository.save(book));}
修改
@Test
public void updateBook(){Book book=new Book();book.setId(1L);book.setBookName("Helo222");book.setAuthor("ddddd222");book.setCreateTime(new Date());System.out.println(bookRepository.saveAndFlush(book));}
删除
@Test
public void deleteBookById(){bookRepository.deleteById(1L);System.out.println(bookRepository.findAll());}
查询数量
/*** 统计数量*/
@Test
public void getBookCount(){System.out.println(bookRepository.count());}
查询所有
/*** 查询全部图书信息*/
@Test
public void findAllBook(){System.out.println(bookRepository.findAll());}
分页查询
/*** 分页查询*/
@Test
public void findBookByPage(){Pageable pageable=PageRequest.of(1,3,Sort.by(Sort.Order.desc("id")));//分页排序Page<Book> page=bookRepository.findAll(pageable);page.forEach(System.out::println);}