SpringData入门

149 阅读2分钟

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对象。