diff --git a/content/zh/post/angryart/images/20220929-0ee816b0-e5a9-4525-9aff-3b8369c3737a.png b/content/zh/post/angryart/images/20220929-0ee816b0-e5a9-4525-9aff-3b8369c3737a.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d16b147a68f59e042fe611e579cd1970f29562 Binary files /dev/null and b/content/zh/post/angryart/images/20220929-0ee816b0-e5a9-4525-9aff-3b8369c3737a.png differ diff --git a/content/zh/post/angryart/images/20220929-2384156a-cbba-41a8-8dcf-ae104b11b024.png b/content/zh/post/angryart/images/20220929-2384156a-cbba-41a8-8dcf-ae104b11b024.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b16cbc562b216c941ec9d8d849152b7c82adfd Binary files /dev/null and b/content/zh/post/angryart/images/20220929-2384156a-cbba-41a8-8dcf-ae104b11b024.png differ diff --git a/content/zh/post/angryart/images/20220929-4025d92e-d454-444d-81fa-9930f2caa446.png b/content/zh/post/angryart/images/20220929-4025d92e-d454-444d-81fa-9930f2caa446.png new file mode 100644 index 0000000000000000000000000000000000000000..035ee0aa734e834fc80286b7a3c6496b86750a2d Binary files /dev/null and b/content/zh/post/angryart/images/20220929-4025d92e-d454-444d-81fa-9930f2caa446.png differ diff --git a/content/zh/post/angryart/images/20220929-6055a33c-36bd-4f5a-a6b6-4b580be3cde6.png b/content/zh/post/angryart/images/20220929-6055a33c-36bd-4f5a-a6b6-4b580be3cde6.png new file mode 100644 index 0000000000000000000000000000000000000000..9aa22f4f0562f5f72303384d1041e41fa21be304 Binary files /dev/null and b/content/zh/post/angryart/images/20220929-6055a33c-36bd-4f5a-a6b6-4b580be3cde6.png differ diff --git a/content/zh/post/angryart/images/20220929-6e2d52d3-297c-4669-b22f-3fb17be4fa3a.png b/content/zh/post/angryart/images/20220929-6e2d52d3-297c-4669-b22f-3fb17be4fa3a.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea525965726115551e84b81c03690318bd99423 Binary files /dev/null and b/content/zh/post/angryart/images/20220929-6e2d52d3-297c-4669-b22f-3fb17be4fa3a.png differ diff --git a/content/zh/post/angryart/images/20220929-6fba2d08-a10b-401f-b34d-8d548ca53fca.png b/content/zh/post/angryart/images/20220929-6fba2d08-a10b-401f-b34d-8d548ca53fca.png new file mode 100644 index 0000000000000000000000000000000000000000..45fad57c9e632540d17722807b0388e27d073baf Binary files /dev/null and b/content/zh/post/angryart/images/20220929-6fba2d08-a10b-401f-b34d-8d548ca53fca.png differ diff --git a/content/zh/post/angryart/images/20220929-ee2bedb5-bd57-4892-8a7e-90aa80754fc4.png b/content/zh/post/angryart/images/20220929-ee2bedb5-bd57-4892-8a7e-90aa80754fc4.png new file mode 100644 index 0000000000000000000000000000000000000000..078602ad6b127acbeb9f6537d49f7ad023b2f9ab Binary files /dev/null and b/content/zh/post/angryart/images/20220929-ee2bedb5-bd57-4892-8a7e-90aa80754fc4.png differ diff --git a/content/zh/post/angryart/images/20220930-7b410e59-bc08-4396-a799-9b3b06defc4b.png b/content/zh/post/angryart/images/20220930-7b410e59-bc08-4396-a799-9b3b06defc4b.png new file mode 100644 index 0000000000000000000000000000000000000000..1a7d76101e5b5b3d8b7af8e2d18d25624ea082c1 Binary files /dev/null and b/content/zh/post/angryart/images/20220930-7b410e59-bc08-4396-a799-9b3b06defc4b.png differ diff --git a/content/zh/post/angryart/images/20220930-8253a3d9-0fb9-4b92-a568-a958855d0dc9.png b/content/zh/post/angryart/images/20220930-8253a3d9-0fb9-4b92-a568-a958855d0dc9.png new file mode 100644 index 0000000000000000000000000000000000000000..636847abbee51caf1206c41d0cf607ddb10b601a Binary files /dev/null and b/content/zh/post/angryart/images/20220930-8253a3d9-0fb9-4b92-a568-a958855d0dc9.png differ diff --git a/content/zh/post/angryart/images/20220930-84c4baf5-d181-426e-a889-57b889a2ece8.png b/content/zh/post/angryart/images/20220930-84c4baf5-d181-426e-a889-57b889a2ece8.png new file mode 100644 index 0000000000000000000000000000000000000000..b967f44898a7fff33df89c02819bd84451da36a0 Binary files /dev/null and b/content/zh/post/angryart/images/20220930-84c4baf5-d181-426e-a889-57b889a2ece8.png differ diff --git a/content/zh/post/angryart/images/20221007-1f70a47b-29bd-4279-93ab-387ea039879f.png b/content/zh/post/angryart/images/20221007-1f70a47b-29bd-4279-93ab-387ea039879f.png new file mode 100644 index 0000000000000000000000000000000000000000..69cea2c90178a5918c911b999c3f01a985ecd02e Binary files /dev/null and b/content/zh/post/angryart/images/20221007-1f70a47b-29bd-4279-93ab-387ea039879f.png differ diff --git a/content/zh/post/angryart/images/20221007-30859585-d134-436e-bf5f-efeafc633dd5.png b/content/zh/post/angryart/images/20221007-30859585-d134-436e-bf5f-efeafc633dd5.png new file mode 100644 index 0000000000000000000000000000000000000000..b8fa9b2de150a486c99bdffd6ca3d98c809875d3 Binary files /dev/null and b/content/zh/post/angryart/images/20221007-30859585-d134-436e-bf5f-efeafc633dd5.png differ diff --git a/content/zh/post/angryart/images/20221007-5d761920-b560-4115-8dcd-dd3afe7cb111.png b/content/zh/post/angryart/images/20221007-5d761920-b560-4115-8dcd-dd3afe7cb111.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f303bf66309abb733a0a333d43b04fb615d943 Binary files /dev/null and b/content/zh/post/angryart/images/20221007-5d761920-b560-4115-8dcd-dd3afe7cb111.png differ diff --git a/content/zh/post/angryart/images/20221007-861fad61-a4bb-4954-9f23-a4818a7e77a9.png b/content/zh/post/angryart/images/20221007-861fad61-a4bb-4954-9f23-a4818a7e77a9.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e2498441ed373ca5d29381bba30b7ac771df77 Binary files /dev/null and b/content/zh/post/angryart/images/20221007-861fad61-a4bb-4954-9f23-a4818a7e77a9.png differ diff --git a/content/zh/post/angryart/images/20221007-bd56dcf6-ef5b-4ac3-b8b2-a55be2e45d4e.png b/content/zh/post/angryart/images/20221007-bd56dcf6-ef5b-4ac3-b8b2-a55be2e45d4e.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e113e5ab6a073317818dbf540d11069284bd0c Binary files /dev/null and b/content/zh/post/angryart/images/20221007-bd56dcf6-ef5b-4ac3-b8b2-a55be2e45d4e.png differ diff --git a/content/zh/post/angryart/images/20221007-eede3ceb-9322-4bfb-b5a3-82761e7d825f.png b/content/zh/post/angryart/images/20221007-eede3ceb-9322-4bfb-b5a3-82761e7d825f.png new file mode 100644 index 0000000000000000000000000000000000000000..7807cab4a1e506067180991c5ba622e62d996d41 Binary files /dev/null and b/content/zh/post/angryart/images/20221007-eede3ceb-9322-4bfb-b5a3-82761e7d825f.png differ diff --git a/content/zh/post/angryart/images/20221007-fb7a321b-c2cc-45f2-9069-abda3d701c6b.png b/content/zh/post/angryart/images/20221007-fb7a321b-c2cc-45f2-9069-abda3d701c6b.png new file mode 100644 index 0000000000000000000000000000000000000000..6617d82e9552f0215f4e35b5f0f9e6a895410615 Binary files /dev/null and b/content/zh/post/angryart/images/20221007-fb7a321b-c2cc-45f2-9069-abda3d701c6b.png differ diff --git a/content/zh/post/angryart/images/px8qmwwai4pa.png b/content/zh/post/angryart/images/px8qmwwai4pa.png new file mode 100644 index 0000000000000000000000000000000000000000..4800917df7f3056851e0d9f29b695b9300ed9f15 Binary files /dev/null and b/content/zh/post/angryart/images/px8qmwwai4pa.png differ diff --git "a/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221SSM+MySQL\346\233\277\346\215\242\346\216\242\347\264\242 opengauss3\345\257\271\346\257\224postgresql12.md" "b/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221SSM+MySQL\346\233\277\346\215\242\346\216\242\347\264\242 opengauss3\345\257\271\346\257\224postgresql12.md" new file mode 100644 index 0000000000000000000000000000000000000000..7c4d8162456416bf819195a73b18ae2f11666846 --- /dev/null +++ "b/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221SSM+MySQL\346\233\277\346\215\242\346\216\242\347\264\242 opengauss3\345\257\271\346\257\224postgresql12.md" @@ -0,0 +1,167 @@ ++++ + +title = "【我与openGauss的故事】SSM+MySQL替换探索 opengauss3对比postgresql12" + +date = "2022-10-8" tags = ["openGauss技术文章征集"] + +archives = "2022-10" + +author = "大数据模型" + +summary = "开发人员 习惯用SSM+mysql,现在有一个选择,可以使用SSM+openGauss" + ++++ + + +## 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连接串不同,如下。 +![image.png](images/20220930-7b410e59-bc08-4396-a799-9b3b06defc4b.png) + +另外最大的不同就是数据库的ID自增机制不同,ID自增机制是数据库的一项基本功能,我们非常重视这一点,这个不同会不会导致DEMO代码要做相关的适配,好听叫做适配,不好听叫做业务侵入。 + +我们现在开发的 SSM DEMO代码是在MySQL的基础上开发,优先满足了MySQL。 + + +### Postgresql + +如果把MySQL改换成Postgresql ,运行程序的会报错,如下 + +```bash +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 keys + is only supported for 8.2 and later servers. + +``` + + +笔者用的是postgresql12,经过网上查阅 ,mybatis的定义配置必须要更改。 + +```properties + + +``` + +==useGeneratedKeys="true" keyProperty="id"摘掉==改换成 + +```properties + + +``` + + + +**重新在idea运行tomcat9** + + +![输入图片说明](images/20220930-8253a3d9-0fb9-4b92-a568-a958855d0dc9.png) + + +如下,发现数据能够写入了,但是写入的数据没有id列为空值。 + +```bash +mytest=# select * from user1; + id | username | password | age +----+-----------+-----------+----- + 1 | user1 | password1 | 18 + | hexin.xue | cxc | 25 + +``` + + + +**这是由于postgresql没有自动增加id机制的功能,所以数值一直为空**。 如果要实现自增ID,它是通过sequence去实现增加ID的。 + +两个方法是给相关表增加sequence,一种是已建表的基础上增加sequence实现增加ID + +```sql +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); + +``` + + +另外一种重建表,建表就实现 + +```sql +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); +``` + + + +建表后如果还有问题 ,下面再补刀 + +```sql +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,加载服务,我们惊喜的发现没有报错。 +![image.png](images/20220930-84c4baf5-d181-426e-a889-57b889a2ece8.png) + +```properties + +``` + +此处在postgresql12需要更改,在opengauss3不需要任何更改,spring指向的应用层没有报错。 + + +但是数据库底层ID列的数据仍然空值,OpenGauss也和Postgresql一样,都是用sequence 去实现ID的自增长。 + +```sql +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'); + +``` + + + +**体验源代码: ** + +链接:https://pan.baidu.com/s/1AwWzu7vXdhEIyr1LZrMePw +提取码:0kwg + +## 最后总结 + +这是SSM开发中比较低端的DEMO代码,但是从中可见openGauss用心的包容,在接口层适配了mybatis,遇到自增ID提高了容错性,相对于postgresql多了一道方便。 \ No newline at end of file diff --git "a/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221\345\271\262\350\264\247\350\276\223\345\207\272\343\200\220SpringBoot + OpenGauss3\345\274\200\345\217\221\345\205\245\351\227\250\343\200\221.md" "b/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221\345\271\262\350\264\247\350\276\223\345\207\272\343\200\220SpringBoot + OpenGauss3\345\274\200\345\217\221\345\205\245\351\227\250\343\200\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..f57eaa1d8b085bcfd26db7964a88eba21f9812ea --- /dev/null +++ "b/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221\345\271\262\350\264\247\350\276\223\345\207\272\343\200\220SpringBoot + OpenGauss3\345\274\200\345\217\221\345\205\245\351\227\250\343\200\221.md" @@ -0,0 +1,518 @@ ++++ + +title = "【我与openGauss的故事】干货输出【SpringBoot + OpenGauss3开发入门】" + +date = "2022-10-8" tags = ["openGauss技术文章征集"] + +archives = "2022-10" + +author = "大数据模型" + +summary = "SpringBoot+openGauss开发入门" + ++++ + + +本文介绍如何快速安装OpenGauss3,OpenGauss3的安装这是笔者浓缩提炼的,并且在SpringBoot中集成使用OpenGauss3数据库。 + + + + + +## 单机版openGauss3快速环境安装 + +```shell +groupadd dbgroup +useradd -g dbgroup omm # 可后面安装时创建 +passwd omm #设置密码为Gauss_1234 + +``` + + +创建安装程序目标目录 + +```shell +mkdir /home/omm/opengauss3 +chown -R omm:dbgroup /home/omm/opengauss3 + +``` + + +下载opengauss3.00 + +```shell +mkdir /opengauss3 +cd /opengauss3 +wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.0.0/x86/openGauss-3.0.0-CentOS-64bit-all.tar.gz +``` + + + +解压文件 + +``` bash +tar -zvxf openGauss-3.0.0-CentOS-64bit-all.tar.gz +tar zxvf openGauss-3.0.0-CentOS-64bit-cm.tar.gz +tar zxvf openGauss-3.0.0-CentOS-64bit-om.tar.gz +``` + +设置opengauss集群配置文件,这里设单点安装 + +```xml +[root@enmoedu1 opengauss3]# cat cluster_config.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"/> + + + + + + + + + + + + + + + + + + + + + +``` + +前置系统软件包 + +```bash +yum install -y epel-release +yum install -y bzip2 # 安装bzip2用于后面的解压openGauss安装包 +sed -i 's/源IP/目标IP/g' cluster_config.xml +sed -i 's/hdp1/你的主机名/g' cluster_config.xml + +``` + +初始化系统安装配置参数,以必须管理员root的权限运行,进入opengauss3运行初始化程序 + +```bash +[root@hdp1 ~]# cd /opengauss3/ +[root@hdp1 opengauss3]# ./script/gs_preinstall -U omm -G dbgroup -X ./cluster_config.xml +Parsing the configuration file. +Successfully parsed the configuration file. +Installing the tools on the local node. +Successfully installed the tools on the local node. +Setting host ip env +Successfully set host ip env. +Are you sure you want to create the user[omm] (yes/no)? no +Preparing SSH service. +Successfully prepared SSH service. +Checking OS software. +Successfully check os software. +Checking OS version. +Successfully checked OS version. +Creating cluster's path. +Successfully created cluster's path. +Set and check OS parameter. +Setting OS parameters. +Successfully set OS parameters. +Warning: Installation environment contains some warning messages. +Please get more details by "/opengauss3/script/gs_checkos -i A -h hdp1 --detail". +Set and check OS parameter completed. +Preparing CRON service. +Successfully prepared CRON service. +Setting user environmental variables. +Successfully set user environmental variables. +Setting the dynamic link library. +Successfully set the dynamic link library. +Setting Core file +Successfully set core path. +Setting pssh path +Successfully set pssh path. +Setting Cgroup. +Successfully set Cgroup. +Set ARM Optimization. +No need to set ARM Optimization. +Fixing server package owner. +Setting finish flag. +Successfully set finish flag. +Preinstallation succeeded. +``` + + +下面要以omm的用户正式运行安装程序,首先必须把权限赋给omm + +```shell +chown -R omm:dbgroup /opengauss3 + +切换到 omm,在/opengauss3目录下运行安装目录 +[root@hdp1 opengauss3]# su omm +[omm@hdp1 opengauss3]$ ./script/gs_install -X ./cluster_config.xml +Parsing the configuration file. +Check preinstall on every node. +Successfully checked preinstall on every node. +Creating the backup directory. +Successfully created the backup directory. +begin deploy.. +Installing the cluster. +begin prepare Install Cluster.. +Checking the installation environment on all nodes. +begin install Cluster.. +Installing applications on all nodes. +Successfully installed APP. +begin init Instance.. +encrypt cipher and rand files for database. +Please enter password for database: +Please repeat for database: +begin to create CA cert files +The sslcert will be generated in /home/omm/opengauss3/install/app/share/sslcert/om +NO cm_server instance, no need to create CA for CM. +Cluster installation is completed. +Configuring. +Deleting instances from all nodes. +Successfully deleted instances from all nodes. +Checking node configuration on all nodes. +Initializing instances on all nodes. +Updating instance configuration on all nodes. +Check consistence of memCheck and coresCheck on database nodes. +Configuring pg_hba on all nodes. +Configuration is completed. +Successfully started cluster. +Successfully installed application. +end deploy.. +``` + +验证服务进程是否激 活 + +```bash +[root@hdp1 ~]# ps -eaf | grep omm +root 14898 32160 0 15:55 pts/1 00:00:00 su omm +omm 14899 14898 0 15:55 pts/1 00:00:00 bash +omm 19411 1 9 16:08 ? 00:00:02 /home/omm/opengauss3/install/app/bin/gaussdb -D +/home/omm/opengauss3/install/data/dn +root 19784 360 0 16:09 pts/2 00:00:00 grep --color=auto omm + +``` + +命令行登录 + +```bash +gsql -d postgres -p 15400 + +``` + +## 安装opengauss3注意事项 + +之前安装mogdb,影响了opengauss3的环境,/home/omm/.bashrc 里面记录了安装后的变量,如果要卸载opengauss,必须要把.bashrc 下面所有的东西都去掉。 + +```bash +# User specific aliases and functions +export GPHOME=/home/omm/opengauss3/install/om +export PATH=$GPHOME/script/gspylib/pssh/bin:$GPHOME/script:$PATH +export LD_LIBRARY_PATH=$GPHOME/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$GPHOME/lib +export GAUSSHOME=/home/omm/opengauss3/install/app +export PATH=$GAUSSHOME/bin:$PATH +export LD_LIBRARY_PATH=$GAUSSHOME/lib:$LD_LIBRARY_PATH +export S3_CLIENT_CRT_FILE=$GAUSSHOME/lib/client.crt +export GAUSS_VERSION=3.0.0 +export PGHOST=/home/omm/opengauss3/tmp +export GAUSSLOG=/var/log/omm/omm +umask 077 +export GAUSS_ENV=2 +export GS_CLUSTER_NAME=dbCluster +``` + +## springBoot应用集成OpenGauss + +**SOA是一种粗粒度、松耦合服务架构**,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML(标准通用标记语言的子集)/Web Service技术之后的自然延伸,面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。 + +简而言之**SOA可以消除信息孤岛并实现共享业务重用**,我们通过SOA可以打造下图的复杂系统,其中**蓝色用户服务** ,我们可以通过**springboot + OpenGauss** 技术实现。 + +我们使用OpenGauss作为具体数据存储,使用开发工具创建一个数据库mysqltest,并在mysqltest数据库中创建一张表userennity和user1,创建语句如下: + + +```sql +create table userentity( + id int , + username varchar(50), + password varchar(50), + user_sex varchar(10), + nick_name varchar(50) +); + +create table user1( + id int , + name varchar(50), + password varchar(50)); + + +``` + + + +DEMO代码 ++---src +| +---main +| | +---java +| | | \---com +| | | \---main +| | | +---controler 具体业务逻辑 +| | | +---mapper 定义实现DAO的CRUD实体操作 +| | | +---model 实体类 +| | | \---service 实现服务类 + +注意UserControler是首先调用的service,继而去调用实体操作。 +![image.png](images/20220929-6e2d52d3-297c-4669-b22f-3fb17be4fa3a.png) + +而UserEntityControler是通过mapper的封装去调用 DAO的CRUD的操作,如下 +![image.png](images/20220929-6fba2d08-a10b-401f-b34d-8d548ca53fca.png) + +无论是UserControler还是 UserEntityControler 都需要底层数据库对应用支持友好。 +确定opengauss的用户、密码、端口及相关IP + +![输入图片说明](images/20220929-ee2bedb5-bd57-4892-8a7e-90aa80754fc4.png) + +启动服务 + + +![输入图片说明](images/20220929-6055a33c-36bd-4f5a-a6b6-4b580be3cde6.png) + + + +服务正在运行中 +![输入图片说明](images/20220929-2384156a-cbba-41a8-8dcf-ae104b11b024.png) + + + +查看用户实体1 + +![输入图片说明](images/20220929-0ee816b0-e5a9-4525-9aff-3b8369c3737a.png) + + +查看用户实体2 +![输入图片说明](images/20220929-4025d92e-d454-444d-81fa-9930f2caa446.png) + +源代码下载: + +链接:https://pan.baidu.com/s/1XnDM5Y5006njtJpwqUBR3w +提取码:5wjd + +## springboot集成opengauss的FAQ + + +### 用户名/密码不对 + +**spring报错** + +```java +### The error may involve com.main.mapper.UserMapper.getAll +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: +Failed to obtain JDBC Connection; nested exception is org.postgresql.util.PSQLException: +不明的原因导致驱动程序造成失败,请回报这个例外。] with root cause +java.lang.NullPointerException: null + +``` + + +而opengauss内部执行报错 + +```bash +[omm@enmoedu1 ~]$ gsql -U henley -h 192.168.30.65 -p 15400 +Password for user henley: +gsql: FATAL: Invalid username/password,login denied. + +``` + + +**根本原因分析** +openGauss默认是sha256,而登录则设成只允许md5登录,所以一直识用户名和密码错误 + + +**解决方法及步骤** +vi /home/omm/opengauss3/install/data/dn/postgresql.conf +修改设置 +encryption_type = 1 + +vi /home/omm/opengauss3/install/data/dn/pg_hba.conf + +增加设置 +host all henley 0.0.0.0/0 md5 + + + + + +### 用户没有对表的操作权限 + +**spring报错** + +```xml +org.postgresql.util.PSQLException: ERROR: permission denied for relation userentity + 详细:N/A + +``` + + +**opengauss报错** + +```sql +mytest=> SELECT id, userName, passWord, user_sex, nick_name FROM userentity; +ERROR: permission denied for relation userentity +DETAIL: N/A + +``` + + +**解决方法及步骤** + + +以postgres的身份登录root + +```sql +[omm@enmoedu1 ~]$ gsql -d postgres -p 15400 +gsql ((openGauss 3.0.0 build 02c14696) compiled at 2022-04-01 18:12:34 commit 0 last mr ) +Non-SSL connection (SSL connection is recommended when requiring high-security) +Type "help" for help. + +``` + + + + +**切换到指定的数据库** + +```sql +openGauss=# \c mytest; +Non-SSL connection (SSL connection is recommended when requiring high-security) +You are now connected to database "mytest" as user "omm". + +``` + + +**执行授权** + +```language +mytest=# GRANT ALL PRIVILEGES ON userentity TO henley; +GRANT + +``` + +授权后能够正常,但是发现一个问题,现在我们是通过Postgresql的jdbc驱动去访问OpenGauss的,OpenGauss没有自己的原生jdbc驱动吗?答案是有的,而且还支持maven方式,见下。 + +```properties + + + + + + + + + + +``` + +但是笔者的运气很差,通过maven一直无法下载openGauss的core包,只能通过手动的方式下载。 + +```shell +wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/ +3.0.0/x86/openGauss-3.0.0-JDBC.tar.gz + +``` + +再在idea把jar包引入进来,引入步骤 Project Structure --> Project Settings --> Libraries --> Add(alt +insert) --> apply + +application.properties稍微修改一下 +==spring.datasource.url=jdbc:opengauss://192.168.30.65:15400/mytest== +==spring.datasource.driver-class-name=org.opengauss.Driver== + + +```properties +#spring.datasource.url=jdbc:postgresql://XXXX:5432/mytest +#spring.datasource.url=jdbc:postgresql://XXXX:15400/mytest +spring.datasource.url=jdbc:opengauss://XXXX:15400/mytest +spring.datasource.username=henley +spring.datasource.password=XXXX +spring.datasource.driver-class-name=org.opengauss.Driver +#spring.datasource.driver-class-name=org.postgresql.Driver +### mybatis config ### +mybatis.config-locations=classpath:mybatis/mybatis-config.xml +mybatis.mapper-locations=classpath:mybatis/mapper/*.xml +mybatis.type-aliases-package=com.main.model + +``` + + + + + + + + +## 最后总结 + +openGauss对业界知名的spring支持还算友好,直接用传统的postgresql驱动就可以接入使用,也有自己的opengauss驱动。如果使用顺利,还可以支持分布式配置、服务路由、负载均衡、熔断限流、链路监控这些功能,事实上在微服务的技术框架上也是支持的。 + diff --git "a/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221\345\271\262\350\264\247\350\276\223\345\207\272\343\200\220\345\274\200\346\272\220Mall4j\345\225\206\345\237\216\347\263\273\347\273\237-MySQL5.7\346\225\260\346\215\256\345\272\223\345\272\225\345\272\247\346\233\277\346\215\242\346\216\242\347\264\242\345\256\236\350\267\265\343\200\221.md" "b/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221\345\271\262\350\264\247\350\276\223\345\207\272\343\200\220\345\274\200\346\272\220Mall4j\345\225\206\345\237\216\347\263\273\347\273\237-MySQL5.7\346\225\260\346\215\256\345\272\223\345\272\225\345\272\247\346\233\277\346\215\242\346\216\242\347\264\242\345\256\236\350\267\265\343\200\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..05a17d99a55986e03359d46ef960244218d1bd5d --- /dev/null +++ "b/content/zh/post/angryart/\343\200\220\346\210\221\344\270\216openGauss\347\232\204\346\225\205\344\272\213\343\200\221\345\271\262\350\264\247\350\276\223\345\207\272\343\200\220\345\274\200\346\272\220Mall4j\345\225\206\345\237\216\347\263\273\347\273\237-MySQL5.7\346\225\260\346\215\256\345\272\223\345\272\225\345\272\247\346\233\277\346\215\242\346\216\242\347\264\242\345\256\236\350\267\265\343\200\221.md" @@ -0,0 +1,581 @@ +title = "【我与openGauss的故事】干货输出【开源Mall4j商城系统-MySQL5.7数据库底座替换探索实践】" + +date = "2022-10-8" tags = ["openGauss技术文章征集"] + +archives = "2022-10" + +author = "大数据模型" + +summary = "开源Mall4j商城系统底层用的是MySQL5.7,现在我们要用openGauss3.0把它替换下来" + ++++ + +## 系统介绍 + +Mall4j是国内领先的电商商城系统源码提供商,是众多知名企业搭建商城的不二选择。Mall4j商城系统支持企业自营模式,招商模式,O2O门店模式,满足企业各个发展阶段的商业模式,全面覆盖微信商城、小程序商城、手机触屏版商城、苹果APP商城、安卓APP商城及PC端,统一的数据,能很大程度提高销售利润和提升服务质量,让您一次开店,全通路覆盖。 + +Mall4j商城系统可以将企业的资源进行有效的整合,让商家的布局更加广泛、配套更加完善、管理更加成熟。另外,mall4j商城系统可以帮助企业集合各个渠道的资源,充分利用资源和渠道来提升商城的销量。还有多种营销功能:团购、秒杀、会员积分、优惠券、满减满折等营销玩法,把消费变成了一种“游戏”,有趣,有效果。 + + +## 系统亮点 + +Mall4j商城系统功能亮点: +1、系统具备高效的管理功能:商品管理、会员管理、订单管理、统计管理、支付管理、门店管理、库存管理等管理功能; +2、灵活多样的营销赋能模式:满减、团购、秒杀、分销、积分、O2O、优惠券、套餐、赠品等营销方式; +3、多终端适配:支持PC、H5、小程序、APP(android、IOS)。 + +Mall4j商城系统技术亮点: + +1. 技术主流,使用最流行框架技术,没有过多的技术债务。 +2. 提供全部源码,无封装无加密,没有license。 +3. 更新升级方便,通过git私服进行代码合并更新。 +4. 代码前后端分离,代码质量高注释清晰,方便二次开发。 + + + +## mall4j商城版本 + + + +| ![img](images/px8qmwwai4pa.png) | **开源版** | **银河版** | **宇宙版** | **白洞版** | | +| ------------------------------- | ----------------- | -------------------- | --------------------- | -------------------- | -------- | +| **业务模式** | B2C | B2C | B2B2C | S2B2C | | +| **适用群体** | 个人、初学者 | 自营店、小规模企业 | 自营+入驻、中小型企业 | 自营+供应商/商家入驻 | | +| **加密程度** | 全开源,无加密 | 提供全部源码,无加密 | 提供全部源码,无加密 | 提供全部源码,无加密 | | +| **服务内容** | 商业授权 | AGPL3.0协议 | 永久授权 | 永久授权 | 永久授权 | +| 代码更新 | Gitee、Github更新 | Git私服更新 | Git私服更新 | Git私服更新 | | +| 企业售后群 | × | √ | √ | √ | | +| 功能列表 | √ | √ | √ | √ | | +| 技术文档 | √ | √ | √ | √ | | +| 操作手册 | × | √ | √ | √ | | +| 合同签约 | × | √ | √ | √ | | +| **基础功能** | 前后端分离 | √ | √ | √ | √ | +| Spring Cloud脚手架 | √ | × | × | √ | | +| Spring Boot脚手架 | √ | √ | √ | √ | | +| 权限管理 | √ | √ | √ | √ | | +| 完整下单流程 | √ | √ | √ | √ | | +| 小程序端 | √ | √ | √ | √ | | +| H5端 | √ | √ | √ | √ | | +| PC端 | × | √ | √ | √ | | +| App端(iOS、Android) | × | √ | √ | √ | | +| 后台管理移动端 | × | × | √ | × | | +| 后台管理PC端 | √ | √ | √ | √ | | +| 国际化 | × | √ | √ | × | | +| **高级功能** | 多商家入驻 | √ | × | √ | √ | +| 供应商端 | × | × | × | √ | | +| 平台抽佣 | × | × | √ | √ | | +| PC端装修 | × | × | √ | √ | | +| 移动端装修 | × | × | √ | √ | | +| 优惠券 | × | √ | √ | √ | | +| 满减满折 | × | √ | √ | √ | | +| 拼团活动 | × | √ | √ | √ | | +| 秒杀活动 | × | √ | √ | √ | | +| 商品预售 | × | √ | √ | √ | | +| 优惠套餐 | × | × | √ | √ | | +| 赠品 | × | × | √ | √ | | +| 分销模块 | × | √ | √ | √ | | +| 会员管理 | × | √ | √ | √ | | +| 积分商城 | × | √ | √ | √ | | +| 虚拟商品 | × | × | √ | √ | | +| 用户自提 | × | √ | √ | × | | +| 同城配送 | × | √ | √ | × | | +| 小程序直播 | × | √ | √ | √ | | +| 客服系统(IM) | × | √ | √ | √ | | +| 进销存管理 | × | × | √ | √ | | +| 客户标签与营销 | × | √ | √ | √ | | +| 数据分析 | × | √ | √ | √ | | +| 数据报表 | × | √ | √ | √ | | +| 消息推送 | × | √ | √ | √ | | + + +## 技术组件 + + + + + + +| 技术 | 版本 | 说明 | +| ---------------------- | ------------- | -------------------------------------- | +| Spring Boot | 2.1.6.RELEASE | MVC核心框架 | +| Spring Security oauth2 | 2.1.5.RELEASE | 认证和授权框架 | +| MyBatis | 3.5.0 | ORM框架 | +| MyBatisPlus | 3.1.0 | 基于mybatis,使用lambda表达式的 | +| Swagger-UI | 2.9.2 | 文档生产工具 | +| Hibernator-Validator | 6.0.17.Final | 验证框架 | +| redisson | 3.10.6 | 对redis进行封装、集成分布式锁等 | +| hikari | 3.2.0 | 数据库连接池 | +| log4j2 | 2.11.2 | 更快的log日志工具 | +| fst | 2.57 | 更快的序列化和反序列化工具 | +| orika | 1.5.4 | 更快的bean复制工具 | +| lombok | 1.18.8 | 简化对象封装工具 | +| hutool | 4.5.0 | 更适合国人的java工具集 | +| swagger-bootstrap | 1.9.3 | 基于swagger,更便于国人使用的swagger u | + + + +| 工具 | 版本 | +| ----- | ---- | +| jdk | 1.8+ | +| mysql | 5.7+ | +| redis | 3.2+ | + + +## 技术架构 + +SOA会通过ESB来作为系统和服务之间的通信桥梁,ESB本身还提供服务地址的管理、不同系统之间的 协议转化和数据格式转化等等。消费者不需要关心目标的服务位置,实现了服务消费者和服务生产者的高度解耦,**SOA可以消除信息孤岛并实现共享业务重用。** + +Mall4j商城系统则是使用了比起SOA还要灵活好用的微服务架构,微服务关注的是解耦,努力降低业务之间的耦合度,实现更多服务的复用,在DevOps有更大自由程度的持续交付。Mall4j商城系统的微服务技术包括Spring Cloud API网关、服务注册与发现、配置中心、负载均衡、分布式事务,其它相关技术包括有容器化技术、轻量级虚拟化、容器快速启停、易管理扩展、版本控制、应用安全隔离 + +## Mall4j商城系统应用使用范围 + +### 电商系统 + +B2C商城系统 【品牌电商】 +单用户商城系统,统一后台管理、多终端覆盖 + +B2B2C商城系统【平台电商】 +多用户商城系统,自营+多商家入驻电商平台 + +S2B2C商城系统【供应链】 +融合供应链、为供应商、经销商、零售商赋能 + +O2O商城系统【新零售】 +线上线下融合,助力传统零食企业转型与发展 + +### 应用终端 + +电商平台【PC端、可视化】 +可视化编辑,完善购物体验及商品数据分析 + +商城小程序【小程序】 +轻应用,体验优质,快速抢占移动电商市场 + +商城APP【UNIAPP】 +IOS、Android双APP,聚拢用户购物更便捷 + +H5商城【HTML5】 +手机浏览器,微信商城、随时随地五单支付。 + +### 业务场景 + +社交电商【移动电商】 +融合拼团、会员分销等多种前沿社交营销模式 + +积分商城【留存复购】 +结合会员体系 、打造积分运营体系,引老留新 + +跨境电商【海外】 +海外支付,多语言切换,为企业提供跨境方案 + +直播电商【引流获客】 +微信小程序直播+电商模式,低成本变现流量 + +## Mall4j商城系统替换因素考虑 + +Mall4j商城系统复杂,涉及的技术组件多,我们准备用OpenGauss替换MySQL5.7,改动的的东西涉及项目依赖文件、配置文件、解析文件,尤其数据库的内核能力以及对 应用框架的兼容 程度非常重要,假设开发者要大费周章大面积的改动,或者要动jar包的配置,估计OpenGauss替换MySQL5.7的计划就要搁浅或者放弃了。 + +代码结构 + +```bash +[root@enmoedu1 yami-b2b2c]# tree -L 1 +. +├── CHANGELOG.md +├── compile.sh +├── db +├── doc +├── docker-compose.yml +├── LICENSE +├── log +├── mall4m +├── mall4uni +├── mall4v +├── pom.xml +├── README.md +├── screenshot +├── yami-shop-admin 商城后端接口服务管理系统,数据库操作有关 +├── yami-shop-api 商城前端接口调用系统,数据库操作有关 +├── yami-shop-bean +├── yami-shop-common pom.xml含有mysql的调用 +├── yami-shop-quartz +├── yami-shop-security +├── yami-shop-service +└── yami-shop-sys src/main/resources/mapper/SysMenuMapper.xml 数据库操作有关 +15 directories, 6 files + + + +``` + + +### pom.xml + +/opt/projects/yami-b2b2c/yami-shop-common目录, pom.xml内容如下,关于mysql的jdbc需要注释 + +```properties + + + + + +``` + + + +改成 + +```properties + + org.postgresql + postgresql + 42.2.2 + + +``` + +### logback-prod.xml + + +/opt/projects/yami-b2b2c/yami-shop-admin/src/main/resources/logback/logback-prod.xml + +/opt/projects/yami-b2b2c/yami-shop-api/src/main/resources/logback/logback-prod.xml + +里面确定唯一的PROJECT_PATH + +```properties + + +``` + + + +### application-dev.yml与 application-prod.yml + +dev是开发环境的配置参数 +prod是生产环境的配置参数 + + +/opt/projects/yami-b2b2c/yami-shop-admin/src/main/resources/里面有两个文件application-dev.yml 和 application-prod.yml + + +/opt/projects/yami-b2b2c/yami-shop-api/src/main/resources里面有两个文件application-dev.yml 和application-prod.yml + + +把原来的注释,新的JDBC连接串如下 + +```properties + url: jdbc:postgresql://XXXXXX:15400/mytest + username: henley + password: XXXX + driver-class-name: org.postgresql.Driver + +``` + + +### 编译打包 + +准备对代码进行编译打包,只需要在主代码下运行以下命令,这边主代码路径是/opt/projects/yami-b2b2c,当前目录下执行 + +```java +mvn clean package -DskipTests + +``` + + +成功执行后如下所示 + +![image.png](images/20221007-bd56dcf6-ef5b-4ac3-b8b2-a55be2e45d4e.png) + +自动在下面两处地方生成jar包,一个是商城后台接口,一个是商城前端接口 + +/opt/projects/yami-b2b2c/yami-shop-admin/target/yami-shop-admin-0.0.1-SNAPSHOT +.jar + +/opt/projects/yami-b2b2c/yami-shop-api/target/yami-shop-api-0.0.1-SNAPS +HOT.jar + +开发调试 +以开发的模式运行以下两个后端服务,可以获取DEBUG日志 + + -Dspring.profiles.active=dev 意味着用开发模式运行 + -Dspring.profiles.active=prod 意味着用生产模式运行 + + + +以下命令启动后台服务,运行成功会发现8085端口打开 + +nohup java -jar -Dspring.profiles.active=dev "/opt/projects/yami-b2b2c/yami-shop-admin/target/yami-shop-admin-0.0.1-SNAPSHOT.jar" > "/opt/projects/yami-b2b2c/yami-shop-admin/target/log/yami-shop-admin-console.log" & + + + +以下命令启动前端服务,运行成功会发现8086端口打开 + + + + +nohup java -jar -Dspring.profiles.active=dev "/opt/projects/yami-b2b2c/yami-shop-api/target/yami-shop-api-0.0.1-SNAPSHOT.jar" > "/opt/projects/yami-b2b2c/yami-shop-api/target/log/yami-shop-api-console.log" & + + + + +查看控制台日志输出 + +### 后台服务日志 + +tail -f ${PROJECT_PATH}/log/admin.log + +### 前端服务日志 + +tail -f ${PROJECT_PATH}/log/api.log + + + + +启动后端服务管理平台 + +进入 mall4v-master管理目录 +[root@enmoedu1 mall4v-master]# npm run dev + +![image.png](images/20221007-30859585-d134-436e-bf5f-efeafc633dd5.png) + + + +直接访问http://192.168.30.65:9528,它会直接与后台服务8085以及前端服务8086连线。 + + + +### 数据库梳理 + + + +#### ER图 + +Mall4j一共有56个表 + +![yami_shops.png](images/20221007-1f70a47b-29bd-4279-93ab-387ea039879f.png) + +#### 示例MySQL表 + +相关56个表都要做不同程度的修改,要修改替换的地方,举例MySQL表。 + +```sql +CREATE TABLE `qrtz_job_details` ( + `SCHED_NAME` varchar(120) unsigned NOT NULL AUTO_INCREMENT , + `JOB_NAME` varchar(200) NOT NULL, + `JOB_GROUP` varchar(200) NOT NULL, + `DESCRIPTION` varchar(250) DEFAULT NULL, + `JOB_CLASS_NAME` varchar(250) NOT NULL, + `IS_DURABLE` varchar(1) NOT NULL, + `IS_NONCONCURRENT` varchar(1) NOT NULL, + `IS_UPDATE_DATA` varchar(1) NOT NULL, + `REQUESTS_RECOVERY` varchar(1) NOT NULL, + `JOB_DATA` blob, + `JOB_tinyint` tinyint(2), + `JOB_smallint` smallint(10), + `JOB_int` int(10), + `JOB_bigint` bigint(10), + file_path varchar(255) DEFAULT NULL COMMENT '文件路径', + file_type varchar(20) DEFAULT NULL COMMENT '文件类型', + upload_time datetime DEFAULT NULL COMMENT '上传时间', + `JOB_DATA_double` double(12,2), + PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), + KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`), + KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +``` + + +#### 数据类型 + +数据类型的改造是一段工作量 + +blob 改成 bytea +tinyint(2) 改成 smallint +smallint(10) 改成 smallint +int(10) 改成 int +bigint(10) 改成 bigint +double(12,2) 改成 double precision +datetime 改成 date + +#### 数据索引 + +openGauss的数据索引与MySQL的不一样 + +```sql + create index IDX_QRTZ_J_REQ_RECOVERY on qrtz_job_details (SCHED_NAME,REQUESTS_RECOVERY); + create index IDX_QRTZ_J_GRP on qrtz_job_details(SCHED_NAME,JOB_GROUP); + +``` + + + + +#### 数据注释 + +openGauss的数据注释与MySQL的不一样 + +```sql +comment on column qrtz_job_details.file_path is '文件路径'; +comment on column qrtz_job_details.file_type is '文件类型'; + +``` + + + + +#### 自增ID表 + +openGauss的自增ID与MySQL不一样 ,与主流的Postgresql的一模一样,它用自己的序列函数。 + +```sql +GRANT ALL PRIVILEGES ON TABLE tz_sys_log TO henley; +create sequence public.tz_sys_log_id start with 846 increment by 1 no minvalue no maxvalue cache 1; +alter sequence public.tz_sys_log_id owner to henley; +alter table tz_sys_log alter column id set default nextval('public.tz_sys_log_id'); + +``` + + +#### UUID表 + +tz_user表有user_id使用的是uuid + +![image.png](images/20221007-5d761920-b560-4115-8dcd-dd3afe7cb111.png) + +openGauss要支持uuid,可以通过FUNCTION,下面定义sys_guid的FUNCTION + +```sql +mytest=# \sf sys_guid +CREATE OR REPLACE FUNCTION pg_catalog.sys_guid() + RETURNS character varying + LANGUAGE sql + NOT FENCED NOT SHIPPABLE +AS $function$ select upper(md5(random()::text || clock_timestamp()::text)) $function$; + + mytest=# select sys_guid() ; + sys_guid +---------------------------------- + 72F965C6E7FC0F5D547787E969D5596F +(1 row) + +mytest=# select sys_guid() ; + sys_guid +---------------------------------- + 3FBC1EC7357AC11BA0B06F4D116E051A +(1 row) + + + + +``` + +#### mybatis的SQL表达XML + +由于openGauss语法对符号 `` 不识别,要把 `` 的特殊符号都去掉 +/opt/projects/yami-b2b2c/yami-shop-sys/src/main/resources/mapper/SysMenuMapper.xml + +SysMenuMapper.xml 把 `` 的特殊符号都去掉。 + +## 举例一个增加会员的涉及的数据库相关的修改操作 + +![image.png](images/20221007-fb7a321b-c2cc-45f2-9069-abda3d701c6b.png) + +**现在在后台管理页面,点击管理员列表,再单击新增**, 直接转发请求到后端服务yami-shop-admin,会触发数据库新增数据 + +查看后端服务日志 +tailf /opt/projects/yami-b2b2c/yami-shop-admin/target/log/yami-shop-admin-console.log + +```txt +### Error updating database. Cause: org.postgresql.util.PSQLException: ERROR: permission +denied for relation tz_sys_user + Detail: N/A +### The error may exist in com/yami/shop/sys/dao/SysUserMapper.java (best guess) +### The error may involve com.yami.shop.sys.dao.SysUserMapper.insert-Inline +### The error occurred while setting parameters +### SQL: INSERT INTO tz_sys_user +( username, password, email, mobile, status, shop_id, create_time ) +VALUES ( ?, ?, ?, ?, ?, ?, ? ) +### Cause: org.postgresql.util.PSQLException: ERROR: permission denied for relation tz_sys_user + Detail: N/A +; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: ERROR: +permission denied for relation tz_sys_user + Detail: N/A + +``` + + +**以上错误主要是由于没有授权,通过超管进入 mytest数据库** + +```bash +openGauss=# \c mytest; +Non-SSL connection (SSL connection is recommended when requiring high-security) +You are now connected to database "mytest" as user "omm". +mytest=# GRANT ALL PRIVILEGES ON TABLE tz_sys_user TO henley; + +``` + +继续查看yami-shop-admin-console.log,报错变成 + +```txt +ERROR: null value Caused by: org.postgresql.util.PSQLException: ERROR: null value in + column "id" violates not-null constraint + Detail: Failing row contains (null, 3, 1). + at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553) + at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285) + at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323) + at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481) + at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401) + at + + +``` + +**以上报错ERROR: null value 原因是自增ID的问题,通过以下方法实现自增ID。** + +```sql +create sequence public.tz_sys_user_id start with 2 increment by 1 no minvalue no maxvalue cache 1; +alter sequence public.tz_sys_user_id owner to henley; +alter table tz_sys_user alter column user_id set default nextval('public.tz_sys_user_id'); + + +``` + + +**tz_sys_user 表与 tz_sys_user_role表、tz_sys_log表有关联,同样需要以下授权 ** + +```sql +GRANT ALL PRIVILEGES ON TABLE tz_sys_user_role TO henley; +create sequence public.tz_sys_user_role_id start with 1 increment by 1 no minvalue no maxvalue cache 1; +alter sequence public.tz_sys_user_role_id owner to henley; +alter table tz_sys_user_role alter column id set default nextval('public.tz_sys_user_role_id'); + +``` + + + +注意tz_sys_log表已经有845条数据,所以新增的数据从846开始算。 + + +```sql +GRANT ALL PRIVILEGES ON TABLE tz_sys_log TO henley; +create sequence public.tz_sys_log_id start with 846 increment by 1 no minvalue no maxvalue cache 1; +alter sequence public.tz_sys_log_id owner to henley; +alter table tz_sys_log alter column id set default nextval('public.tz_sys_log_id'); + +``` + + + +**创建用户成功后** +mytest=# select * from tz_sys_log where id = 846; + +![image.png](images/20221007-861fad61-a4bb-4954-9f23-a4818a7e77a9.png) + +![image.png](images/20221007-eede3ceb-9322-4bfb-b5a3-82761e7d825f.png) + + + +## 最后总结 + +开源Mall4j商城系统的数据库底座替换,把MySQL改成OpenGauss,对业务逻辑相关的代码侵入不大,主要工作量是数据库表结构方面重构,OpenGauss对微服务的功能是支持的。 \ No newline at end of file