【H2实践】之 SpringBoot 与 H2 数据交互

news2024/11/24 9:44:48

一、目标

本文是【H2实践】之认识 H2,【H2实践】之 SpringBoot 整合的后续。前文分别介绍了 H2 及其简单使用,并完成了 H2 与 SpringBoot 的整合。本文将紧接 【H2实践】之 SpringBoot 整合 探索实用 SpringBoot 结合 JPA 通过 web 接口操作 H2 数据库的目标

主要实现目标:
1、定义数据模型 User ,拥有 id 、age 、 name 、passwd 四个属性,
2、创建 /user/add?id={id} 接口实现数据写入到 H2
3、测试 H2 数据的持久化

二、实践

1、数据模型层

创建 domain 文件夹作为数据模型的包

创建一个 User 数据模型,其包含 idnameagepasswd 四个字段。使用 @Id 指定字段 id 为主键,使用 @Table 指定表名为 tb_user

package com.xzbd.jh2.domain;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "tb_user")
public class User {
    @Id
    private Long id;
    private String name;
    private String passwd;
    private Integer age;
}

2、Rerpository 层

应用 ORM 层选用 JPA 框架,JPA 的实现需要创建 Repository 。
创建 repostory 文件夹作为 DAO 层的包
创建 UserRepository 如下:

package com.xzbd.jh2.repostory;

import com.xzbd.jh2.domain.User;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User,Long> {
    
}

3、Service 层

创建 service 文件夹作为业务层的包

创建 UserServiceUserServiceImpl 如下所示:

package com.xzbd.jh2.service;

import com.xzbd.jh2.domain.User;


public interface UserService {
    User add(User user);
}

package com.xzbd.jh2.service;

import com.xzbd.jh2.domain.User;
import com.xzbd.jh2.repostory.UserRepository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService{
    @Autowired
    private UserRepository userRepository;
    
    @Override
    public User add(User user) {
        return userRepository.save(user);
    }
    
}

4、Controller 层

创建 controller 文件夹作为控制层的报名

在控制层下创建 UserController ,代码如下:

package com.xzbd.jh2.controller;

import com.xzbd.jh2.domain.User;
import com.xzbd.jh2.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import net.bytebuddy.utility.RandomString;

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

    @Autowired
    private UserService userService;

    @RequestMapping("/add")
    public User add(Long id) {
        User user = new User();
        user.setId(id);
        user.setAge(12 + Integer.valueOf("" + id));
        user.setName("name-" + id);
        user.setPasswd(id + "" + RandomString.make(5));
        User u = userService.add(user);
        return u;
    }
}

为了测试方便,提供的一个简单的接口 /user/add?id={id} 。该接口可以在浏览器中直接访问,只需要带上简单的id参数。

三、测试

1、运行应用 jh2

启动应用程序,此处使用的是 VS Code ,按 “F5” 即可启动,效果如下。
在这里插入图片描述
从启动日志中可以看出,hibernate 检测到新的数据模型 User 类,并创建了响应的数据表。其生成的创建SQL的语句为:

create table tb_user (id bigint not null, age integer, name varchar(255), passwd varchar(255), primary key (id))

使用的方言为: org.hibernate.dialect.H2Dialect

2、访问接口

访问 http://localhost:8080/user/add?id=1 ,浏览器结果如下图所示。
在这里插入图片描述
应用日志
在这里插入图片描述
其中有两句 SQL

Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_, user0_.passwd as passwd4_0_0_ from tb_user user0_ where user0_.id=?
Hibernate: insert into tb_user (age, name, passwd, id) values (?, ?, ?, ?)

讨论问题 insert 语句可以理解,为什么会有 select 语句呢 ?是不是因为调用了 repository 的 save 方法?

再依次访问下面连接,添加 id 为 2 - 5 的 user 数据。
http://localhost:8080/user/add?id=2
http://localhost:8080/user/add?id=3
http://localhost:8080/user/add?id=4
http://localhost:8080/user/add?id=5

3、登录 H2 web 客户端查看数据

