Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring Boot的数据访问之Spring Data JPA以及Hibernate的实战(超详细 附源码)

需要源码或觉得有帮助请点赞关注收藏后评论区留言

Spring Data JPA是Spring Data的子项目,在使用Spring Data JPA之前,先了解一下Hibernate,因为Spring Data JPA是由Hibernate默认实现的

Hibernate是一个开源的对象关系映射框架,它对JDBC及进行了非常轻量级的对象封装,它将POJO简单的java对象与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句自动执行。

JPA是官方提出的Java持久化规范,JPA通过注解或XML描述对象一关系表的映射关系,并将内存中的实体对象持久化到数据库

Spring Data JPA通过提供基于JPA的Repository极大的简化了JPA的写法,在几乎不写实现的情况下,实现数据库的访问和操作,使用Spring Data JPA建立数据访问层十分方便,只需要定义一个集成JapRepository的接口即可

Hibernate的详细解析

一、Spring Boot的支持

可以在STS创建Spring Boot应用时就选择Spring Data JPA模块依赖

如果在Maven项目中需要使用它,则可以在pom.xml文件中通过如下配置添加Spring Data JPA模块依赖

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

下面通过一个简单的条件查询实例来实战

1:创建数据库 此处不再赘述  有问题可以私信

2:修改pom.xml文件 添加mysql依赖

<?xml version="1.0" encoding="UTF-8"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
-<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<groupId>com.ch</groupId>
<artifactId>ch6_1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ch6_1</name>
<description>Demo project for Spring Boot</description>
-<properties>
<java.version>11</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>
<!-- 添加MySQL依赖 -->
-<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
<!-- MySQL8.x时,请使用8.x的连接器 -->
</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>
</project>

4:在application.properties文件中配置如下内容

server.servlet.context-path=/ch6_1
###
##数据源信息配置
###
#数据库地址
spring.datasource.url=jdbc:mysql://localhost:3306/springbootjpa?characterEncoding=utf8
#数据库MySQL为8.x时,url为jdbc:mysql://localhost:3306/springbootjpa?useSSL=false&serverTimezone=Asia/Beijing&characterEncoding=utf-8
#数据库用户名
spring.datasource.username=root
#数据库密码
spring.datasource.password=root
#数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#数据库MySQL为8.x时,驱动类为com.mysql.cj.jdbc.Driver
####
#JPA持久化配置
####
#指定数据库类型
spring.jpa.database=MYSQL
#指定是否在日志中显示SQL语句
spring.jpa.show-sql=true
#指定自动创建、更新数据库表等配置,update表示如果数据库中存在持久化类对应的表就不创建,不存在就创建对应的表
spring.jpa.hibernate.ddl-auto=update
#让控制器输出的JSON字符串格式更美观
spring.jackson.serialization.indent-output=true

5:创建持久化实体类MyUser

创建名为com.ch.ch6_1entity的包 并在该包中创建名为MyUser的持久化实体类 部分代码如下

package com.ch.ch6_1.entity;
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
@Table(name = "user_table")
/**
 * 如果没写表名,默认为类名的词组
 * (如MyUser类对应的表名为my_user)
 */
