zoukankan      html  css  js  c++  java
  • 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);

    一点点学习,一丝丝进步。不懈怠,才不会被时代所淘汰!

  • 相关阅读:
    进程、线程
    listview
    Jquery小知识点
    Jquery
    ling查询
    linq
    登陆状态显示
    母版页
    js的触发方式
    js
  • 原文地址:https://www.cnblogs.com/fqh2020/p/12012419.html
Copyright © 2011-2022 走看看