5.开发DAO组件 -- Spring Data JPA

开发DAO组件

作用:用来访问数据库
持久化技术:Spring Data, JPA, Mybaits,jOOQ 等
Spring Boot为常见持久化技术提供了支持。

现在使用 Spring Data JPA

Spring Data JPA

使用Spring Data JPA来访问数据库,需要再项目添加两个依赖:

1、Spring Boot Data JPA依赖,它会自动添加数据源的实现(用 springboot 提供的能自动配置和整合的Spring Boot Data JPA)

        <!--  添加 Spring Boot Data JPAStarter 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

2、MySQL数据库驱动依赖

        <!--  mysql数据库驱动依赖  -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

只要添加Spring Boot Data JPA的starter组件依赖,Spring Boot就会为你搞定整合spring data jpa的一切基础配置

创建配置文件,指定连接数据库的信息

创建一个配置文件 application.properties,就放在resources包下

# 数据库 URL
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
spring.datasource.username=用户名
spring.datasource.password=密码
# 指定显示sql语句
spring.jpa.show-sql=true
# 指定根据实体自动建表
spring.jpa.generate-ddl=true

因为配置文件有配置这个功能:
指定根据实体自动建表 spring.jpa.generate-ddl=true

所以我们可以通过给Book类添加JPA注解,变成实体类。

问题:Java类和实体类有什么区别?

Java类: 是通用的,可以用于实现各种功能和逻辑
实体类: 是具有特定目的的类,用于表示领域模型中的具体实体,与数据持久化和数据库操作相关。

1、持久化能力: 实体类是指具有持久化能力的类,可以通过ORM(对象关系映射)技术将其映射到数据库表中,实现对象和数据库之间的数据交互。而普通类则通常不具备持久化的能力
2、注解: 实体类通常需要使用特定的注解(如JPA的@Entity注解)来进行标记,以便在持久化过程中进行映射和管理。而普通类不需要添加这些注解。
3、数据库映射: 实体类与数据库表之间存在一一对应或一对多的关系,实体类的属性通常与数据库表的字段相对应。而普通类则不需要与数据库表进行映射。
4、CRUD操作: 实体类通常可以通过ORM框架提供的API进行数据库的增删改查操作(CRUD操作)。而普通类不具备这些数据库操作的能力。
5、规范要求: 实体类在JPA等框架中有一些规范要求,如需要无参构造函数、需要主键等。而普通类没有这些规范要求。
6、实例化和使用: ava类可以被直接实例化和使用,用于封装数据和实现业务逻辑。而实体类一般需要通过ORM框架或者其他方式来创建和管理,以便与数据库进行交互。

如何把Java类变成实体类:

实体类通常需要使用特定的注解(如JPA的@Entity注解)来进行标记和配置,以便在持久化过程中进行映射和管理。而Java类没有这些特定的持久化注解

package cn.ljh.boot.domain;

import javax.persistence.*;

//通过添加JPA注解,把这个Java类变成实体类
@Entity  //表明这个类是一个实体类
@Table(name = "book_inf") //把这个实体类映射到数据库的 book_inf 表
public class Book {

    @Id //主键id
    @GeneratedValue(strategy = GenerationType.IDENTITY) //指定主键生成策略
    @Column(name = "book_id") //指定这个字段映射到数据库表的具体列名
    private Integer id;
    @Column(name = "book_name")
    private String name;
    @Column(name = "price")
    private double price;
    @Column(name = "author")
    private String author;


后面我把price价格的修饰改成 bigdecimal 修饰类型

IDEA连接mysql

把Java类改成实体类后,运行项目,发现数据库自动生成 bool_inf 这张表了,对应的列也都生成了。
在这里插入图片描述

准备工作完成后,现在开发DAO组件

是基于 Spring Data 开发DAO组件,用spring data ,既可以访问sql数据库,也可以访问nosql数据库。

