交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • Spring Boot2.x集成JPA快速开发的示例代码

     什么是JPA

    一种规范,并非ORM框架,也就是ORM上统一的规范

    • spring-boot-starter-data-jpa 是Spring Boot的项目,包含了spring-data-jpa和一些其他依赖用于Spring Boot项目
    • spring-data-jpa 是Spring Data的项目,就是本体,用于任何项目

    解决

    • 为了执行简单查询分页,编写太多重复代码
    • 基于JPA的数据访问层的增强支持

    用了之后可以做什么,为什么要用?如下代码解释

    实体类

    package com.example.springredis.entity;
    
    import lombok.Data;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import java.io.Serializable;
    
    @Entity
    @Data
    public class User implements Serializable {
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
      private String name;
      private String account;
      private String pwd;
    
    }

    dao层

    @Repository
    public interface UserDao extends JpaRepository<User, Long> {
    
    }

    测试类

    @Autowired
      private UserDao userDao;
    
      public void findAllTest() {
        System.out.println(userDao.findAll().toString());
      }

    上面的操作已经完成了一个查询全部,相信不用在做多余的解释了

    JPA优点:主要就是简单易用,集成方便,可以不用写SQL语句

    准备工作

    • JDK 1.8 以上
    • IDEA 2020.3
    • Gradle 5+ 或者 Maven 3.5+
    • 在 https://start.spring.io/ 初始化一个项目

    这里使用的是Maven,下载之后请在IDEA导入项目

    项目结构图

    先看pom.xml配置

    国外依赖下载慢,更换阿里源

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
      </parent>
      <groupId>com.example</groupId>
      <artifactId>springboot-jpa</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>springboot-jpa</name>
      <description>Demo project for Spring Boot</description>
    
      <properties>
        <java.version>1.8</java.version>
      </properties>
    
      <dependencies>
        <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>com.h2database</groupId>
          <artifactId>h2</artifactId>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
        </dependency>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
        </plugins>
      </build>
    
      <repositories>
        <!--阿里云主仓库,代理了maven central和jcenter仓库-->
        <repository>
          <id>aliyun</id>
          <name>aliyun</name>
          <url>https://maven.aliyun.com/repository/public</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
        <!--阿里云代理Spring 官方仓库-->
        <repository>
          <id>spring-milestones</id>
          <name>Spring Milestones</name>
          <url>https://maven.aliyun.com/repository/spring</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    
    </project>

    定义一个实体对象 SysUser.java

    package com.example.demo.model;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Entity(name = "sys_user")
    public class SysUser {
    
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
    
      private String email;
    
      private String username;
    
      private String password;
    
      public SysUser(String email, String username, String password) {
        this.email = email;
        this.username = username;
        this.password = password;
      }
    }
    • 这里有一个 **SysUser**  类, @NoArgsConstructor   默认构造函数仅为JPA而存在。
    • 另一个构造函数是您将用于创建要保存到数据库的user实例的构造函数。
    • 在类上加 @Entity   注解,表示这个是一个 JPA 的实体,如果在类上没有加 @Table  注解,表明该实体将映射到名为 sys_user   的表,如果要加上,可以在其 name 属性里写入表名,如: @Table(name = "t_user")  
    • id  属性使用 @Id  注释,以便JPA将其识别为对象的ID.
    • @GeneratedValue(strategy = GenerationType.AUTO) 自增长ID策略

     创建一个 UserRepository.java 接口

    这里很简单,直接继承核心接口 JpaRepository

    package com.example.demo.repository;
    
    import com.example.demo.model.SysUser;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface UserRepository extends JpaRepository<SysUser, Long> {
    
    }

    配置文件application.yml

    修改application.properties 为 application.yml

    src/main/resources/application.yml

    spring:
     datasource:
      driverClassName: org.h2.Driver
      password: root
      url: jdbc:h2:mem:demodb:file:data/demo
      username: root
     jpa:
      open-in-view: true
      database-platform: org.hibernate.dialect.H2Dialect
      # spring.jpa.show-sql=true 配置在日志中打印出执行的 SQL 语句信息。
      show-sql: true
      # 配置指明在程序启动的时候要删除并且创建实体类对应的表。
      # create 这个参数很危险,因为他会把对应的表删除掉然后重建。所以千万不要在生成环境中使用。只有在测试环境中,一开始初始化数据库结构的时候才能使用一次。
      # ddl-auto:create----每次运行该程序,没有表格会新建表格,表内有数据会清空
      # ddl-auto:create-drop----每次程序结束的时候会清空表
      # ddl-auto:update----每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新(推荐)
      # ddl-auto:validate----运行程序会校验数据与数据库的字段类型是否相同,不同会报错
      hibernate.ddl-auto: update

    h2数据库

    在resources 文件夹下新建 data.sql

    data.sql

    DROP TABLE IF EXISTS sys_user;
    
    CREATE TABLE sys_user
    (
      id    INT AUTO_INCREMENT PRIMARY KEY,
      email  VARCHAR(250) DEFAULT NULL,
      username VARCHAR(250) NOT NULL,
      password VARCHAR(250) NOT NULL
    );

    测试类进行测试 SpringbootJpaApplicationTests.java

    package com.example.demo;
    
    import com.example.demo.model.SysUser;
    import com.example.demo.repository.UserRepository;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @Slf4j
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootJpaApplicationTests {
    
      @Autowired
      private UserRepository userRepository;
    
      @Before
      public void add() {
        userRepository.save(new SysUser("123@qq.com", "root", "root"));
      }
    
      @Test
      public void contextLoads() {
        System.out.println(userRepository.findAll().toString());
      }
    
      //修改操作
      @After
      public void update() {
        // ifPresent 如果存在值,则使用值调用指定的使用者,否则不执行任何操作。
        userRepository.findById(1L).ifPresent(user -> {
          user.setUsername("马华云腾");
          userRepository.save(user);
          System.out.println(user.toString());
        });
      }
    
      //删除
      @After
      public void del() {
        userRepository.findById(2L).ifPresent(user -> userRepository.delete(user));
      }
    
    }

    测试输出

    常见异常

    如果出现下列等错误:

    Error:(41, 13) java: 找不到符号
    符号: 方法 setName(java.lang.String)
    位置: 类型为com.example.springbootjpademo.entity.User的变量 user

    请注意下面的设置是否正确:

    RestClient API 测试

    ### 新增1
    
    POST http://localhost:8080/user/add
    Content-Type: application/json
    
    {
     "email": "eyck@aws.com",
     "username": "root",
     "password": "root"
    }
    
    ### 新增2
    
    POST http://localhost:8080/user/add
    Content-Type: application/json
    
    {
    "email": "ekko@aws.com",
    "username": "ekko",
    "password": "ekko"
    }
    
    ### 修改
    
    PUT http://localhost:8080/user/update
    Content-Type: application/json
    
    {
     "id": 1,
     "email": "eyck@aws.com",
     "username": "root",
     "password": "root"
    }
    
    ### 获取所有
    GET http://localhost:8080/user/all
    Accept: */*
    Cache-Control: no-cache
    
    ### 删除
    
    PUT http://localhost:8080/user/del/2
    
    ### 获取所有
    GET http://localhost:8080/user/all
    Accept: */*
    Cache-Control: no-cache

    左上角 Run all ...

    测试结果....

    代码地址

    https://github.com/Gleans/spring-boot/tree/master/springboot-jpa

    到此这篇关于Spring Boot2.x集成JPA快速开发的文章就介绍到这了,更多相关Spring Boot2.x集成JPA快速开发内容请搜索北冥有鱼以前的文章或继续浏览下面的相关文章希望大家以后多多支持北冥有鱼!


    广而告之:
    热门推荐:
    PHP7新特性foreach 修改示例介绍

    一、foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动。现在开始,不再如此,见下面代码。。 $array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); } PHP5运行的结果会打印int(1) int(2) bool(false···

    浅析CSS等高布局的6种方式

    前面的话 等高布局是指子元素在父元素中高度相等的布局方式。等高布局的实现包括伪等高和真等高,伪等高只是看上去等高而已,真等高是实实在在的等高。本文将介绍边框模拟、负margin这两种伪等高以及table实现、absolute实现、flex实现和js判断这四种真等高布局 伪等高 边框模···

    织梦DEDECMS会员调用方法详解

    调用12个个人会员按注册时间排序 代码如下: {dede:sql sql='select * from dede_member where mtype="个人" order by mid limit 0,12'} <a href=../member/index.php?uid=[field:userid/] target='_blank'>[f···

    asp.net ASPxTextBox等控件实现"回车模拟Tab"的 常用代码整理

    近期在做一个Web项目,我使用DevExpress第三方控件。 由于该控件使用技巧中文资料较少,还真够呛的,只能边摸索,边开发。 今天我要实现一些编辑框如ASPxTextBox、ASPxComboBox等控件回车模拟Tab的功能。这没办法,用户用惯了回车,讨厌按Tab来移动焦点(鼠标点击更麻烦···

    深思 PHP 数组遍历的差异(array

    function array_diff($array_1, $array_2) {     $diff = array();     foreach ($array_1 as $k => $v1) {         $fl···

    dedecms模板标签代码官方参考

    没想到dedecms可以这样DIY,牛啊 地址:http://www.dedecms.com/archives/templethelp/help/ 在了解DedeCms的模板代码之前,了解一下织梦模板引擎的知识是非常有意义的。织梦模板引擎是一种使用XML名字空间形式的模板解析器,使用织梦解析器解析模板的最大好处是可以轻松···

    基于JavaScript实现评论框展开和隐藏功能

    1.效果图如下所示, 点击评论会在对应的评论区域展开评论输入框,点击取消会取消对应的评论输入框 2.html代码:需要引入jQuery.js <div class="nr-comment"> <div class="nr-comment-con"> <div class="nr-comment-nav"> <div class="comment-number"&g···

    JavaScript Math.ceil 方法(对数值向上取整)

    JavaScript Math.ceil 方法 Math.ceil 方法用于对数值向上取整,即得到大于或等于该数值的最小整数。语法如下: Math.ceil(x) 参数说明: 参数 说明 x 必需。必须是一个数值。 提示:该方法与 Math.floor 方法正好相反。 Math.ceil 方法实例 <script language="Java···

    前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    之前在一个移动端的抽奖页面中,在抽奖结果的展示窗口需要弹幕轮播显示,之前踩过一些小坑,现在总结一下前端弹幕效果的实现方式。 css3实现乞丐版的弹幕 css3弹幕性能优化 canvas实现弹幕 canva弹幕的扩展功能 1. css3实现乞丐版的弹幕 (1)如何通过css3实现弹幕 首先来看如···

    dedecms模板中调用会员信息标签的方法

    很多使用dedecms调用会员信息,下面整理了两种方法:  1织梦CMS v5。7调用文章所属会员信息标签  打开官方默认模板article_artcile.htm,我们可以提取出如下代码:  {dede:memberinfos}  会员头像:<a href="[field:spaceurl /]"···