登录方式见 【H2实践】之 SpringBoot 整合,登陆后发现 TB_USER 表已经存在。再 SQL 编辑区中输入 SQL SELECT * FROM TB_USER 执行后,效果如下:
在这里插入图片描述

四、总结

文章是 SpringBoot 整合 H2 实践的关键部分。采用标准的 MVC 分层模式构建了项目,完成了目标需求设计。结合第三部分测试,验证了 SpringBoot 与 H2 数据库整合成功。

系列文章

1、【H2实践】之认识 H2
2、【H2实践】之 SpringBoot 整合

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python数据分析案例22——财经新闻可信度分析(线性回归,主成分回归,随机森林回归)

本次案例还是适合人文社科领域&#xff0c;金融或者新闻专业。本科生做线性回归和主成分回归就够了&#xff0c;研究生还可以加随机森林回归&#xff0c;其方法足够人文社科领域的硕士毕业论文了。 案例背景 有八个自变量&#xff0c;[微博平台可信度,专业性,可信赖性,转发量,…

Java对象结构与内置锁

Java对象结构与内置锁 Java内置锁的很多重要信息都存放在对象结构中 1.Java对象结构 Java对象包括三部分&#xff1a;对象头、实例数据和对齐字节 对象头&#xff1a; 第一个字段叫做Mark Word&#xff0c;用于存储自身运行时数据&#xff0c;例如GC标志位&#xff0c;哈希…

P1120 小木棍(搜索+剪枝)

题目链接&#xff1a;P1120 小木棍 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 样例输入&#xff1a; 9 5 2 1 5 2 1 5 2 1 样例输出&#xff1a; 6 分析&#xff1a;这道题一看数据范围就知道是搜索&#xff0c;但关键是需要剪枝。 首先我们求出所有木棍的长度和&am…

什么是刺猬理念

一、什么是刺猬理念刺猬理念是指把复杂的世界简化成单个有组织性的观点&#xff0c;一条基本原则或一个基本理念&#xff0c;发挥统帅和指导作用。核心是把事情简单化&#xff0c;把所有的挑战和进退维谷的局面压缩为简单的。二、刺猬理念的寓言故事狐狸是一种狡猾的动物&#…

Maix Bit(K210)保姆级入门上手教程---自训练模型之云端训练

Maix Bit&#xff08;K210&#xff09;保姆级入门上手教程系列 Maix Bit&#xff08;K210&#xff09;保姆级入门上手教程—环境搭建 Maix Bit&#xff08;K210&#xff09;保姆级入门上手教程—外设基本使用 这是K210快速上手系列文章&#xff0c;主要内容是&#xff0c;介绍…

《机器学习》基础概念之【P问题】与【NP问题】

《机器学习》基础概念之【P问题】与【NP问题】 这里写目录标题《机器学习》基础概念之【P问题】与【NP问题】一、多项式&时间复杂度1.1. 多项式1.2.时间复杂度二、P问题 & NP问题2.1. P问题2.2.NP问题2.3.举例理解NP问题-TSP旅行商推销问题三、NP-hard问题&NP-C问题…

PMP项目管理项目成本管理

目录1 项目成本管理概述2 规划成本管理3 估算成本4 制定预算5 控制成本1 项目成本管理概述 项目成本管理包括为使项目在批准的预算内完成而对成本进行规划、估算、预测、融资、筹资、管理和控制的各个过程&#xff0c;从而确保项目在批准的预算内完工。核心概念 项目成本管理旨…

vuex getters的作用和使用(求平均年龄),以及辅助函数mapGetters

getters作用&#xff1a;派生状态数据mapGetters作用&#xff1a;映射getters中的数据使用&#xff1a;方法名自定义&#xff0c;系统自动注入参数&#xff1a;state&#xff0c;每一个方法中必须有return&#xff0c;其return的结果被该方法名所接收。在state中声明数据listst…

PyTorch深度学习实战 | 计算机视觉

