当前位置: 首页 > news >正文

SSM+MySQL替换探索 openGauss对比postgresql12

SSM 介绍

SSM(Spring+SpringMVC+MyBatis)框架集由 Spring、MyBatis 两个开源框架整合而成(SpringMVC 是 Spring 中的部分内容),常作为数据源较简单的 web 项目的框架。

Spring

Spring 就像是整个项目中装配 bean 的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。
Spring 的核心思想是 IoC(控制反转),即不再需要程序员去显式地new一个对象,而是让 Spring 框架帮你来完成这一切。

SpringMVC

SpringMVC 在项目中拦截用户请求,它的核心 Servlet 即 DispatcherServlet 承担中介或是前台这样的职责,将用户请求通过 HandlerMapping 去匹配 Controller,Controller 就是具体对应请求所执行的操作。SpringMVC 相当于 SSH 框架中 struts。

mybatis

mybatis 是对 jdbc 的封装,它让数据库底层操作变的透明。mybatis 的操作都是围绕一个 sqlSessionFactory 实例展开的。mybatis 通过配置文件关联到各实体类的 Mapper 文件,Mapper 文件中配置了每个类对数据库所需进行的 sql 语句映射。在每次与数据库交互时,通过 sqlSessionFactory 拿到一个 sqlSession,再执行 sql 命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

SSM 搭配的数据库

无庸置疑,SSM 经常搭配的数据库是 MySQL 或者是 Postgresql,而国内使用 MySQL 的人比 Postgresql 的人多, 所以本文主要内容关于 SSM DEMO 已经搭配用上 MySQL,系统本身可以注册写入数据入库,可以从库中读取数据进行登录。

SSM demo 代码

经过测试对比,SSM DEMO 代码基于三个不同的数据库,除了 JDBC 连接串不同,如下。

另外最大的不同就是数据库的 ID 自增机制不同,ID 自增机制是数据库的一项基本功能,我们非常重视这一点,这个不同会不会导致 DEMO 代码要做相关的适配,好听叫做适配,不好听叫做业务侵入。

我们现在开发的 SSM DEMO 代码是在 MySQL 的基础上开发,优先满足了 MySQL。

Postgresql

如果把 MySQL 改换成 Postgresql ,运行程序的会报错,如下

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is
org.springframework.jdbc.UncategorizedSQLException:
### Error updating database.  Cause: org.postgresql.util.PSQLException: Returning autogenerated keys is
only supported for 8.2 and later servers.
### SQL: insert into user1 (username, password, age)     values (?, ?, ?)
### Cause: org.postgresql.util.PSQLException: Returning autogenerated keysis only supported for 8.2 and later servers.

笔者用的是 postgresql12,经过网上查阅 ,mybatis 的定义配置必须要更改。

  <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.cn.uuu.pojo.User1" >

==useGeneratedKeys=”true” keyProperty=”id”摘掉==改换成

  <insert id="insert"  parameterType="com.cn.uuu.pojo.User1" >

重新在 idea 运行 tomcat9

如下,发现数据能够写入了,但是写入的数据没有 id 列为空值。

mytest=# select * from user1;id | username  | password  | age
----+-----------+-----------+-----1 | user1     | password1 |  18| hexin.xue | cxc       |  25

这是由于 postgresql 没有自动增加 id 机制的功能,所以数值一直为空。 如果要实现自增 ID,它是通过 sequence 去实现增加 ID 的。

两个方法是给相关表增加 sequence,一种是已建表的基础上增加 sequence 实现增加 ID

create sequence public.userid_seq start with 1 increment by 1 no minvalue no maxvalue cache 1;
alter sequence public.userid_seq owner to henley;
alter table user1 alter column id set default nextval('public.userid_seq');
insert into user1 (username, password, age)     values ('username1', 'password1', 100);

另外一种重建表,建表就实现

CREATE SEQUENCE sq_user_id  START 1   INCREMENT 1  CACHE 20;
create table  user1(id int NOT NULL DEFAULT nextval('sq_user_id') ,
username  varchar(50),password  varchar(50),age  int);

