springData是一个Spring框架的子项目,目的是提供一种简单的方法来与各种关系型数据库或者NoSQL数据库进行交互。
SpringData能够为我们提供一种通用的API,让我们不需要写大量的重复的DAO代码,只需要遵循SpringData提供的一些规则和约定即可。SpringData支持的数据库种类非常多,如:MySQL、Oracle、MongoDB等等。
SpringData通过提供一种通用的API,来消解不同数据库之间的差异,为我们提供一种灵活的、可配置的数据访问层框架。SpringData提供的API包括Repository、CrudRepository、PagingAndSortingRepository、JpaRepository等。
其中,Repository是最基本的接口,定义了一些最基本的CRUD操作(增加、查询、修改和删除)。CrudRepository则继承了Repository接口,增加了批量操作。PagingAndSortingRepository继承了CrudRepository接口,增加了分页和排序的接口。而JpaRepository则在PagingAndSortingRepository的基础上增加了一些JPA(Java持久化API)自带的一些功能。
实现对文章的增删改查、分页查询功能。
1.添加依赖
在pom.xml中添加SpringData JPA、SpringBoot Web、MySQL连接器的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
**
2.配置数据源
在application.properties中配置数据库相关信息:
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
**
3.创建实体类
创建Article实体类,使用@Entity注解来标注该类为实体类,@Id注解表示该属性为主键:
@Entity
@Table(name = "article")
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
private Date createTime;
//getter和setter方法
}
**
4.创建Repository接口
创建ArticleRepository接口,继承JpaRepository接口,并继承JpaSpecificationExecutor接口,来对Article实体类进行增删改查、分页查询操作:
@Repository
public interface ArticleRepository extends JpaRepository<Article, Long>, JpaSpecificationExecutor<Article> {
}
**
在这个示例中,我们在ArticleRepository接口中继承了JpaSpecificationExecutor接口,用于支持分页查询、动态条件查询。
5.创建Service层
创建ArticleService类,并注入ArticleRepository实例,并定义增删改查、分页查询相关方法:
@Service
public class ArticleService {
@Autowired
private ArticleRepository articleRepository;
public Article addArticle(Article article) {
return articleRepository.save(article);
}
public void deleteArticleById(Long id) {
articleRepository.deleteById(id);
}
public Article updateArticle(Article article) {
return articleRepository.save(article);
}
public Article findArticleById(Long id) {
Optional<Article> optional = articleRepository.findById(id);
return optional.orElse(null);
}
public List<Article> findAllArticles() {
return articleRepository.findAll();
}
public Page<Article> findArticlesByPage(int page, int size, String title) {
//动态构建查询条件
Specification<Article> specification = (Root<Article> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
List<Predicate> list = new ArrayList<>();
if (title != null && !title.isEmpty()) {
list.add(cb.like(root.get("title").as(String.class), "%" + title + "%"));
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
};
//构建分页对象
Pageable pageable = PageRequest.of(page - 1, size, Sort.Direction.DESC, "createTime");
return articleRepository.findAll(specification, pageable);
}
}
**
在这个示例中,我们使用JpaSpecificationExecutor支持动态构建查询条件,并使用PageRequest构建分页对象。
6.创建Controller层
创建ArticleController类,并注入ArticleService实例,并定义增删改查、分页查询接口:
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping("")
public Article addArticle(@RequestBody Article article) {
return articleService.addArticle(article);
}
@DeleteMapping("/{id}")
public void deleteArticleById(@PathVariable("id") Long id) {
articleService.deleteArticleById(id);
}
@PutMapping("")
public Article updateArticle(@RequestBody Article article) {
return articleService.updateArticle(article);
}
@GetMapping("/{id}")
public Article findArticleById(@PathVariable("id") Long id) {
return articleService.findArticleById(id);
}
@GetMapping("/list")
public List<Article> findAllArticles() {
return articleService.findAllArticles();
}
@GetMapping("")
public Page<Article> findArticlesByPage(@
@PathVariable(“title”) String title, @RequestParam(“page”) int page, @RequestParam(“size”) int size
ArticleController类中定义了对Article实体类进行增删改查、分页查询的接口。其中,@PathVariable注解用于获取URL中的参数,@RequestParam注解用于获取请求参数。我们使用title参数去执行模糊查询,使用page和size参数进行分页查询,并返回一个Page对象。