Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工做和整合 ORM 技术。值得注意的是,JPA只是一套规范,不是具体的实现。Java很喜欢本身去定义规范,而后让厂商本身去实现,好比JMS等。java
Spring Data JPA是 Spring 基于 ORM(hibernate) 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,按照约定好的【方法命名规则】写数据库(DAO)层接口,就能够在不写接口实现的状况下,实现对数据库的访问和操做。同时提供了不少除了CRUD以外的功能,如分页、排序、复杂查询等等。mysql
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
复制代码
这里我引入了阿里巴巴的druid数据库链接池。spring
spring.datasource.druid.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
复制代码
这里基本是固定的写法了,不一样的是,这里的数据库链接池我使用了阿里巴巴的链接池。sql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
复制代码
spring.jpa.database-platform主要是指定生成表名的存储引擎为 InnoDBD数据库
show-sql 是否打印出自动生成的 SQL,方便调试的时候查看springboot
spring.jpa.hibernate.ddl-auto参数的做用主要用于:自动建立更新验证数据库表结构,有五个值bash
@Entity
@Table(name = "user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;
@Column(name = "username", unique = true, nullable = true, length = 50)
private String username;
private String password;
}
复制代码
可使用Column注解来定义一些数据库表结构的东西,若是不使用,会自动使用驼峰的命名规则映射默认值。服务器
这里生成了User表,能够看下它的表结构:session
这里还生成了一个hibernate_sequence表:app
主要是由于我设置了主键的值策略为GenerationType.SEQUENCE,它是根据这个表来实现自增的。
public interface UserRepo extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {
}
复制代码
这里继承了PagingAndSortingRepository和JpaSpecificationExecutor两个接口,前者帮咱们实现了CRUD、排序和分页等简单查询,后者是用来构造一些比较复杂的查询用的。
userRepo.findById(1);
userRepo.findAll();
userRepo.findAll(PageRequest.of(0, 10));
userRepo.deleteById(1);
User user = new User();
userRepo.save(user);
复制代码
这里是基础的CRUD的使用方法了。须要注意的是,修改实体的话,是根据save方法来判断的,若是save的实体是从数据库里查出来的,save的时候就是修改。
User findUserByUsername(String username);
User findUserByUsernameAndPassword(String username,String password);
复制代码
spring data jpa有一套映射到sql查询的方法命名规则。整理以下:
使用这些提供的查询方法,基本上能够应付咱们须要的单表查询了。
Page<User> findALL(Pageable pageable);
Page<User> findByUserName(String userName,Pageable pageable);
复制代码
可使用PageRequest.of(0, 10)来构建一个pageable。须要注意的是,这里分页从0开始。
在UserRepo上,自定义方法。在 SQL 的方法上面使用@Query注解来写SQL,如涉及到删除和修改在须要加上@Modifying.也能够根据须要添加 @Transactional对事物的支持
@Transactional
@Modifying
@Query("update User u set u.username= ?1 where u.id = ?2")
int modifyByIdAndUserId(String username, Integer id);
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
复制代码