T O P

[资源分享]     Spring Boot入门系列(二十六)超级简单!Spring Data JPA 的使用!

  • By - 楼主

  • 2021-09-13 14:07:12
  • 之前介绍了Mybatis数据库ORM框架,也介绍了使用Spring Boot 的jdbcTemplate 操作数据库。其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data JPA。

    Spring Data JPA 是Spring Data框架下的一个基于JPA标准操作数据的模块,简化了操作持久层的代码,只需要编写接口就可以。如果你是第一次使用 Spring Data JPA ,你一定会惊呼这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。使用非常简单方便,下面我们就来讲述 JPA 使用的基本操作。

    JPA 是 Spring Boot 官方推荐的数据库访问组件,其充分体现了面向对象编程思想,有点像 asp.net 的 EFCore。JPA 也是众多 ORM 的抽象。

    一、Spring Data JPA介绍

    JPA (Java Persistence API), Java持久层 API的简称,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,JPA是一个基于O/R映射的标准规范。

    JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。主要包括括以下3方面的技术:

    1. ORM映射元数据 将实体对象持久化到数据库表中
    2. API,用来操作实体对象,执行CRUD操作
    3. 查询语言,通过面向对象,而非面向数据库的查询语言查询数据

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率。

    SpringData:其实Spring Data 就是Spring提供了一个操作数据的框架。而Spring Data JPA只是Spring Data框架下的一个基于JPA标准操作数据的模块。

     

    二、SpringBoot整合SpringData JPA

    1、增加JPA的相关依赖

    在pom.xml 中,增加如下配置:

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

    注意,需要添加MySql驱动。

     

    2、修改配置文件

    需要在application.properties 中配置数据源和jpa的基本的相关属性,具体如下:

    #数据库连接
    spring.datasource.url=jdbc:mysql://localhost:3306/zwz_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    #jpa配置
    spring.jpa.properties.hibernate.hbm2ddl.auto=create
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
    #SQL 输出
    spring.jpa.show-sql=true
    #format 下 SQL 进输出
    spring.jpa.properties.hibernate.format_sql=true

    在上面的参数设置说明下:

      1、spring.jpa.properties.hibernate.hbm2ddl.auto: 配置实体类维护数据库表结构的具体行为,

    • update:最常用的属性,表示当实体类的属性发生变化时,表结构跟着更新;
    • create:表示启动的时候删除上一次生成的表,并根据实体类重新生成表,这个时候之前表中的数据就会被清空;
    • create-drop:表示启动时根据实体类生成表,但是当sessionFactory关闭的时候表会被删除;
    • validate:表示启动时验证实体类和数据表是否一致;
    • none:则什么都不做。

      2、spring.jpa.show-sql :表示hibernate在操作的时候在控制台打印真实的sql语句,方便调试。

      3、spring.jpa.properties.hibernate.format_sql:表示格式化输出的json字符串,方便查看。

      4、spring.jpa.properties.hibernate.dialect:指定⽣成表名的存储引擎为 InneoDB 

     

    3、数据库实体类

    数据库实体类是一个 POJO Bean 对象。定义实体类后,在项目启动时,系统会根据实体类创建对应的数据表,实体类如下:

    package com.weiz.pojo;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    /**
     * 用户实体类
     *
     * @author
     * @since
     */
    @Entity
    @Table(name = "Users")
    public class Users {
        @Id
        private Long id;
    
        @Column(length = 32)
        private String name;
    
        @Column(length = 32)
        private String account;
    
        @Column(length = 64)
        private String pwd;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAccount() {
            return account;
        }
    
        public void setAccount(String account) {
            this.account = account;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    }

    代码说明:

      @Entity:必选的注解,声明这个类对应了一个数据库表。
      @Table:可选的注解。声明了数据库实体对应的表信息。包括表名称、索引信息等。这里声明这个实体类对应的表名是 Users。如果没有指定,则表名和实体的名称保持一致,跟@Entity 注解配合使用
      @Id注解:声明了实体唯一标识对应的属性,。
      @Column注解:用来声明实体属性的表字段的定义。默认的实体每个属性都对应了表的一个字段。字段的名称默认和属性名称保持一致(并不一定相等)。字段的类型根据实体属性类型自动推断。这里主要是声明了字符字段的长度。如果不这么声明,则系统会采用 255 作为该字段的长度。

    注意:这些注解是建立基于 POJO 的实体对象,需要注意的是 JPA 与 Mybatis 是有区别的。

     

    4、运行验证

    以上就是整合jpa的全部配置,配置完之后,启动项目,我们就可以看到日志中如下的内容:

     同时,连上数据库之后,可以看到Users 表也创建成功了。

     

    三、定义Repository 

    项目整合 jpa 成功之后,接下来可以定义Repository 数据访问接口了,只需要继承 JpaRepository 类,就会帮我们自动生成很多内置方法,如下:

    package com.weiz.dao;
    
    import com.weiz.pojo.Users;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UserRespository extends JpaRepository<Users, Long> {
    
    }

    上面的代码可以看到,我们基本上一行代码也不用写,就能实现Users 用户的增删改查等全部的方法。

     

    四、如何调用

    上面,我们创建了UserRespository 数据接口,接下来就来调用该接口实现简单的增删改查。

    package com.weiz.controller;
    
    import com.weiz.dao.UserRespository;
    import com.weiz.pojo.Users;
    import com.weiz.utils.JSONResult;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.Optional;
    
    @RestController
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserRespository userRespository;
    
        @RequestMapping("/save")
        public JSONResult save(){
            Users user = new Users();
            user.setId((long) 1);
            user.setName("spring boot jpa");
            user.setPwd("123456");
            userRespository.save(user);
            return JSONResult.ok("保存成功");
        }
    
        @RequestMapping("/update")
        public JSONResult update() {
            Users user = new Users();
            user.setId((long) 1);
            user.setName("spring boot jpa update");
            user.setPwd("123456");
            user.setAccount("sbj");
            userRespository.save(user);
            return JSONResult.ok("修改成功");
        }
    
        @RequestMapping("/delete")
        public JSONResult delete() {
            Users user = new Users();
            user.setId((long) 1);
            userRespository.delete(user);
            return JSONResult.ok("删除成功");
        }
    
        @RequestMapping("/select")
        public JSONResult select() {
            Optional<Users> users = userRespository.findById((long) 1);
            return JSONResult.ok(users);
        }
    }

    以上的controller 就是简单的调用增删改查的方法。增加了对应的controller 之后,启动项目即可测试用户的增删改查功能。这里就不一一截图了。

     

    最后

    以上就实现了spring boot 整合 jpa 操作数据库,是不是特别简单,整个过程我们所做的仅仅上面简单的四步:

    1、增加jpa的依赖

    2、在配置文件中里面增加数据库配置信息。

    3、声明一个 Users 的数据库实体对象。

    4、声明了一个持久层的接口,继承JpaRepository<T, ID> 接口。

    这样,整个用户管理模块的增加、删除、修改、查询功能就实现了,甚至还有排序和分页的功能。

    这就是 JPA 的强大之处。除了这些接口外,用户还会有其他的一些自定义的查询需求, JPA 也一样可以满足你的需求。

    这个系列课程的完整源码,也会提供给大家。大家关注我的微信公众号( 架构师精进),回复: springboot源码 ,获取这个系列课程的完整源码。

     

    本帖子中包含资源

    您需要 登录 才可以下载,没有帐号?立即注册