精通 Spring Boot 系列 07

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 精通 Spring Boot 系列 07

阅读全文,约 23 分钟

这是江帅帅的第009篇原创

Spring Boot 整合持久层开发

1、ORM

ORM(Object/Relation Mapping,对象/关系型数据库映射)是一种规范,用于描述面向对象语言到关系型数据库的映射。

我们主要实现持久化类和数据表之间的映射,达到通过持久化类实现对数据表的操作。

ORM 有如下几个基本的映射关系

  • 数据表映射类
  • 数据表的行映射对象(实例)
  • 数据表的列(字段)映射对象的属性

常见的 ORM 框架

  • Hibernate 是一个开源的框架
  • JPA(Java Persistence API,Java 持久化规范)

2、Spring Data JPA

亮点:极大地简化了 JPA 的使用,在几乎不用写接口实现的情况下,就能完成对数据的访问和操作。

Spring Data JPA 是 Spring Data 下的一个小模块,Spring Data 提供了访问操作数据的统一规范。

Spring Data 通过提供 Respository 接口来约定数据访问的统一标准。

Respository 接口中常用的几个子接口:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

我们只需要定义数据访问接口,然后实现 Spring Data 提供的这些接口,然后就能实现对数据的操作了。

2.1 CrudRepository

使用 CrudRepository 接口访问数据。

1)编辑 pom.xml 文件

添加 mysql-connector-java 和 spring-boot-starter-data-jpa 依赖模块,具体如下:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.nx</groupId>
    <artifactId>springbootdata</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
 
    <dependencies>
        <!-- 添加spring-boot-starter-web模块依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <!-- 添加MySQL依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
 
        <!-- 添加spring-boot-starter-thymeleaf模块依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
 
        <!-- 添加Spring Data JPA依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
 
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
</project>
2)编辑 application.properties 文件

添加数据源与 JPA 等基本配置信息。

####################
### 数据源信息配置 ###
####################
# 数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
# 用户名
spring.datasource.username=root
# 密码
spring.datasource.password=1234
# 数据库驱动
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# 指定连接池中最大的活跃连接数.
spring.datasource.max-active=20
# 指定连接池最大的空闲连接数量.
spring.datasource.max-idle=8
# 指定必须保持连接的最小值
spring.datasource.min-idle=8
# 指定启动连接池时,初始建立的连接数量
spring.datasource.initial-size=10
 
####################
### JPA持久化配置 ###
####################
# 指定数据库的类型
spring.jpa.database=MySQL
# 指定是否需要在日志中显示sql语句
spring.jpa.show-sql=true
# 指定自动创建|更新|验证数据库表结构等配置,配置成update
# 表示如果数据库中存在持久化类对应的表就不创建,不存在就创建对应的表
spring.jpa.hibernate.ddl-auto=update
# Naming strategy
# 指定命名策略
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
# 指定数据库方言
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
3)创建 User 持久化类
package nx.bean;
 
import java.io.Serializable;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
// 此注解,会在 Spring Boot 项目加载后会自动根据持久化类创建数据表
@Table(name="tb_user") 
public class User implements Serializable{
 
    private static final long serialVersionUID = 1L;
 
    /**
     * 使用@Id指定主键。使用代码@GeneratedValue(strategy=GenerationType.AUTO)
     * 指定主键的生成策略,mysql默认的是自增长。
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String loginName;
    private char sex;
    private int age;
 
    // getXxx & setXxx 方法
}
4)创建 UserRepository 数据访问接口

在这里,我们不需要提供实现,只要直接继承数据访问接口就好。

package nx.repository;
 
import nx.bean.User;
import org.springframework.data.repository.CrudRepository;
 
public interface UserRepository extends CrudRepository<User, Integer>{
}
5)创建 UserService 业务层类
package nx.service;
 
import java.util.Optional;
 
import javax.annotation.Resource;
import javax.transaction.Transactional;
 
import nx.bean.User;
import nx.repository.UserRepository;
import org.springframework.stereotype.Service;
 
@Service
public class UserService {
 
    // 注入UserRepository
    @Resource
    private UserRepository userRepository;
 
    /**
     * save\update\delete 
     * 方法需要绑定事务,使用@Transactional进行事务的绑定
     * 
     * 保存对象
     * @param User
     * @return 包含自动生成的 id 的 User        
     */
    @Transactional
    public User save(User User) {
        return userRepository.save(User);
    }
 
