欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot系列(四)SpringBoot 之 Spring Data Jpa 支持

程序员文章站 2022-06-14 15:23:57
...

本系列博客将学习开发SpringBoot,快速开发项目


SpringBoot系列 (四):SpringBoot 之 Spring Data Jpa 支持

文档结构

  1. Spring Data Jpa 简介
  2. Spring Data Jpa 基本 crud 实现
  3. 自定义查询@Query
  4. 动态查询 Specification 使用

一、 Spring Data Jpa 简介

Spring-Data-Jpa

JPA(Java Persistence API)定义了一系列对象持久化的标准,

目前实现这一规范的产品有Hibernate、TopLink等。

Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,至此,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成!

下面我们来演示下SpringBoot下 Spring-Data-Jpa的使用

本贴就简单演示下 配置 以及自动生成表

首先第一步,引入jpa和mysql驱动支持

还是前面的方式 进入pom.xml,alt+/ 进入编辑视图

选择jpa和mysql

然后自动会引入

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

接下来配置application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/db_book

spring.datasource.username=root

spring.datasource.password=123456



spring.jpa.hibernate.ddl-auto=update

spring.jpa.show-sql=true

上面是配置数据源

下面是配置比如ddl-auto 学过hibernate的都知道 我们一般用update 更新操作

show-sql 是显示sql语句

(当然上面我们会发现 这种properties形式的配置有点冗余,后面一一帖我们改成主流的yml形式)

二、Spring Data Jpa 基本 crud 实现

1、在application.yml中添加:

msyql:
   jdbcName: com.mysql.jdbc.Driver
   dbUrl: jdbc:mysql://localhost:3306/db_diary
   userName: root
   password: 123456

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_book
username: root
password: 123456
jpa:
hibernate.ddl-auto: update
show-sql: true

2、创建实体类:

@Entity
@Table(name="t_book")
public class Book {

@Id
@GeneratedValue
private Integer id;

@Column(length=100)
private String name;

@Column(length=50)
private String author;
//省略get、set方法

3、dao层

package com.tofree.dao;

import org.springframework.data.jpa.repository.JpaRepository;

import com.tofree.entity.Book;

public interface BookDao extends JpaRepository<Book, Integer>{

}

4、controller层

package com.tofree.controller;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.tofree.dao.BookDao;
import com.tofree.entity.Book;

/**
 * 图书控制器
 * @author tofree
 *
 */
@Controller
@RequestMapping("/book")
public class BookController {

@Resource
private BookDao bookDao;

/**
 * 查询所有图书
 * @return
 */
@RequestMapping("/list")
public ModelAndView list(){
    ModelAndView mav=new ModelAndView();
    mav.addObject("bookList", bookDao.findAll());
    mav.setViewName("bookList");
    return mav;
}

/**
 * 添加图书
 * @param book
 * @return
 */
@RequestMapping(value="/add",method=RequestMethod.POST)
public String add(Book book){
    bookDao.save(book);
    return "forward:/book/list";
}

/**
 * 根据id查询book实体
 * @param id
 * @return
 */
@RequestMapping("/preUpdate/{id}")
public ModelAndView preUpdate(@PathVariable("id")Integer id){
    ModelAndView mav=new ModelAndView();
    mav.addObject("book", bookDao.getOne(id));
    mav.setViewName("bookUpdate");
    return mav;
}

/**
 * 修改图书
 * @param book
 * @return
 */
@PostMapping(value="/update")
public String update(Book book){
    bookDao.save(book);
    return "forward:/book/list";
}

@GetMapping("/delete")
public String delete(Integer id){
    bookDao.delete(id);
    return "forward:/book/list";
}
}

注意:save()有id就修改,没有就添加

三、自定义查询@Query

自定义查询的实现方式有两种:
1. Hql语言,Hibernate的sql: @Query(“select b from Book b where b.name like %?1%”)
2. 本地sql(推荐使用): @Query(value=”select * from t_book order by RAND() limit ?1”,nativeQuery=true)

dao层:

package com.tofree.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import com.tofree.entity.Book;

public interface BookDao extends JpaRepository<Book, Integer>{

@Query("select b from Book b where b.name like %?1%")
public List<Book> findByName(String name);

@Query(value="select * from t_book order by RAND() limit ?1",nativeQuery=true)
public List<Book> randomList(Integer n);

}

controller层:

@ResponseBody
@GetMapping("/queryByName")
public List<Book> queryByName(){
    return bookDao.findByName("编程");
}

@ResponseBody
@RequestMapping("/randomList")
public List<Book> randomList(){
    return bookDao.randomList(2);
}

四、 动态查询 Specification 使用

在项目里搜索条件往往是多个的,比如有时候根据name搜索,有时根据作者搜索,此时可以使用:动态查询 Specification

步骤:
1. 在dao层添加JpaSpecificationExecutor接口
2. 在controller层实现方法

dao层:

package com.tofree.dao;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

import com.tofree.entity.Book;

public interface BookDao extends JpaRepository<Book, Integer>,JpaSpecificationExecutor<Book>{

}

controller层:

/**
 * 根据条件动态查询
 * @param book
 * @return
 */
@RequestMapping("/list2")
public ModelAndView list2(Book book){
    ModelAndView mav=new ModelAndView();
    List<Book> bookList=bookDao.findAll(new Specification<Book>() {

        @Override
        public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Predicate predicate=cb.conjunction();
            if(book!=null){
                if(book.getName()!=null && !"".equals(book.getName())){
                    predicate.getExpressions().add(cb.like(root.get("name"), "%"+book.getName()+"%"));
                }
                if(book.getAuthor()!=null && !"".equals(book.getAuthor())){
                    predicate.getExpressions().add(cb.like(root.get("author"), "%"+book.getAuthor()+"%"));
                }
            }
            return predicate;
        }
    });
    mav.addObject("bookList", bookList);
    mav.setViewName("bookList");
    return mav;
}

注意:predicate.getExpressions().add(cb.like(root.get(“name”), “%”+book.getName()+”%”)); 模糊查询使用like,等于使用equal

相关标签: spring spring-boo