 让DAO接口继承CrudRepository接口
 Spring Data会为继承了CrudRepository接口的DAO接口自动为它动态生成实现类,并将该实现类的实例部署在Spring容器中。
 此外,Spring Data还可动态为BookDao增加很多查询方法。
 Spring Data不仅可以自动生成大量的CRUD方法,也能允许用户定义自定义的查询(sql、HQL),
 甚至允许用户使用最底层API(EntityManager、DataSource、Connection……)

开发Dao组件,只需要创建一个BookDao 接口,然后去继承CrudRepository接口就可以了。
在service就可以注入这个BookDao 对象来用了,这时候的bookDao因为继承了CrudRepository接口,所以本身已经集成了很多sql操作

public interface BookDao extends CrudRepository<Book,Integer> {
}

在这里插入图片描述
通过代码可以看出,注入BookDao组件依赖后,这个bookDao就集成了很多sql操作。
比如简单的 save 保存,findAll 查询所有,deleteById根据id删除数据等。

下面的代码就是正式的业务逻辑,使用的就是基于spring boot data jpa 来实现数据库的数据持久化操作


//添加这个@Service注解,springboot就可以自动扫描这个Service组件的实现类,然后把这个类部署成容器中的bean。
@Service
@Transactional //事务控制
public class BookServiceImpl implements BookService {

    //注入DAO组件,用有参构造器来注入
    private BookDao bookDao;
    public BookServiceImpl(BookDao bookDao){
        this.bookDao = bookDao;
    }
    //这个bookDao 因为继承了CrudRepository接口,所以本身已经集成了很多sql操作。
    
    //添加书籍的方法
    @Override
    public Integer addBook(Book book) {
        Book b = bookDao.save(book);
        return b.getId();
    }

    //查看所有书籍的方法
    @Override
    public List<Book> getAllBooks() {
        //要强制转换
        List<Book> listBooks = (List<Book>) bookDao.findAll();
        return  listBooks;
    }

    //删除书籍的方法
    @Override
    public void deleteBookById(Integer id) {
        bookDao.deleteById(id);
    }
}

对应的前端页面也贴出来。有过一些功能修改,直接贴出来记录

bookForm.html添加书籍页面

<!DOCTYPE html>
<!-- HTML引入Thymeleaf ,导入命名空间 , 把thymeleaf的域名加进来就可以使用了-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>添加图书页面</title>
    <!--  导入 webjar 包中的 bootstrap 样式库  -->
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/4.6.0/css/bootstrap.css}">

</head>
<body>

<!--  class="container" :相当于类名,就是这个div模块的名字-->
<!--  class="alert alert-primary" : 警报框  -->
<div class="container">
    <div id="addBookFailTips" th:if="${tip} != null">
        <div th:text="${tip}" class="alert alert-primary" style="text-align: center">书籍添加失败显示的提示信息</div>
    </div>

    <h2>添加图书</h2>
<!--  TODO  -->
    <!--  submit提交表单的时候,就会走这个addBook方法  -->
    <form method="post" th:action="@{/addBook}">
        <div class="form-group row">
            <label for="name" class="col-sm-3 col-form-label">图书名:</label>
            <div class="col-sm-9">
                <input type="text" id="name" name="name" class="form-control" placeholder="输入图书名">
            </div>
        </div>
        <div class="form-group row">
            <label for="author" class="col-sm-3 col-form-label">作者:</label>
            <div class="col-sm-9">
                <input type="text" id="author" name="author" class="form-control" placeholder="输入作者">
            </div>
        </div>
        <div class="form-group row">
            <label for="price" class="col-sm-3 col-form-label">价格:</label>
            <div class="col-sm-9">
                <input type="text" id="price" name="price" class="form-control" placeholder="输入价格">
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-6 text-right">
                <button id="add" type="submit" class="btn btn-primary">添加</button>
            </div>
            <div class="col-sm-1 ">
                <button type="reset" class="btn btn-danger">重置</button>
            </div>
            <div class="col-sm-3 ">
                <a th:href="@{/listBooks}">
                    <button type="button" class="btn btn-secondary" style="background-color: yellowgreen">查看书籍列表
                    </button>
                </a>
            </div>
        </div>
    </form>