public class MyUser implements Serializable{
  private static final long serialVersionUID = 1L;
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;//主键
  /**使用@Column注解,可以配置列相关属性(列名,长度等),
   * 可以省略,默认为属性名小写
   */
  private String uname;
  private String usex;
  private int age;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getUname() {
    return uname;
  }
  public void setUname(String uname) {
    this.uname = uname;
  }
  public String getUsex() {
    return usex;
  }
  public void setUsex(String usex) {
    this.usex = usex;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
}

@Entity注解表明该实体类时一个与数据库表映射的实体类

@Table表示实体类与哪个数据库表映射

6:创建数据访问层

创建名为com.ch.ch6_1.repository并在该包中创建名为UserRepository的接口 代码如下

 

package com.ch.ch6_1.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.ch.ch6_1.entity.MyUser;
/**
 * 这里不需要使用@Repository注解数据访问层,
 * 因为Spring Boot自动配置了JpaRepository
 */
public interface UserRepository extends JpaRepository<MyUser, Integer>{
  public MyUser findByUname(String uname);
  public List<MyUser> findByUnameLike(String uname);
}

7:创建业务层

创建名为com.ch.ch6_1.service的包 并在该包中创建UserService接口和接口的实现类UserServiceImpl

接口代码如下

package com.ch.ch6_1.service;
import java.util.List;
import com.ch.ch6_1.entity.MyUser;
public interface UserService {
  public void saveAll();
  public List<MyUser> findAll();
  public MyUser findByUname(String uname);
  public List<MyUser> findByUnameLike(String uname);
  public MyUser getOne(int id);
}

实现类部分代码如下

package com.ch.ch6_1.service;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.ch.ch6_1.entity.MyUser;
import com.ch.ch6_1.repository.UserRepository;
@Service
@Transactional
public class UserServiceImpl implements UserService{
  @Autowired
  private UserRepository userRepository;//依赖注入数据访问层
  @Override
  public void saveAll() {
    MyUser mu1 = new MyUser();
    mu1.setUname("陈恒1");
    mu1.setUsex("男");
    mu1.setAge(88);
    MyUser mu2 = new MyUser();
    mu2.setUname("陈恒2");
    mu2.setUsex("女");
    eLike(String uname) {
    return userRepository.findByUnameLike("%" + uname + "%");
  }
  @Override
  public MyUser getOne(int id) {
    //调用父接口中的方法getOne
    return userRepository.getOne(id);
  }
}

8:创建控制器类UserTestController

创建名为com.ch.ch6_1.controller的包 并在该包中创建名为UserTestController的类 部分代码如下

package com.ch.ch6_1.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ch.ch6_1.service.UserService;
@Controller
public class UserTestController {
  @Autowired
  private UserService userService;
  @RequestMapping("/save")
  @ResponseBody
  public String save() {
    userService.saveAll();
    return "保存用户成功!";
  }
  }
  @RequestMapping("/findAll")
  public String findAll(Model model){
    model.addAttribute("title", "查询所有用户");
    model.addAttribute("allUsers",userService.findAll());
    return "showAll";
  }
  @RequestMapping("/findByUnameLike")
  public String findByUnameLike(String uname, Model model){
    model.addAttribute("title", "根据用户名模糊查询所有用户");
    model.addAttribute("allUsers",userService.findByUnameLike(uname));
    return "showAll";
  }
}

9:整理脚本样式静态文件

JS脚本 CSS样式 图片等静态文件默认放在src/main/resourcex/static目录下 有需求可以评论区留言找我要

10:创建View视图页面

创建视图页面showAll.html和showAuser.html 部分代码如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>显示查询结果</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" />
</head>
<body>
  <div class="panel panel-primary">
    <div class="panel-heading">
      <h3 class="panel-title">Spring Data JPA简单查询</h3>
    </div>
  </div>
  <div class="container">
    <div class="panel panel-primary">
      <div class="panel-heading">
        <h3 class="panel-title"><span th:text="${title}"></span></h3>
      </div>
      <div class="panel-body">
        <div class="table table-responsive">
          <tab
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</body>
</html>

 

相关文章
|
8天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
20 3
|
1月前
|
SQL Java 关系型数据库
Springboot引入jpa来管理数据库
Springboot引入jpa来管理数据库
33 0
Springboot引入jpa来管理数据库
|
1月前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
39 0
|
2月前
|
Java 数据库连接 API
【Java笔记+踩坑】Spring Data JPA
从常用注解、实体类和各层编写方法入手,详细介绍JPA框架在增删改查等方面的基本用法,以及填充用户名日期、分页查询等高级用法。
【Java笔记+踩坑】Spring Data JPA
|
3月前
|
Java Spring 数据库
怎样动动手指就能实现数据操作?Spring Data JPA背后的魔法揭秘
【8月更文挑战第31天】在Java开发中,数据库交互至关重要。传统的JDBC操作繁琐且难维护,而Spring Data JPA作为集成JPA的数据访问层解决方案,提供了CRUD等通用操作接口,显著减少代码量。通过继承`JpaRepository`,开发者能轻松实现数据的增删改查,甚至复杂查询和分页也不再困难。本文将通过示例详细介绍如何利用Spring Data JPA简化数据访问层的开发,提升代码质量和可维护性。
41 0
|
Java API Maven
Springboot 系列(四)Spring Boot 日志框架
Springboot 系列(四)Spring Boot 日志框架
765 0
Springboot 系列(四)Spring Boot 日志框架
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
143 1
|
17天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
15天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
18天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。