SpringData Jpa使用步骤
SpringData简介:SpringData是Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。
其主要目标是使数据库的访问变得方便快捷。
建立springboot工程
<dependencies>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
注意设置: spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect,自动生成表时数据库引擎为InnoDB,默认生成为MyISAM,MySQL8Dialect为MySQL版本为8.0,如果版本为5.7 则改为MySQL57Dialect。
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.11:3306/SpringData?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
建立实体类
@Data
@Entity
@Table
public class Article {
/**
* 主键
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String name;
private LocalDateTime createDateTime;
}
建立Repository
/**
* 继承springdata jpa 提供的JpaRepository<实体类型,主键参数类型>
*/
public interface ArticleRepository extends JpaRepository<Article, Integer> {
}
测试使用
添加或更新
@Autowired
private ArticleRepository articleRepository;
@Test
public void saveTest() {
//保存单个
Article article = new Article();
article.setName("felix");
article.setTitle("SpringData");
article.setId(2);
article.setCreateDateTime(LocalDateTime.now());
Article article1 = articleRepository.save(article);
log.info("Article:{}", article1);
Article article2 = new Article();
article2.setName("felix");
article2.setTitle("SpringData");
article2.setCreateDateTime(LocalDateTime.now());
//批量保存多个
List<Article> articles = new ArrayList<>();
articles.add(article);
articles.add(article2);
List<Article> articles1 = articleRepository.saveAll(articles);
log.info("articles1:{}", articles1);
Article article3 = articleRepository.saveAndFlush(article);
log.info("article3:{}", article3);
}
- 保存 三个方法save(),saveAll(),saveAndFlush():先查询后保存:
save():执行保存过程
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: insert into article (create_date_time, name, title) values (?, ?, ?)
saveAll():执行保存过程
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: insert into article (create_date_time, name, title) values (?, ?, ?)
Hibernate: insert into article (create_date_time, name, title) values (?, ?, ?)
saveAndFlush():执行保存过程
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: insert into article (create_date_time, name, title) values (?, ?, ?)
更新
只要保存实体时主键不为空,
save():执行保存过程
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: update article set create_date_time=?, name=?, title=? where id=?
saveAll():执行保存过程
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: update article set create_date_time=?, name=?, title=? where id=?
saveAndFlush():执行保存过程
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: update article set create_date_time=?, name=?, title=? where id=?
删除
@Test
public void deleteTest() {
//根据ID删除
articleRepository.deleteById(1);
//根据实体删除
Article article = new Article();
article.setId(1);
articleRepository.delete(article);
//批量删除
articleRepository.deleteAllInBatch();
//删除所有
articleRepository.deleteAll();
List<Article> articles = new ArrayList<>();
articles.add(article);
//删除所有
articleRepository.deleteAll(articles);
//批量删除
articleRepository.deleteInBatch(articles);
}
- deleteById(id) 根据主键删除,执行过程先查询在删除,
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: delete from article where id=?
如果Id不存在会出现异常org.springframework.dao.EmptyResultDataAccessException: No class com.felix.springdata.model.Article entity with id 1 exists!
,
2. delete(S s) 根据实体删除,执行过程同deleteById ,先查询Id是否存在,存再删除,不存在不执行删除
3. deleteAllInBatch() 直接删除
Hibernate: delete from article
4.deleteAll() 删除全部,先查询,再删除,没有数据,只执行查询语句
Hibernate: select article0_.id as id1_0_, article0_.create_date_time as create_d2_0_, article0_.name as name3_0_, article0_.title as title4_0_ from article article0_
Hibernate: delete from article where id=?
Hibernate: delete from article where id=?
Hibernate: delete from article where id=?
Hibernate: delete from article where id=?
5.deleteAll(S s) 删除全部, 先查询id是否存在,再删除
Hibernate: select article0_.id as id1_0_0_, article0_.create_date_time as create_d2_0_0_, article0_.name as name3_0_0_, article0_.title as title4_0_0_ from article article0_ where article0_.id=?
Hibernate: delete from article where id=?
6.deleteInBatch() 删除全部,主要是根据id删除
Hibernate: delete from article where id=? or id=?