    /**
     * 根据id删除对象
     */
    @Transactional
    public void delete(int id) {
        userRepository.deleteById(id);
 
    }
 
    /**
     * 查询所有数据
     */
    public Iterable<User> getAll() {
        return userRepository.findAll();
    }
 
    /**
     * 根据id查询数据
     */
    public User getById(Integer id) {
        // 根据id查询出对应的持久化对象
        Optional<User> op = userRepository.findById(id);
        return op.get();
    }
 
    /**
     * 修改用户对象数据,持久化对象修改会自动更新到数据库
     */
    @Transactional
    public void update(User user) {
        // 直接调用持久化对象的set方法修改对象的数据
        user.setUsername("帅帅");
        user.setLoginName("shuaishuai");
    }
}
6)创建控制器类
package nx.controller;
 
import javax.annotation.Resource;
 
import nx.bean.User;
import nx.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/user")
public class UserController {
 
    // 注入UserService
    @Resource
    private UserService userService;
 
    @RequestMapping("/save")
    public String save() {
        User user = new User();
        user.setLoginName("mason");
        user.setUsername("帅帅");
        user.setSex('男');
        user.setAge(18);
        user = userService.save(user);
        return "保存数据成功!";
    }
 
    @RequestMapping("/update")
    public String update() {
        // 修改的对象必须是持久化对象,所以先从数据库查询出id为1的对象进行修改
        User user = userService.getById(1);
        userService.update(user);
        return "修改数据成功!";
    }
 
    @RequestMapping("/delete")
    public String delete() {
        userService.delete(1);
        return "删除数据成功!";
    }
 
    @RequestMapping("/getAll")
    public Iterable<User> getAll() {
        return userService.getAll();
    }
}
7)创建数据库
CREATE DATABASE springbootdata;
8)访问测试

浏览器,输入 http://localhost:8080/user/getAll

2.2 PagingAndSortingRepository

PagingAndSortingRepository 继承了 CrudRepository 接口,它还能实现分页和排序的功能。

1)编辑 pom.xml 文件
与 CrudRepository 接口案例一样
2)编辑 application.properties 文件
与 CrudRepository 接口案例一样
3)创建 Article 持久化类
package nx.bean;
 
import java.io.Serializable;
import java.util.Date;
 
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
 
/**
 *  商品对象
 */
@Entity
@Table(name="tb_article")
public class Article implements Serializable{
 
    private static final long serialVersionUID = 1L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String title;
    private String supplier;
    private Double price;
    private String locality;
    private Date putawayDate;
    private int storage;
    private String image;
    private String description;
    private Date createDate;
 
    // getXxx & setXxx 方法
}
4)定义 ArticleRepository 数据访问接口
package nx.repository;
 
import nx.bean.Article;
import org.springframework.data.repository.PagingAndSortingRepository;
 
public interface ArticleRepository extends PagingAndSortingRepository<Article, Integer> {
}
5)定义 ArticleService 业务层类
package nx.service;
 
import javax.annotation.Resource;
 
import nx.bean.Article;
import nx.repository.ArticleRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
 
@Service
public class ArticleService {
 
    // 注入数据访问层接口对象 
    @Resource
    private ArticleRepository articleRepository;
 
    public Iterable<Article> findAllSort(Sort sort) {
        return articleRepository.findAll(sort);
    }
 
    public Page<Article> findAll(Pageable page) {
        return articleRepository.findAll(page);
    }
}
6)定义 ArticleController 控制器类
package nx.controller;
 