建表后如果还有问题 ,下面再补刀

alter sequence public.sq_user_id owner to henley;
alter table user1 alter column id set default nextval('public.sq_user_id');

增加 sequence 后,写入数据后 ID 例有值了。

openGauss

依然是同样代码,把 jdbc 的连接串改成 OpenGauss, 我们启动 tomcat,加载服务,我们惊喜的发现没有报错。

  <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.cn.uuu.pojo.User1" >

此处在 postgresql12 需要更改,在 opengauss3 不需要任何更改,spring 指向的应用层没有报错。

但是数据库底层 ID 列的数据仍然空值,OpenGauss 也和 Postgresql 一样,都是用 sequence 去实现 ID 的自增长。

create sequence public.userid_seq start with 1 increment by 1no minvalue no maxvalue cache 1;
alter sequence public.userid_seq owner to henley;
alter table user1 alter column id set default nextval('public.userid_seq');

最后总结

这是 SSM 开发中比较低端的 DEMO 代码,但是从中可见 openGauss 用心的包容,在接口层适配了 mybatis,遇到自增 ID 提高了容错性,相对于 postgresql 多了一道方便。

相关文章:

SSM+MySQL替换探索 openGauss对比postgresql12

SSM 介绍 SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架集由 Spring、MyBatis 两个开源框架整合而成&#xff08;SpringMVC 是 Spring 中的部分内容&#xff09;&#xff0c;常作为数据源较简单的 web 项目的框架。 Spring Spring 就像是整个项目中装配 bean 的大…...

XGboost的整理

XGboost&#xff08;extreme gradient boosting&#xff09;:高效实现了GBDT算法并进行了算法和工程上的许多改进。 XGboost的思路&#xff1a; 目标&#xff1a;建立k个回归树&#xff0c;使得树群的预测尽量接近真实值&#xff08;准确率&#xff09;而且有尽量大的泛化能力…...

java入门基础学习导览

本篇文章会持续更新直到更新完毕&#xff0c;关注博主不迷路~&#xff08;如果没有超链接&#xff0c;表示还没有更新到&#xff09; 一 JAVA语言基础 二 流程控制 三 数组 字符串 与正则表达式 四 JAVA面向对象编程 五 JAVA 异常处理 六 JAVA输入输出 七 泛型与容器类 …...

网工内推 | 上市公司售前,大专以上即可,最高15K*13薪,补贴多

01 北京神州新桥科技有限公司 招聘岗位&#xff1a;售前工程师 职责描述&#xff1a; 1、完成项目的售前技术支持工作&#xff1b; 2、 配合销售进行新产品及解决方案的推广工作&#xff1b; 3、 配合销售完成用户的售前技术交流方案准备、现场技术交流、技术方案宣讲等工作…...

JAVA开发第一个Springboot WebApi项目

一、创建项目 1、用IDEA新建一个SpringBoot项目 注意JDK与Java版本的匹配,如果想选择jdk低版本,先要更改服务器URL:start.aliyun.com 2、添加依赖 (1)、Lombok (2)、Spring Web (3)、Mybatis Framework (4)、MySqlDriver 项目中的配置 pom.xml 如下 <?…...

基于springboot+vue的疫情管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

Qt 类的前置声明和头文件包含

1. 在头文件中引入另一个类经常有两种写法 1&#xff09;前置声明 2&#xff09;头文件包含 #ifndef FRMCOUPLE2_H #define FRMCOUPLE2_H#include <QWidget> //头文件包含namespace Ui { class frmcouple2; }//前置声明&#xff1a;QPushButton frmchkeyboard…...

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍

1.简介 学习音视频开发&#xff0c;首先从做一款播放器开始是比较合理的&#xff0c;每一章节&#xff0c;我都会将源码贴在最后&#xff0c;此专栏你将学习到以下内容&#xff1a; 1&#xff09;音视频的解封装、解码&#xff1b; 2&#xff09;Qtopengl如何渲染视频&#…...

Learn OpenGL 01