</div>
<!--TODO 提示输入信息不能为空-->
<script>
    // <!-- 如果书籍添加失败,那么在提示 2 秒后设置 div 为 none 进行隐藏 -->
    // setTimeout(function() {
    //     document.getElementById("addBookFailTips").style.display = "none";
    // }, 2000); // 2秒后隐藏
</script>
</body>
</html>

书籍列表页面 listBooks.html

<!DOCTYPE html>
<!-- HTML引入Thymeleaf ,导入命名空间 , 把thymeleaf的域名加进来就可以使用了-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>书籍列表页面</title>
    <!--  导入 webjar 包中的 bootstrap 样式库  -->
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/4.6.0/css/bootstrap.css}">

</head>
<body>
<!--  class="container" :相当于类名,就是这个div模块的名字-->
<!--  class="alert alert-primary" : 警报框  -->
<div class="container">
    <table class="table table-hover">
        <tr>
            <th>书名</th>
            <th>价格</th>
            <th>作者</th>
            <th>删除</th>
        </tr>
        <!--  循环迭代  ${books}就是后端传来的集合数据, book就是循环后的变量  -->
        <tr th:each="book: ${books}">
            <td th:text="${book.name}">书名</td>
            <td th:text="${book.price}">价格</td>
            <td th:text="${book.author}">作者</td>
            <td><a th:href="@{/deleteBook/} + ${book.id}">删除</a></td>
        </tr>
    </table>
</div>
<div class="container">
        <a th:href="@{/bookForm}"><button type="button" style="background-color: beige">返回添加书籍</button></a>
</div>
</body>
</html>

实现页面:

bookForm页面
在这里插入图片描述
listBooks页面
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/52898.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python工具箱系列(三十九)

使用zlib对数据进行压缩 现实世界中&#xff0c;大量存在着对数据压缩的需求。为此&#xff0c;python内置了zlib压缩库&#xff0c;可以方便的对任意对象进行压缩。 下述代码演示了对字符串进行压缩&#xff1a; import zlib# 压缩一段中文 originstr 神龟虽寿&#xff0c…

Mysql触发器

1.触发器 触发器是与表有关的数据库对象&#xff0c;指在 insert / update / delete 之前或之后&#xff0c;触发并执行触发器中定义的SL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&#xff0c;数据校验等操作。 使用别名 OLD 和 …

python将多张图片拼成一张矩阵图,合成一张大图

用Python实现将多张图片排列成n*m的图像矩阵图 目录 引言环境准备代码实现效果演示总结 引言 在图像处理和图像展示的应用中&#xff0c;将多张图片排列成一个图像矩阵图是一个常见的需求。本博客介绍如何使用Python实现将12张图片排列成n*m的图像矩阵图。 环境准备 为了实…

【C# 6.0】云LIS平台源码

基于云计算的区域LIS平台为医疗机构改善患者服务质量提供了强有力的支持&#xff0c;“以患者为核心”这一理念得到了充分实现&#xff0c;可以解决各医院LIS建设水平参差不齐的现状&#xff0c;并完善各医院内LIS系统的功能&#xff0c;实现数据标准统一、功能完善、性能可靠&…

F5 LTM 知识点和实验 2-负载均衡基础概念

第二章&#xff1a;负载均衡基础概念 目标&#xff1a; 使用网页和TMSH配置virtual servers&#xff0c;pools&#xff0c;monitors&#xff0c;profiles和persistence等。查看统计信息 基础概念&#xff1a; Node一个IP地址。是创建pool池的基础。可以手工创建也可以自动创…

【计算机网络】应用层协议 -- 安全的HTTPS协议

文章目录 1. 认识HTTPS2. 使用HTTPS加密的必要性3. 常见的加密方式3.1 对称加密3.2 非对称加密3.3 非对称加密对称加密 4. 引入CA证书4.1 CA认证4.2 数据签名4.3 非对称机密对称加密证书认证4.4 常见问题 5. 总结 1. 认识HTTPS HTTPS全称为 Hyper Text Tranfer Protocol over …

页面访问控制远程仓库