import java.util.List;
import javax.annotation.Resource;
import nx.bean.Article;
import nx.service.ArticleService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/article")
public class ArticleController {
 
    // 注入ArticleService
    @Resource
    private ArticleService articleService;
 
    @RequestMapping("/sort")
    public Iterable<Article> sortArticle() {
        // 指定排序参数对象:根据id,进行降序查询
        Sort.Order sort = new Sort.Order(Sort.Direction.DESC, "id");
        Iterable<Article> articleDatas = articleService.findAllSort(sort.withProperties("id"));
        return articleDatas;
    }
 
    @RequestMapping("/pager")
    public List<Article> sortPagerArticle(int pageIndex) {
        // 指定排序参数对象:根据id,进行降序查询
 
        Sort.Order sort = new Sort.Order(Sort.Direction.DESC, "id");
        Pageable page = PageRequest.of(pageIndex - 1, 2, Sort.by(sort));
        Page<Article> articleDatas = articleService.findAll(page);
        System.out.println("查询总页数:" + articleDatas.getTotalPages());
        System.out.println("查询总记录数:" + articleDatas.getTotalElements());
        System.out.println("查询当前第几页:" + articleDatas.getNumber() + 1);
        System.out.println("查询当前页面的记录数:" + articleDatas.getNumberOfElements());
        // 查询出的结果数据集合
        List<Article> articles = articleDatas.getContent();
        System.out.println("查询当前页面的集合:" + articles);
        return articles;
    }
}
7)访问测试

往数据表中添加一些数据,然后就可以看到具体效果了。(此处略)

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Java Spring 容器
什么是Spring Boot插件化开发?如何进行?
什么是Spring Boot插件化开发?如何进行?
782 0
|
搜索推荐 Java 索引
Spring Boot中的ElasticsearchRepository
Spring Boot中的ElasticsearchRepository
|
8月前
|
监控 Java 应用服务中间件
什么是 Spring Boot,及为什么要用 Spring Boot
**Spring Boot**: 2013年起研,简化Spring笨重配置,集成常用库,开箱即用,少代码配置,专注业务。 **为何选Spring Boot?** 出色基因,快速搭建;单一依赖替多;Java Config简化配置;内嵌Tomcat,简化部署;监控REST化;微服务友好,趋势之选。
285 27
|
9月前
|
JavaScript 前端开发 Java
Spring Boot
【6月更文挑战第22天】
64 8
|
XML Java 数据库连接
为什么越来越多的人选择Spring Boot?
我们都知道,Spring是一个非常经典的应用框架,与其说是Java开发不如说是Spring开发,为什么现在越来越多的人会选择用Spring Boot呢?。要回答这个问题,还需要从Java Web开发的发展历史开始说起。
185 0
|
10月前
|
存储 安全 Java
精通 Spring Boot 系列 15
精通 Spring Boot 系列 15
55 0
|
10月前
|
Java 数据库连接 数据库
精通 Spring Boot 系列 13
精通 Spring Boot 系列 13
49 0
|
10月前
|
Java Spring
精通 Spring Boot 系列 10
精通 Spring Boot 系列 10
55 0
|
存储 缓存 算法
Spring Boot 中的 ConcurrentMapCacheManager
Spring Boot 中的 ConcurrentMapCacheManager
|
存储 JSON 安全
Spring Boot 安全
1.概述 在后端来说,安全主要就是控制用户访问,让对应权限的用户能访问到对应的资源,主要是两点: 认证 授权 认证,确定是谁。 授权,核实权限。 每个安全框架其实都是为了实现这两点。 目前常用的实现方式有如下几种: token JWT oauth spring security 前三种是理念,最后一种是开箱即食的框架。 2.token 2.1.理论 token ,也叫“令牌”,是验证用户身份的凭证。token的组成具有随意性,能标识用户身份即可。
156 0