OpenGL的定义 一般它被认为是一个API(Application Programming Interface, 应用程序编程接口)&#xff0c;包含了一系列可以操作图形、图像的函数。然而&#xff0c;OpenGL本身并不是一个API&#xff0c;它仅仅是一个由Khronos组织制定并维护的规范(Specification)。 OpenGL规…...

Java开发从入门到精通(一):Java的基础语法进阶

Java大数据开发和安全开发 &#xff08;一&#xff09;Java注释符1.1 单行注释 //1.2 多行注释 /* */1.3 文档注释 /** */1.4 各种注释区别1.5 注释的特点1.5 注释的快捷键 &#xff08;二&#xff09;Java的字面量&#xff08;三&#xff09;Java的变量3.1 认识变量3.2 为什么…...

【C++从0到王者】第五十一站:B+树

文章目录 一、B树1.B树的概念2.B树的特性3.B树的插入的过程4.总结 二、B*树1. B*树的概念2.B*树的分裂 三、总结四、B树系列和哈希和平衡搜索树作对比五、B树的一些应用1.索引2.MySQL索引3.MyISAM2.InnoDB 一、B树 1.B树的概念 B树是B树的变形&#xff0c;是在B树基础上优化的…...

Spring Cloud 面试题及答案整理,最新面试题

Spring Cloud中断路器的原理及其作用是什么&#xff1f; Spring Cloud断路器的原理和作用基于以下几个关键点&#xff1a; 1、故障隔离机制&#xff1a; 在微服务架构中&#xff0c;断路器作为一种故障隔离机制&#xff0c;当某个服务实例出现问题时&#xff0c;断路器会“断…...

使用Kali搭建钓鱼网站教程

一、前言 使用kali工具一分钟制作出和目标网站一模一样的钓鱼网站。目标用户使用钓鱼网站登录自己的账号&#xff0c;账号密码将被自动劫持。 二、钓鱼网站的制作过程 1.在虚拟机VMvare中登录kali linux 2.准备一个目标网址 3.在kail中搜索使用工具 4.在弹出的选项中选择第一…...

《TCP/IP详解 卷一》第15章 TCP数据流与窗口管理

目录 15.1 引言 15.2 交互式通信 15.3 延时确认 15.4 Nagle 算法 15.4.1 延时ACK与Nagle算法结合 15.4.2 禁用Nagle算法 15.5 流量控制与窗口管理 15.5.1 滑动窗口 15.5.2 零窗口与TCP持续计时器 15.5.3 糊涂窗口综合征 15.5.4 大容量缓存与自动调优 15.6 紧急机制…...

ContentType类型总结

ContentType类型总结 Content-Type是一个HTTP头部字段&#xff0c;用于指示资源的媒体类型&#xff08;MIME类型&#xff09;&#xff0c;以及可选的字符集和编码方式。它告诉浏览器或其他客户端如何解释接收到的数据。以下是一些常见的Content-Type类型及其用途&#xff1a; t…...

基于脚手架创建vue工程

环境要求: node.js:前端项目的运行环境 npm:javascript的包管理器 vue cli&#xff1a;项目脚手架 忘了自己有没有安装可以通过在黑窗口输入命令看一下 node -v npm -v 这里出现版本号就说明已经安装了 安装脚手架的命令:npm i vue/cli -g 创建vue基础工程 1.在一个没…...

【Http】OSI 和 TCP/IP,OSI,TCP/IP为什么网络要分层?

目录 OSI 和 TCP/IP OSI TCP/IP 为什么网络要分层&#xff1f; OSI 和 TCP/IP OSI ![image-20231205101106040](.assets/image-20231205101106040.pn OSI 的七层体系结构概念清楚&#xff0c;理论也很完整&#xff0c;但是它比较复杂而且不实用&#xff0c;而且有些功能在…...

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…...

shell脚本一键部署docker

Docker介绍 Docker 是一个开源的平台&#xff0c;用于开发、交付和运行应用程序。它利用容器化技术&#xff0c;可以帮助开发人员更轻松地打包应用程序及其依赖项&#xff0c;并将其部署到任何环境中&#xff0c;无论是开发工作站、数据中心还是云中。以下是 Docker 的一些关键…...

