侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 93 篇文章
  • 累计创建 110 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

Spring Boot 整合 JPA

Epoch
2020-05-06 / 0 评论 / 0 点赞 / 283 阅读 / 1,782 字 / 正在检测是否收录...

目标:Spring Boot 整合 JPA
工具:IDEA–2020.1
学习目标:框架工具集成
本次学习的工程下载链接放到文本最后面

  • 综合概述

JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范。其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据。 简而言之,JPA提供了使用面向对象的方式操作数据库的功能。JPA充分吸收了现有Hibernate,TopLink,JDO等ORM框架的优势,具有易于使用、伸缩性强等优点。

Spring Data JPA是Spring基于Spring Data框架对于JPA规范的一套具体实现方案,使用Spring Data JPA可以极大地简化JPA 的写法,几乎可以在不写具体实现的情况下完成对数据库的操作,并且除了基础的CRUD操作外,Spring Data JPA还提供了诸如分页和排序等常用功能的实现方案。合理的使用Spring Data JPA可以极大的提高我们的日常开发效率和有效的降低项目开发成本。

  • 使用

    • 引入JPA依赖
      创建SpringBoot项目,引入 JPA,MySQL,Web依赖,和数据库连接池依赖
<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>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </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>

    <!-- swagger -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>

</dependencies>
  • 配置连接数据库参数和jpa参数–application.yml
server:
  port: 8080
spring:
  # 配置数据源信息
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: root
  jpa:
    show-sql: true # 默认false,在日志里显示执行的sql语句
    database: mysql
    hibernate.ddl-auto: update #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会 
    新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建
    properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect # 使用JPA
    创建表时,默认使用的存储引擎是MyISAM,通过指定数据库版本,可以使用InnoDB
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      naming:
        #指定jpa的自动表生成策略,驼峰自动映射为下划线格式
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl             
        #physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  • 然后,编写一个SysUserDao并继承JpaRepository,由此我们已经继承了大部分可用的CURD操作,针对基础操作,DAO完全不用写任何方法。
public interface SysUserDao extends JpaRepository<SysUser,Long>, Serializable {
}

使用Spring Data JPA,可以通过两种方式使用 JPA 进行数据持久化。

方式一:使用Spring Data JPA 提供的接口默认实现,如上面我们的DAO实现。

方式二:自定义符合Spring Data JPA规则的查询方法,由框架将其自动解析为SQL。

  • 接着编写一个服务接口,添加用户保存、删除、查询全部和分页查询的方法。
package com.xmaven.service;

import com.xmaven.model.SysUser;
import com.xmaven.util.PageQuery;

import java.util.List;

public interface  SysUserService {

    /**
     * 保存用户
     * @param user
     */
    public void save(SysUser user);

    /**
     * 删除用户
     * @param id
     */
    public void delete(SysUser user);

    /**
     * 查询全部用户
     * @return
     */
    public List<SysUser> findAll();

    /**
     * 查询分页数据
     * @return
     */
    public Object findPage(PageQuery pageQuery);
 }

这个里面需要写一个工具类名叫PageQuery,代码如下

package com.xmaven.util;

public class PageQuery {

	private int page;
	private int size;
	
	public int getPage() {
		return page;
	}
	public void setPage(int page) {
		this.page = page;
	}
	public int getSize() {
		return size;
	}
	public void setSize(int size) {
		this.size = size;
	}
	
}
  • 继续编写服务实现类并调用DAO实现相应功能,以下DAO方法都是继承而来的,除此之后,JPA还提供了大量的API可用。
package com.xmaven.service.impl;

import com.xmaven.dao.SysUserDao;
import com.xmaven.model.SysUser;
import com.xmaven.service.SysUserService;
import com.xmaven.util.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SysUserServiceImpl implements SysUserService {

    @Autowired
    private SysUserDao sysUserDao;

    @Override
    public void save(SysUser user) {
        sysUserDao.save(user);
    }

    @Override
    public void delete(SysUser user) {
        sysUserDao.delete(user);
    }

    @Override
    public List<SysUser> findAll() {
        return sysUserDao.findAll();
    }

    @Override
    public Object findPage(PageQuery pageQuery) {
        return sysUserDao.findAll(PageRequest.of(pageQuery.getPage(),
        pageQuery.getSize()));
    }

}
  • 接着编写一个用户控制器,调用服务接口实现对应功能。
package com.xmaven.controller;


import com.xmaven.model.SysUser;
import com.xmaven.service.SysUserService;
import com.xmaven.util.PageQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("user")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;
    
    @PostMapping(value="/save")
    public Object save(@RequestBody SysUser user) {
    	sysUserService.save(user);
        return 1;
    }
    
    @PostMapping(value="/delete")
    public Object delete(@RequestBody SysUser user) {
    	sysUserService.delete(user);
    	return 1;
    }
    
    @GetMapping(value="/findAll")
    public Object findAll() {
        return sysUserService.findAll();
    }
    
    @PostMapping(value="/findPage")
    public Object findPage(@RequestBody PageQuery pageQuery) {
    	return sysUserService.findPage(pageQuery);
    }
    
}
  • 集成swagger–添加一个swagger 配置类,在工程下新建 config 包并添加一个 SwaggerConfig 配置类。
package com.xmaven.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any()).build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("SpringBoot API Doc")
                .description("This is a restful api document of Spring Boot.")
                .version("1.0")
                .build();
    }

}

KNB.png

  • 然后调用save接口,分别插入以下三条数据。
{
  
  "id": 1,
  "name": "111",
  "email": "111@qq.com",
  "password": "111"
}

{
  
  "id": 2,
  "name": "222",
  "email": "222@qq.com",
  "password": "222"
}

{
  
  "id": 3,
  "name": "333",
  "email": "333@qq.com",
  "password": "333"
}
  • 回来继续调用findAll接口,可以看到我们已经成功的插入了三条数据。

VMM}WRS_VII7H_DQ(H%W49N.png

其他的接口留给你们自己去测试

*工程第一次启动记得改application.yml里面的文件,第一次用就改为create,后面再用的话就改为update

hibernate.ddl-auto: create


下载链接:springboot-jpa-swagger.rar

0

评论区