spring data jpa快速入门案例

1.什么是spring data jpa?

jpa(java persistence Api)和spring data是两个范畴的概念。作为一名javaEE工程师,基本都听说过hibernate框架,hibernate是一个orm框架,而jpa则是一种orm规范,jpa和hibernate的关系就像jdbc与jdbc驱动的关系,即jpa制定了orm规范,而hibernate是这些规范的实现,(事实上,是先有的hibernate后有的jpa),因此,jpa相当于是hibernate的一个子集。spring data是spring的一个子项目,致力于简化数据库访问,通过规范的方法名称来分析开发者的意图,进而减少数据库访问层的代码量,spring data不仅支持关系型数据库,也支持非关系型数据库,spring data jpa可以有效简化关系型数据库访问代码。

2.spring boot整合spring data jpa

1)创建数据库jpa

create database if not exists jpa;

2)创建springboot项目,添加MySQL和spring data jpa的依赖,代码如下

 <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>
            <scope>runtime</scope>
        </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>

3)数据库配置

在application.properties中配置数据库基本信息以及jpa相关配置

1~4行是数据库基本信息配置,5~8行是JPA相关配置,第5行代表代表是否在控制台打印JPA执行过程生成的SQL,第6行代表JPA对应的数据库是MySQL,第7行代表项目在启动时更新数据库中的表,可选择的值有(create,create-drop,validate,no),第8行代表使用数据库方言是MySQL57Dialect

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///jpa?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

4)编写实体类

创建一个book类

@Entity表是该类是一个实体类,@Table表示对应的表的名字,@Id表示该属性是一个主键,@GeneratedValue表示主键自动生成,strategy表示主键生成策略,@Column可以定制生成的字段的属性,nullable表示该字段非空,@Transient注解表示在生成数据库表的时候该字段自动被忽略,即不生成对应的字段

package springjpademo.demo.com.fqh.entity;

import javax.persistence.*;

@Entity
@Table(name = "book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name = "name",nullable = false)
    private String name;
    @Column(name="author")
    private String author;
    @Column(name = "price")
    private Float price;
    @Transient
    private String description;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

5)创建BookDao接口

创建Book'Dao接口,继承JpaRepository,第一个泛型是你需要操作的类,第二个泛型是你操作的表中的主键类型

package springjpademo.demo.com.fqh.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import springjpademo.demo.com.fqh.entity.Book;

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

6)创建bookService

package springjpademo.demo.com.fqh.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import springjpademo.demo.com.fqh.entity.Book;
import springjpademo.demo.com.fqh.repository.BookDao;

@Service
public class BookService {
    @Autowired
    private BookDao bookDao;
    public void addBook(Book book){
        bookDao.save(book);
    }
}

7)创建bookController

package springjpademo.demo.com.fqh.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import springjpademo.demo.com.fqh.entity.Book;
import springjpademo.demo.com.fqh.service.BookService;

@RestController
public class BookController {
    @Autowired
    private BookService bookService;
    @GetMapping("/save")
    public void save(){
        Book book=new Book();
        book.setName("java开发之战");
        book.setAuthor("鲁迅");
        book.setPrice(13f);
        book.setDescription("这是一本好书");
        bookService.addBook(book);
    }
}

8)运行springboot项目

运行项目,控制台打印SQL语句Hibernate: insert into book (author, name, price) values (?, ?, ?)

访问http://localhost:8080/save

查看数据库自动创建表

 

 

 3.JPQL

JPQL是一种面向对象表达式语言,可以将SQL语法和简单查询语义绑定在一起,使用这种语言编写的查询是可以移植的,可以被编译成所有主流的数据库服务器上的SQL,JPQL与原始SQL语句类似,并且完全面向对象,可以通过类名和属性访问,而不是表名和表的属性,类似于HQL,查询使用:id,:name这种方式来绑定参数,注意:这里的列名是属性的名称而不是数据库中列的名称。

select 实体别名.属性名, 实体别名.属性名 from 实体名 as 实体别名 where 实体别名.实体属性 op 比较值

在写语句的时候我们可能需要使用到参数,如果是位置参数使用“?” ,如果是参数则使用 “:XX “

使用@Query注解创建查询,将该注解贴在dao的方法上,然后提供一个需要的JPQL语句即可,如:

@Query("SELECT p FROM Person p WHERE name LIKE %?1%")
Person findByName(String name);
很多开发者在创建 JPQL 时喜欢使用命名参数来代替位置编号,@Query 也对此提供了支持。JPQL 语句中通过”: 变量”的格式来指定参数,同时在方法的参数前面使用 @Param 将方法参数与 JPQL中的命名参数对应,示例如下:
@Query("SELECT p FROM Person p WHERE name LIKE %:name%")
Person findByName(@Param("name") String name);

我们需要使用@Modifying注解来标识该方法执行的是更新或者删除操作,如:

@Modifying
@Query("UPDATE Person p SET p.name = :name WHERE p.id = :id")
void updatePersonName(@Param("id") Integer id, @Param("name") String name);

 

posted @ 2019-12-09 17:37  本兮嘻嘻  阅读(1484)  评论(0编辑  收藏  举报