vue2实现拖拽排序效果

1、首先下载 vuedraggable 插件 npm i -S vuedraggable2、使用方法 <template><div><div style"display: flex; justify-content: center; align-items: center"><div style"width: 120px; height: 60px; line-height: 60px; text-align…...

数据结构实验:二叉排序树

题目描述 对应给定的一个序列可以唯一确定一棵二叉排序树。然而&#xff0c;一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树&#xff0c;都得到一样的结果。你的任务书对于输入的各种序列&#xff0c;判断它们是否…...

Java类加载流程?

Java类加载过程是指将.class文件中的字节码数据加载到内存中&#xff0c;并生成对应的Class对象的过程。Java类加载器&#xff08;ClassLoader&#xff09;负责执行这个任务。Java类加载过程主要包括以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;…...

Docker从0到1的开始【入门篇】

Docker是一种流行的容器化平台&#xff0c;它允许开发人员将应用程序及其所有依赖项打包到一个标准化的单元中&#xff0c;从而实现快速部署和可移植性。在本文中&#xff0c;我们将列出一些常用的Docker命令&#xff0c;以帮助您更好地了解和使用Docker。 1. 安装Docker 要安…...

@ResponseStatus

目录 概述&#xff1a; 用途&#xff1a; 参数&#xff1a; 注意事项&#xff1a; 自定义异常类&#xff1a; 底层原理&#xff1a; 概述&#xff1a; 在 Spring MVC 中&#xff0c;我们有很多方法来设置 HTTP 响应的状态码其中最直接的方法&#xff1a;使用 ResponseSt…...

高效加载大文件(pandas+dask)

一、仅用pd加载大文件(iterator、chunksize) 要使用Pandas进行高效加载超大文件&#xff0c;我们通常会利用其内置的分块&#xff08;chunk&#xff09;处理功能。不过&#xff0c;请注意&#xff0c;Pandas本身并不支持多线程读取文件&#xff1b;它更倾向于单线程中进行块处理…...

游戏引擎分层简介

游戏引擎分层架构&#xff08;自上而下&#xff09; 工具层&#xff08;Tool Layer&#xff09; 在一个现代游戏引擎中&#xff0c;我们最先看到的可能不是复杂的代码&#xff0c;而是各种各样的编辑器&#xff0c;利用这些编辑器&#xff0c;我们可以制作设计关卡、角色、动画…...

向爬虫而生---Redis 探究篇6<Redis的Bigkey问题介绍>

前言: 随着数据规模的增长,Redis的BigKey问题也开始显现。 BigKey问题主要指的是存储了大量数据的key,这可能给Redis的性能和可用性带来负面影响。当一个key的数据量过大时,会占用宝贵的内存资源,拖慢Redis的响应速度。此外,存储和恢复这些BigKey也会变得困难和耗时,增…...

【开源物联网平台】FastBee认证方式和MQTT主题设计

&#x1f308; 个人主页&#xff1a;帐篷Li &#x1f525; 系列专栏&#xff1a;FastBee物联网开源项目 &#x1f4aa;&#x1f3fb; 专注于简单&#xff0c;易用&#xff0c;可拓展&#xff0c;低成本商业化的AIOT物联网解决方案 目录 一、接入步骤 1.1 设备认证 1.2 设备交…...

Ubuntu Qt控制终端运行ros

文章目录 gnome-terminalQt 通过QProcess类Qt 通过system gnome-terminal 在Ubuntu中可以使用man gnome-terminal命令查看gnome-terminal的使用指南&#xff0c;也可在ubuntu manuals查看&#xff1a; NAMEgnome-terminal — 一个终端仿真应用.概要gnome-terminal [-e, --c…...

mysql 性能调优参数配置文件

########################################################################### ## my.cnf for MySQL 8.0.x # ## 本配置参考 https://imysql.com/my-cnf-wizard.html # ## 注意&#xff1a; …...