页面访问权限控制 什么是jwt身份认证 在前后端分离模式的开发中&#xff0c;服务器如何知道来访者的身份呢&#xff1f; 在登录后&#xff0c;服务器会响应给用户一个 令牌 &#xff08;token&#xff09;令牌中会包括该用户的id等唯一标识浏览器收到令牌后&#xff0c;自己…

【极大似然性】不同函数(均方误差、交叉熵、KL 散度)不同结局(1/2)

Kowshik chilamkurthy 一、说明 很多时候&#xff0c;数据科学家和机器学习从业者并不欣赏不同损失指标之间的数学和直观关系&#xff0c;如负对数似然、交叉熵、最大似然估计、Kullback-Leibler &#xff08;KL&#xff09; 散度&#xff0c;以及最重要的均方误差。如果我说KL…

Windows11+Opencv+Clion编译源码

Windows11OpencvClion编译源码 参考&#xff1a;https://www.robotsfan.com/posts/69395e08.html 注意事项 编译过程中使用的软件&#xff0c;开源码等所有工具的安装路径一定不要有中文和空格。cmake过程会下载一些文件&#xff0c;如果是局域网的话可能下载不下来&#xf…

哈工大计算机网络课程网络安全基本原理详解之:消息完整性与数字签名

哈工大计算机网络课程网络安全基本原理详解之&#xff1a;消息完整性与数字签名 这一小节&#xff0c;我们继续介绍网络完全中的另一个重要内容&#xff0c;就是消息完整性&#xff0c;也为后面的数字签名打下基础。 报文完整性 首先来看一下什么是报文完整性。 报文完整性…

C++ ------ 模板初阶

文章目录 泛型编程模板函数模板概念原理函数模板的实例化类模板 泛型编程 我们在实现交换函数的时候&#xff0c;只能实现一个数据类型的交换函数&#xff0c;想要在C中完成对应类型数据的交换一种方法是使用函数重载&#xff0c;就像下面这样 void Swap(int& left, int&am…

开发一个RISC-V上的操作系统(五)—— 协作式多任务

目录 往期文章传送门 一、什么是多任务 二、代码实现 三、测试 往期文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&#xff09;—— 系统引导程序&a…

【C++】类和对象(下)

1、初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(month), _…

OpenLayers实战进阶专栏目录,OpenLayers实战案例,OpenLayers6实战教程

前言 本篇作为OpenLayers实战进阶教程的目录&#xff0c;用于整理汇总专栏所有文章&#xff0c;方便查找。 OpenLayers是前端最流行的JS二维地图引擎之一。 反馈建议 OpenLayers系列-交流专区&#xff0c;建议和问题反馈 Openlayers实战进阶 Openlayers实战&#xff0c;O…

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信…

Pytorch深度学习-----神经网络之池化层用法详解及其最大池化的使用

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

Python批量将Excel内指定列的数据向上移动一行

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;对其中的每一个文件加以操作——将其中指定的若干列的数据部分都向上移动一行&#xff0c;并将所有操作完毕的Excel表格文件中的数据加以合并&#xff0c;生成一个新的Excel文件的方法。 首…

虚拟机(VMware)安装Linux(Ubuntu)安装教程

清华大学开源网站镜像站网址&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 进入之后在搜索框中搜索“ubuntu” 直接点击箭头所指的蓝色字体“ubuntu-20.04.1-desktop-amd64.iso”即可下载

一起学算法(位运算篇)

1.位运算 1.二进制数值表示 在计算机中&#xff0c;我们可以用单纯的0和1来表示数字&#xff0c;一般不产生歧义&#xff0c;我们会在数字的右下角写上它的进制&#xff0c;例如&#xff1a;1010&#xff08;10&#xff09;其表示的是1010&#xff0c;1010&#xff08;2&#…

Windows下安装HBase

Windows下安装HBase 一、HBase简介二、HBase下载安装包三、环境准备3.1、 JDK的安装3.2、 Hadoop的安装 四、HBase安装4.1、压缩包解压为文件夹4.2、配置环境变量4.3、%HBASE_HOME%目录下新建临时文件夹4.4、修改配置文件 hbase-env.cmd4.4.1、配置JAVA环境4.4.2、set HBASE_MA…