解读SpringBoot整合持久层技术之搭建并整合Spring Data JPA项目实战

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 接下来这阵子就SpringBoot整合持久层技术进行一个项目的搭建,做一个练手,以前搞过但是都淡忘了,特意来总结一下。今天是JPA,后面陆续搭建MyBatis、JdbcTemplate等持久层技术,供大家相互学习。

解读SpringBoot整合持久层技术之搭建并整合Spring Data JPA项目实战

接下来这阵子就SpringBoot整合持久层技术进行一个项目的搭建,做一个练手,以前搞过但是都淡忘了,特意来总结一下。今天是JPA,后面陆续搭建MyBatis、JdbcTemplate等持久层技术,供大家相互学习。

创建SpringBoot项目

直接上图吧

20200617121124399.png

20200617121249456.png

在SQL里选择了Spring Data JPA MySql Driver Template Engines 选择 Thymeleaf

20200617121300271.png

20200617121312677.png

创建成功后就是这样的一个项目结构:

20200617121329294.png

首先创建一个mysql数据库 创建一个名为book的数据库,里面可以为空,因为JPA会帮我们自动根据实体来进行表的创建。


pom.xml文件

创建成功后我们的pom.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         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.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.springboot</groupId>
    <artifactId>jpa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jpa</name>
    <description>Demo project for Spring Boot JPA</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-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </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>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

接下来就是在项目中配置相关的数据库,在这里我们采用的是properties 有的同学可以用yml文件来进行配置,二者都是一样的。想用哪个都是一样的,至于二者有什么不同等我再写一个文章吧。


在这里我们采用了阿里的Druid,别问为什么,就是很好用,记得加上&serverTimezone=UTC这句,否则数据库链接报错。

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#是否在控制台打印输出的sql语句
pring.jpa.show-sql=true
spring.jpa.database=mysql
#表示项目在启动时根据实体类来进行数据库表的更新
spring.jpa.hibernate.ddl-auto=update
#表示使用的数据库方言是MySQL57Dialect
#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.dialect.MySQL57Dialect
创建实体

省略get和se方法了,自己加上。

@Entity(name = "bookinfo")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "name",nullable = false)
    private String name;
    @Column(name = "author",nullable = false)
    private String author;
    @Column(name = "price",nullable = true)
    private Float price;
    @Transient
    private String description;
  }
创建一个BookDao的接口
/**
 * @program: jpa
 * @description: 这是一个BOOKDao接口
 * @author: zjc
 **/
public interface BookDao extends JpaRepository<Book,Integer> {
    List<Book> getBooksByAuthorStartingWith(String author);
    List<Book> getBooksByPriceGreaterThan(Float price);
    @Query(value = "select * from bookinfo where id=(select max(id) from bookinfo)",nativeQuery = true)
    Book getMaxIdBook();
    @Query("select b from bookinfo b where b.id>:id and b.author=:author")
    List<Book> getBookByIdAndAuthor(@Param("id") Integer id,@Param("author") String author);
    @Query("select b from bookinfo b where b.id<?1 and b.name like %?2%")
    List<Book> getBookByIdAndName(@Param("id") Integer id,@Param("name") String name);
}

一定要注意sql语句传递参数的顺序,这里的?1和?2就是表示传参数的顺序。

创建BookService业务逻辑层
/**
 * @program: jpa
 * @description: 这是一个BOOKsERVICE
 * @author: zjc
 **/
@Service
public class BookService {
    @Autowired
    BookDao bookDao;
    public void addBook(Book book){
        bookDao.save(book);
    }
    public Page<Book> getBookByPage(Pageable pageable){
        return bookDao.findAll(pageable);
    }
    public List<Book> getBooksByAuthorStartingWith(String author){
        return bookDao.getBooksByAuthorStartingWith(author);
    }
    public List<Book> getBooksByPriceGeneraterThan(Float price){
        return bookDao.getBooksByPriceGreaterThan(price);
    }
    public Book getMaxIdBook(){
        return bookDao.getMaxIdBook();
    }
    public List<Book> getBookIdAndAuthor(Integer id,String author){
        return bookDao.getBookByIdAndAuthor(id,author);
    }
    public List<Book> getBooksByIdAndName(Integer id,String name){
        return bookDao.getBookByIdAndName(id,name);
    }
}

