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

本系列博客将学习开发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

然后自动会引入


mysql
mysql-connector-java
runtime


org.springframework.boot
spring-boot-starter-data-jpa

接下来配置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{

}

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{

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

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

}

controller层:

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

@ResponseBody
@RequestMapping("/randomList")
public List 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,JpaSpecificationExecutor{

}

controller层:

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

        @Override
        public Predicate toPredicate(Root 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,Boot)