深度学习领域技术的飞速发展&#xff0c;给人们的生活带来了很大改变。例如&#xff0c;智能语音助手能够与人类无障碍地沟通&#xff0c;甚至在视频通话时可以提供实时翻译&#xff1b;将手机摄像头聚焦在某个物体上&#xff0c;该物体的相关信息就会被迅速地反馈给使用者&…

【教学典型案例】21.面向对象复用、面向对象实现、立体化权限落地

目录一&#xff1a;背景介绍1、针对于激励配置的功能体现出来的&#xff1a;面向对象的思想就可以实现极大程度的复用性的问题2、脱离学习通设计图&#xff0c;过程化&#xff0c;如何用面向对象的思想来去组织管理流程图3、词云位置记录定制化二&#xff1a;思路&方案1、面…

CSDN每日一练(编程题)

目录1. 2023/1/31-非降序数组(类型&#xff1a;数组&排序 难度&#xff1a;中等)2. 2023/2/1- 走楼梯(类型&#xff1a;递归&循环 难度&#xff1a;中等)3. 2023/2/1-蛇形矩阵(难度&#xff1a;困难)4. 2023/2/2-奇偶排序(类型&#xff1a;数组&奇偶排序 难度&…

环境配置之Keepass

前言很久以前&#xff0c;就有了想要一个自己密码管理器的念头。毕竟&#xff0c;即使浏览器能记住各个网站的账号密码&#xff0c;但是在登录单独客户端的时候&#xff0c;仍然要翻找密码。为了省事&#xff0c;也曾经是一个密码走天下。然后被劫持了QQ给同学发黄色小网站&…

手写Mybatis

Mybatis总体流程 (1)加载配置并初始化触发条件:加载配置文件 配置来源于两个地方&#xff0c;一个是配置文件(主配置文件conf. xml, mapper文件*.xml),一个是java代码中的注解&#xff0c;将主配置文件内容解析封装到Configuration,将sql的配置信息加载成为一个mappedstateme…

ReentrantLock源码分析(一)加锁流程分析

一、ReetrantLock的使用示例 static ReentrantLock lock new ReentrantLock(); public static void main(String[] args) throws InterruptedException { new Thread(ClassLayOutTest::reentrantLockDemo, "threadA").start(); Thread.sleep(1000);…

Netty权威指南总结(二)

三、Netty代码相关&#xff1a;(四) EventLoop与EventLoopGroup&#xff1a;Netty的Nio线程是NioEventLoop。1. Reactor线程模型&#xff1a;Reactor模型的三个角色&#xff1a;Reactor&#xff1a;把IO事件分配给对应的Handler处理&#xff0c;功能像是调度器。Acceptor【饿渴…

【C++】C++核心编程(一)---内存四区

C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区 存放函数体的二进制代码&#xff0c;由操作系统进行管理全局区 存放全局变量和静态变量以及常量(字符串常量、全局常量)栈区 由编译器自动分配释放&#xff0c;存放函数的参数值、局部变量等堆区 由程序员分配和释…

jenkins问题

目录 python 不是内部或外部命令&#xff0c;也不是可运行的程序 ‘cmd’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 git 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 pywintypes.com_error: (-2147024891, ‘拒绝访问。’, None,…

Qt实用技巧:Qt中浮点数的相等比较方式(包括单精度和双精度)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/129464152 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

Spring——AOP切入点表达式和AOP通知类型

切入点:要进行增强的方法 切入点表达式:要进行增强的方法的描述式 第一种方法的本质是基于接口实现的动态代理(jdk) 第二种是基于cglib实现的动态代理 AOP切入点表达式 而需要加载多个切入点时&#xff0c;不可能每个切入点都写一个切入点表达式 例子 下面的代理描述的是匹配…

条件语句(分支语句)——“Python”

各位CSDN的uu们你们好呀&#xff0c;最近总是感觉特别特别忙&#xff0c;但是却又不知道到底干了些什么&#xff0c;好像啥也没有做&#xff0c;还忙得莫名其妙&#xff0c;言归正传&#xff0c;今天&#xff0c;小雅兰的内容还是Python呀&#xff0c;介绍一些顺序结构的知识点…