最后我们创建一个controller层进行测试。

创建Controller控制层
/**
 * @program: jpa
 * @description: 这是一个简单的BookController
 * @author: zjc
 **/
@RestController
public class BookController {
    @Autowired
    BookService bookService;
    @GetMapping("/findAll")
    public void findAll(){
        PageRequest pageable = PageRequest.of(2,3);
        Page<Book> page = bookService.getBookByPage(pageable);
        System.out.println("总页数----------:"+page.getTotalPages());
        System.out.println("总记录数----------:"+page.getTotalElements());
        System.out.println("查询结果----------:"+page.getContent());
        System.out.println("当前页数----------:"+(page.getNumber()+1));
        System.out.println("当前页记录数----------:"+page.getNumberOfElements());
        System.out.println("每页记录数----------:"+page.getSize());
    }
    @GetMapping("/search")
    public void search(){
        List<Book> ba1 = bookService.getBookIdAndAuthor(1,"鲁迅");
        List<Book> ba2 = bookService.getBooksByAuthorStartingWith("鲁");
        List<Book> ba3 = bookService.getBooksByIdAndName(2,"朝");
        List<Book> ba4 = bookService.getBooksByPriceGeneraterThan(30F);
        Book b = bookService.getMaxIdBook();
        System.out.println("ba1"+ba1);
        System.out.println("ba2"+ba2);
        //System.out.println("ba3"+ba3);
        System.out.println("ba4"+ba4);
        System.out.println("b"+b);
    }
    @GetMapping("/save")
    public void save(){
        Book book = new Book();
        book.setAuthor("鲁迅");
        book.setName("狂人日记");
        book.setPrice(23F);
        bookService.addBook(book);
    }

到这里就结束啦,整个项目结构就搭建完毕,大家可以结合自己的业务需求进行代码的继续进展和开发啦,搭建成功后的项目结构如图所示:

2020061712291878.jpg

后面我会附上我的项目源码链接地址

SpringBoot整合持久层技术之搭建并整合Spring Data JPA项目,方便大家进行下载,如果喜欢就点个赞吧,不胜感激哟!!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
Java API 开发工具
Spring Boot与Spring Cloud Config的集成
Spring Boot与Spring Cloud Config的集成
|
11天前
|
机器学习/深度学习 人工智能 文字识别
文本,文字扫描01,OCR文本识别技术展示,一个安卓App,一个简单的设计,文字识别可以应用于人工智能,机器学习,车牌识别,身份证识别,银行卡识别,PaddleOCR+SpringBoot+Andr
文本,文字扫描01,OCR文本识别技术展示,一个安卓App,一个简单的设计,文字识别可以应用于人工智能,机器学习,车牌识别,身份证识别,银行卡识别,PaddleOCR+SpringBoot+Andr
|
11天前
|
文字识别 Java Python
文本,文识10,springBoot提供RestTemplate以调用Flask OCR接口,调用flask实现ocr接口,用paddleocr进行图片识别云服务技术,单个paddleocr接口有影响
文本,文识10,springBoot提供RestTemplate以调用Flask OCR接口,调用flask实现ocr接口,用paddleocr进行图片识别云服务技术,单个paddleocr接口有影响
|
12天前
|
消息中间件 负载均衡 Java
最容易学会的springboot gralde spring cloud 多模块微服务项目
最容易学会的springboot gralde spring cloud 多模块微服务项目
|
12天前
|
JavaScript Java 数据安全/隐私保护
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(2)
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码
20 0
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(2)
|
17天前
|
NoSQL 前端开发 Java
技术笔记:springboot分布式锁组件spring
技术笔记:springboot分布式锁组件spring
17 1
|
6天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的技术人人享美食平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的技术人人享美食平台附带文章源码部署视频讲解等
9 0
|
7天前
|
XML 前端开发 Java
Spring Boot与Spring MVC的区别和联系
Spring Boot与Spring MVC的区别和联系
|
11天前
|
SpringCloudAlibaba Java 微服务
微服务02,微服务技术对比,SpringBoot和SpringClound版本兼容
微服务02,微服务技术对比,SpringBoot和SpringClound版本兼容
|
12天前
|
JavaScript Java 关系型数据库
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码(1)
基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】_基于spring vue的校园招聘系统源码
15 0