首页 文章 精选 留言 我的

精选列表

搜索[开源游戏引擎],共10000篇文章
优秀的个人博客,低调大师

openGauss开源数据库二次开发指导手册(下)

本节内容主要介绍编译和验证二次开发结果。 编译 编译环境要求 操作系统环境要求 操作系统环境要求如下表。 CPU 操作系统要求 X86架构 CentOS 7.6,openEuler 20.3LTS ARM架构 openEuler 20.3LTS, 麒麟V10 下文章节中以使用华为云ECS服务的鲲鹏服务器(ARM架构+ openEuler操作系统)为例进行介绍。 您也可以自行选择在本地PC机安装虚拟机进行操作(X86架构),详细步骤可参考《在虚拟机+CentOS上安装部署openGauss数据库指导手册》或《在虚拟机+openEuler上安装部署openGauss数据库指导手册》。 软件依赖要求 openGauss的软件依赖要求如下表所示: 所需软件 建议版本 libaio-devel 建议版本:0.3.109-13 flex 要求版本:2.5.31 以上 bison 建议版本:2.7-4 ncurses-devel 建议版本:5.9-13.20130511 Glibc-devel 建议版本:2.17-111 patch 建议版本:2.7.1-10 readline-devel 建议版本:7.0-13 python3-devel 建议版本:3 pam-devel 建议版本:1.1.8-1.3.1 libffi-devel 建议版本:3.1 automake 建议版本:1.13.4 byacc 建议版本:1.9 cmake 建议版本:3.19.2 openssl-devel 建议版本:1.1.1 libtool-devel 建议版本:2.4.2及以上 lsb_release 建议版本:4.1 安装命令: yum install -y autoconf gcc gcc-c++ libaio-devel flex bison ncurses-devel glibc-devel patch readline readline-devel dkms python3-devel pam-devel libffi-devel automake byacc cmake openssl-devel libtool-devel 编译环境准备(使用代金券购买华为云ECS服务) 登录华为云 步骤 1进入华为云官网。 华为云官网:https://www.huaweicloud.com/,进入华为云官网,点击登录。 步骤 2输入账号名和密码,点击登录。 如果还没有注册,点击免费注册,按步骤进行注册与实名制认证后进行登录。 说明: 请进行实名制认证后再执行下述操作。 购买弹性云服务器ECS 步骤 1在华为云主页(https://www.huaweicloud.com/)点击产品,选择基础服务,再选择弹性云服务器ECS。 步骤 2进入弹性云服务器ECS购买界面。 步骤 3自定义购买进行基础配置。 配置选项 配置值 计费模式 按需计费(一定要选按需计费,注意配置费用) 区域 华北-北京四(推荐,其他区域可能会导致无法选择openEuler公共镜像) CPU架构 鲲鹏计算 规格 鲲鹏通用计算增强型 8vCPUs 镜像 公共镜像:openEuler openEuler 20.03 64bit with ARM(40GB) 其余默认即可,点击下一步网络配置。 步骤 4自定义购买进行网路配置。 配置选项 配置值 网络 Vpc-default(192.168.0.0/16)(选现有默认网络即可) 弹性公网IP 现在购买 公网带宽 按流量计费 带宽大小 5 其余默认即可,点击下一步高级配置。 步骤 5自定义购买进行高级配置。 记住用户名为root,然后输入自定义密码和确认密码,其余默认即可,点击下一步确认设置。 步骤 6确认配置购买成功。 确认设置信息,尤其是配置费用,然后勾选协议“我已经阅读并同意《华为镜像免责声明》”,点击立即购买。 查看云服务器列表。 等待几分钟后,状态为“运行中“则表示购买成功! 注意:本次购买鲲鹏服务器价格为公测价格,具体价格以华为云官网为准。 版本编译 openGauss的编译过程和生成安装包的过程已有一个一键式的脚本build.sh,可以方便地通过build.sh脚本进行编译操作; 本节介绍openGauss使用一键式脚本编译的操作步骤,编译流程如下图所示: 代码下载 步骤 1登录购买的ECS实例。 在弹性云服务列表上,单击服务器后面的“远程登录“操作,以root用户登录至服务器。 步骤 2在linux环境下安装软件依赖包。 [root@ecs-5045 ~]# yum install -y autoconf gcc gcc-c++ libaio-devel flex bison ncurses-devel glibc-devel patch readline readline-devel dkms python3-devel pam-devel libffi-devel automake byacc cmake openssl-devel libtool-devel 步骤 3在linux环境下安装Git工具并配置Git环境。 [root@ecs-5045 ~]# yum install git -y ---安装git工具 [root@ecs-5045 ~]# git config --global user.name "Your Name" --- 配置git用户名 [root@ecs-5045 ~]# git config --global user.email "email@example.com" --- 配置git全局邮件账号 Your Name为自己的git用户名,请替换为实际自己实际用户名。 email@example.com为注册Gitee的主邮箱,请替换为实际自己实际主邮箱。 生成git公钥和私钥。 [root@ecs-5045 ~]# ssh-keygen -t rsa -C "email@example.com" --- 生成git公钥和私钥 email@example.com为注册Gitee的主邮箱,请替换为实际自己实际主邮箱。 执行结果如下: /root/.ssh/id_rsa.pub 为生成的git公钥文件,读取该文件内容。 复制出上面文件内容,并在个人Gitee账户中添加此SSH公钥。 步骤 4用Git工具下载openGauss-server和openGauss-OM代码。 先创建本地代码仓库存放目录/openGauss-lab/soft。 [root@ecs-5045 ~]# mkdir -p /openGauss-lab/soft [root@ecs-5045 ~]# cd /openGauss-lab/soft [root@ecs-5045 soft]# openGauss-server是server代码仓库,openGauss-OM是工具代码仓库,两者均用于后续安装openGauss。 # git clone [git ssh address] openGauss-server ##下载个人server代码仓库 # git clone [git ssh address] openGauss-OM ##下载个人OM代码仓库 上述命令中: [git ssh address]表示实际代码下载地址,即个人库地址,可在openGauss社区获取。 个人server代码仓库地址: 个人OM代码仓库地址: 执行下载结果如下: 步骤 5获取已编译好的第三方二进制代码。 该二进制文件用于openGauss-server代码的编译。 [root@ecs-5045 soft]# wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/1.1.0/openGauss-third_party_binarylibs.tar.gz 下载项进度均显示为100%时表示下载成功,具体如下: 解压并移动该二进制文件。 [root@ecs-5045 soft]# tar -zxf openGauss-third_party_binarylibs.tar.gz ----数分钟后解压成功 [root@ecs-5045 soft]# mv openGauss-third_party_binarylibs binarylibs 软件安装编译 前提条件 已按照搭建编译环境的要求准备好相关软硬件,并且已经下载了代码; 了解 build.sh脚本的参数选项和功能; 代码环境干净,没有以前编译生成的文件。 编译openGauss-server 步骤 1执行如下命令进入到软件代码编译脚本目录。 [root@ecs-5045 soft]# cd /openGauss-lab/soft/openGauss-server 步骤 2执行如下命令,编译安装openGauss。 [root@ecs-5045 openGauss-server] # sh build.sh -m release -3rd /openGauss-lab/soft/binarylibs -pkg 该步骤执行大概需要15-30分钟,与主机规格有关,请耐心等待。 步骤 3显示如下内容,表示安装包编译成功。 ……………………………………. make server(all) package success! packaging libpq... success! packaging tools... success! Begin to install upgrade_sql files... Successfully packaged upgrade_sql files. End package opengauss. now, all packages has finished! 生成的安装包存放在“/openGauss-lab/soft/openGauss-server/output”目录下,编译结果: openGauss-1.1.0-openEuler-64bit-Libpq.tar.gz openGauss-1.1.0-openEuler-64bit.sha256 openGauss-1.1.0-openEuler-64bit-symbol.tar.gz openGauss-1.1.0-openEuler-64bit.tar.bz2 -----此包大概有89M openGauss-1.1.0-openEuler-64bit-toosl.tar.gz upgrade_sql.sha256 upgrade_sql.tar.gz [root@ecs-5045 openGauss-server]# cd /openGauss-lab/soft/openGauss-server/output [root@ecs-5045 output]# ll total 334M -rw------- 1 root root 12M Apr 20 15:28 openGauss-2.0.0-openEuler-64bit-Libpq.tar.gz -rw------- 1 root root 65 Apr 20 15:28 openGauss-2.0.0-openEuler-64bit.sha256 如下图: 编译日志为“./build/script/makemppdb_pkg.log”,安装包打包日志为“./build/script/make_package.log”。 编译openGauss-OM 安装openGauss时需要OM工具,因此需要编译openGauss-OM。 步骤 1执行如下命令进入到软件代码编译脚本目录。 [root@ecs-5045 soft]# cd /openGauss-lab/soft/openGauss-OM 步骤 2执行如下命令,编译安装OM。 [root@ecs-5045 openGauss-OM] # sh build.sh -3rd /openGauss-lab/soft/binarylibs 步骤 3显示如下内容,表示安装包编译成功。 Everything is ready success! 编译结果路径:/openGauss-lab/soft/openGauss-OM/package/。 编译结果: openGauss-1.1.0-openEuler-64bit-om.tar.gz openGauss-1.1.0-openEuler-64bit-om.sha256 [root@ecs-5045 openGauss-OM]# cd /openGauss-lab/soft/openGauss-OM/package/ [root@ecs-5045 package]# ll total 17M -rw------- 1 root root 65 Apr 16 16:27 openGauss-2.0.0-openEuler-64bit-om.sha256 -rw------- 1 root root 17M Apr 16 16:27 openGauss-2.0.0-openEuler-64bit-om.tar.gz 验证二次开发结果 安装编译后的openGauss安装包 修改操作系统配置 为了操作方便,也可以使用SSH工具(比如:PuTTY等)从本地电脑通过配置弹性云服务器的弹性公网IP地址(如:124.70.36.251)来连接ECS,并使用ROOT用户来登录。 设置字符集参数 将各数据库节点的字符集设置为相同的字符集,可以在/etc/profile文件中添加"export LANG=XXX"(XXX为Unicode编码)。 步骤 1 在/etc/profile文件中添加"export LANG= en_US.UTF‐8" [root@ecs-5045 ~]# cat >>/etc/profile<<EOF export LANG=en_US.UTF‐8 EOF 步骤 2 输入如下命令,使修改生效。 [root@ecs-5045 ~]# source /etc/profile 修改python版本 之后安装过程中openGauss用户互信,openEuler服务器需要用到Python-3.7.x命令,但是默认Python版本为Python-2.7.x,所以需要切换Python版本。 步骤 1进入/usr/bin文件,备份python文件。 [root@ecs-5045 ~]# cd /usr/bin 备份python文件。 [root@ecs-5045 bin] # mv python python.bak 步骤 2建立python3软连接。 [root@ecs-5045 bin] # ln -s python3 /usr/bin/python 步骤 3验证python版本。 [root@ecs-5045 bin] # python -V 显示如下,说明切换成功: Python 3.7.4 规划数据库安装包目录 步骤 1 登录ECS,规划存放安装包的目录并创建,并将内容设置为当前用户可读可执行。 [root@ecs-5045 bin]# mkdir -p /opt/software/openGauss [root@ecs-5045 bin]# chmod 755 -R /opt/software 注: 不建议把安装包的存放目录规划到openGauss用户的家目录或其子目录下,可能导致权限问题。 openGauss用户须具有/opt/software/openGauss目录的读写权限。 步骤 2 将数据库安装包放置到规划目录下。 [root@ecs-5045 bin]# cp /openGauss-lab/soft/openGauss-server/output/* /opt/software/openGauss [root@ecs-5045 bin]# cp /openGauss-lab/soft/openGauss-OM/package/* /opt/software/openGauss 说明:/openGauss-lab/soft/openGauss-server /output 路径是编译openGauss-server后安装包的默认存放路径; /openGauss-lab/soft/openGauss-OM/package是编译openGauss-OM后安装包的默认存放路径。 创建XML配置文件 安装openGauss前需要创建XML文件。XML文件包含部署openGauss的服务器信息、安装路径、IP地址以及端口号等。用于告知openGauss如何部署。用户需根据不同场合配置对应的XML文件。 以单节点配置的方案为例,说明如何创建XML配置文件。 步骤 1 以root用户登录待安装openGauss的主机,切换到存放安装包的目录。 [root@ecs-5045 bin]# cd /opt/software/openGauss 步骤 2 创建XML配置文件,用于数据库安装。 [root@ecs-5045 openGauss]# vi clusterconfig.xml 输入”i”进入INSERT模式,添加文本如下,加粗字体内容为示例,可自行替换。其中“ecs-5045”是弹性云服务器的名称,“192.168.0.58”为弹性云服务器的IP地址(私有),其他value值可以不进行修改。 <?xml version="1.0" encoding="UTF-8"?> <ROOT> <CLUSTER> <PARAM name="clusterName" value="dbCluster" /> <PARAM name="nodeNames" value="ecs-5045" /> <PARAM name="backIp1s" value="192.168.0.58"/> <PARAM name="gaussdbAppPath" value="/opt/gaussdb/app" /> <PARAM name="gaussdbLogPath" value="/var/log/gaussdb" /> <PARAM name="gaussdbToolPath" value="/opt/huawei/wisequery" /> <PARAM name="corePath" value="/opt/opengauss/corefile"/> <PARAM name="clusterType" value="single-inst"/> </CLUSTER> <DEVICELIST> <DEVICE sn="1000001"> <PARAM name="name" value="ecs-5045"/> <PARAM name="azName" value="AZ1"/> <PARAM name="azPriority" value="1"/> <PARAM name="backIp1" value="192.168.0.58"/> <PARAM name="sshIp1" value="192.168.0.58"/> <!--dbnode--> <PARAM name="dataNum" value="1"/> <PARAM name="dataPortBase" value="26000"/> <PARAM name="dataNode1" value="/gaussdb/data/db1"/> </DEVICE> </DEVICELIST> </ROOT> 弹性云服务器名称及私有IP查看: 步骤 4点击“ESC”退出INSERT模式,然后输入“:wq”后回车退出编辑并保存文本。 表5-1配置文件参数附加说明 须知: “/opt/huawei/newsql/tools”存放互信等工具,避免权限问题,不要把实例数据目录放在此目录下; 安装目录和数据目录需为空或者不存在,否则可能导致安装失败; 在对数据库节点的实例进行具体配置时,需确保配置的目录之间不相互耦合。即各个配置目录不关联,删除其中任意一个目录,不会级联删除其它目录。如gaussdbAppPath为"/opt/gaussdb/app",gaussdbLogPath为"/opt/gaussdb/app/omm"。当gaussdbAppPath目录被删除时,会级联删除gaussdbLogPath目录,从而引起其它问题; 若需要安装脚本自动创建安装用户时各配置的目录需保证不与系统创建的默认用户目录耦合关联; 配置openGauss路径和实例路径时,路径中不能包含"|",";","&","$","<",">","`","\","’",""","{","}","(",")","[","]","~","*","?"特殊字符。 初始化安装环境 为了保证openGauss的正确安装,请首先对主机环境进行配置。 准备安装用户及环境 创建完openGauss配置文件后,在执行安装前,为了后续能以最小权限进行安装及openGauss管理操作,保证系统安全性,需要运行安装前置脚本gs_preinstall准备好安装用户及环境。 前提条件 已完成安装准备的所有任务。 注意事项 用户需要检查上层目录权限,保证安装用户对安装包和配置文件目录读写执行的权限; xml文件中主机的名称与IP映射配置正确; 只能使用root用户执行gs_preinstall命令。 操作步骤 步骤 1修改performance.sh文件。 使用vi打开文件“/etc/profile.d/performance.sh”,具体如下: [root@ecs-5045 openGauss]# vi /etc/profile.d/performance.sh 输入”i”,进入INSERT模式。用#注释sysctl -w vm.min_free_kbytes=112640 &> /dev/null这行。 CPUNO=`cat /proc/cpuinfo|grep processor|wc -l` export GOMP_CPU_AFFINITY=0-$[CPUNO - 1] #sysctl -w vm.min_free_kbytes=112640 &> /dev/null sysctl -w vm.dirty_ratio=60 &> /dev/null sysctl -w kernel.sched_autogroup_enabled=0 &> /dev/null 点击“ESC”退出INSERT模式。输入“:wq”后回车,保存退出。 步骤 2 为确保openssl版本正确,执行预安装前加载安装包中lib库。 执行命令如下。 [root@ecs-5045 openGauss]# vi /etc/profile 输入i,进入INSERT模式,在文件的底部添加如下代码,加载安装包中lib库,其中packagePath为用户安装包放置的路径,本示例中为/opt/software/openGauss。按下“Esc”退出INSERT模式,输入”:wq”后回车,保存后退出。 export packagePath=/opt/software/openGauss export LD_LIBRARY_PATH=$packagePath/script/gspylib/clib:$LD_LIBRARY_PATH 配置完成后,输入如下命令,使设置生效。 [root@ecs-5045 openGauss]# source /etc/profile 步骤 3 在安装包所在的目录下,解压安装包。 执行以下命令进入安装包目录。 [root@ecs-5045 openGauss]# cd /opt/software/openGauss 解压openGauss-1.1.0-openEuler-64bit-om.tar.gz包。 [root@ecs-5045 openGauss]# tar -zxvf openGauss-2.0.0-openEuler-64bit-om.tar.gz 解压后,用ls命令查看如下。 [root@ecs-5045 openGauss]# ls clusterconfig.xml openGauss-2.0.0-openEuler-64bit-om.sha256 openGauss-2.0.0-openEuler-64bit-symbol.tar.gz script pgrade_sql.tar.gz openGauss-2.0.0-openEuler-64bit-om.tar.gz openGauss-2.0.0-openEuler-64bit.tar.bz2 simpleInstall version.cfg openGauss-2.0.0-openEuler-64bit-Libpq.tar.gz openGauss-2.0.0-openEuler-64bit.sha256 openGauss-2.0.0-openEuler-64bit-tools.tar.gz upgrade_sql.sha256 安装包解压后,会在/opt/software/openGauss路径下自动生成script子目录,并且在script目录下生成gs_preinstall等各种OM工具脚本。 步骤 4 使用gs_preinstall准备好安装环境,切换到gs_preinstall命令所在目录。 [root@ecs-5045 openGauss]# cd /opt/software/openGauss/script/ script中内容显示如下: [root@ecs-5045 script]# ls gs_backup gs_checkperf gs_om gspylib gs_uninstall __init__.py gs_check gs_collector gs_postuninstall gs_ssh gs_upgradectl killall gs_checkos gs_install gs_preinstall gs_sshexkey impl local 步骤 5 采用交互模式执行,并在执行过程中会创建root用户互信和openGauss用户互信: [root@ecs-5045 script]# python gs_preinstall -U omm -G dbgrp -X /opt/software/openGauss/clusterconfig.xml 这里的omm为操作系统用户(注:同时omm也是openGauss的数据库管理员账号,在下面的5.1.5 环节中会创建),dbgrp为运行openGauss的操作系统用户的群组名称,/opt/software/openGauss/clusterconfig.xml为openGauss配置文件路径。在执行过程中,用户根据提示选择是否创建互信,并输入root用户或openGauss用户的密码。 对root创建trust,输入root的密码,购买弹性服务云时自定义的密码。 Are you sure you want to create trust for root (yes/no)? yes Please enter password for root. Password: --说明:此处输入密码时,屏幕上不会有任何反馈,不用担心,这是LINUX操作系统对密码的保护. Creating SSH trust for the root permission user. 创建操作系统omm用户,并对omm创建trust,并设置密码,设置为Admin@123(建议用户自定义设置密码)。 Are you sure you want to create the user[omm] and create trust for it (yes/no)? yes Please enter password for cluster user. Password: --说明:此处输入密码时,屏幕上不会有任何反馈,不用担心,这是LINUX操作系统对密码的保护. Please enter password for cluster user again. Password: --说明:此处输入密码时,屏幕上不会有任何反馈,不用担心,这是LINUX操作系统对密码的保护. Successfully created [omm] user on all nodes. 成功后显示为: …… Setting finish flag. Successfully set finish flag. Preinstallation succeeded. 执行安装 按上述步骤准备好openGauss安装环境之后,按照启动安装过程部署openGauss。 前提条件 已成功执行前置脚本gs_preinstall; 服务器操作系统和网络均正常运行。 操作步骤 步骤 1改文件权限。 [root@ecs-5045 script]# chmod -R 755/opt/software/openGauss/script 步骤 2登录到openGauss的主机,并切换到omm用户。 [root@ecs-5045 script]# su - omm 注: omm指的是前置脚本gs_preinstall中-U参数指定的用户。 安装脚本gs_install必须以前置脚本中指定的omm执行,否则,脚本执行会报错。 步骤 3使用gs_install安装openGauss。 执行以下命令进行安装: gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter="--encoding=UTF8" --dn-guc="max_process_memory=3GB" --dn-guc="shared_buffers=256MB" --dn-guc="bulk_write_ring_size=256MB" --dn-guc="cstore_buffers=16MB" 具体如下: [omm@ecs-c9bf ~]$ gs_install -X /opt/software/openGauss/clusterconfig.xml --gsinit-parameter="--encoding=UTF8" --dn-guc="max_process_memory=3GB" --dn-guc="shared_buffers=256MB" --dn-guc="bulk_write_ring_size=256MB" --dn-guc="cstore_buffers=16MB" /opt/software/ openGauss/clusterconfig.xml为openGauss配置文件的路径。在执行过程中,用户需根据提示输入数据库管理员omm用户的密码,密码具有一定的复杂度,为保证用户正常使用该数据库,请记住输入的密码。 按照设置密码要求,比如设置密码为GaussDB@123(建议用户自定义设置密码): encrypt cipher and rand files for database. Please enter password for database: --说明:此处输入密码时,屏幕上不会有任何反馈 Please repeat for database: --说明:此处输入密码时,屏幕上不会有任何反馈 begin to create CA cert files 设置的密码要符合复杂度要求: 最少包含8个字符; 不能和用户名和当前密码(ALTER)相同,或和当前密码反序; 至少包含大写字母(A-Z),小写字母(a-z),数字,非字母数字字符(限定为~!@#$%^&*()-_=+|[{}];:,<.>/?)四类字符中的三类字符。 如果安装成功,显示如下: …… 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.. 安装生成的目录 安装后的目录及各目录下的文件说明请参见下表。 登录数据库验证结果 步骤 1 在数据库主节点服务器上,如果当前不在omm用户环境下,请如下命令切换至omm操作系统用户环境(可选操作)。 [root@ecs-5045 script]# su - omm 步骤 2启动数据库服务(可选操作,安装完毕后默认启动,如未启动,请按此步骤启动)。 启动服务命令: [omm@ecs-504 ~]$ gs_om -t start Starting cluster. ========================================= Successfully started. 查看服务是否启动: [omm@ecs-504 ~]$ gs_om -t status ----------------------------------------------------------------------- cluster_name : dbCluster cluster_state : Normal redistributing : No ----------------------------------------------------------------------- 步骤 3连接数据库。 [omm@ecs-504 ~]$ gsql -d postgres -p 26000 -r 当结果显示为如下信息,则表示连接成功。 gsql ((openGauss 2.0.0 build 38463266) compiled at 2021-04-16 16:11:37 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. postgres=# 其中,postgres为openGauss安装完成后默认生成的数据库。初始可以连接到此数据库进行新数据库的创建。26000为数据库主节点的端口号,需根据openGauss的实际情况做替换,请确认连接信息获取。 说明: gsql是openGauss数据库提供的命令行方式的数据库连接工具。 步骤 4 验证第3 章中开发的gauss_hello函数是否新增成功。 postgres=# select gauss_hello('openGauss User'); 成功显示如下: gauss_hello ---------------------------------------- Hello, openGauss User 本实验结束。

优秀的个人博客,低调大师

写了个IDEA开源插件,解决让人头疼的 vo2dto

作者:小傅哥 博客:https://bugstack.cn >沉淀、分享、成长,让自己和他人都能有所收获!😄 头炸,po2vo、vo2do、do2dto,一堆对象属性,取出来塞进来。要不是为了 DDD 架构下的各个分层防腐,真想一竿子怼下去。 那上 BeanUtils.copyProperties 呀,其实对象转换不只这个方法,还有同类的12种手段,但综合来看还是 MapStruct 在编译期生成x.set(y.get)代码的最终效果最好,整体压测数据如下: BeanUtils.copyProperties 是大家代码里最常出现的工具类,但只要你不把它用错成 Apache 包下的,而是使用 Spring 提供的,就基本还不会对性能造成多大影响。 但如果说性能更好,可替代手动get、set的,还是 MapStruct 更好用,因为它本身就是在编译期生成get、set代码,和我们写get、set一样。 其他一些组件包主要基于 AOP、ASM、CGlib,的技术手段实现的,所以也会有相应的性能损耗。 咋办? 给每一个转换对象属性的操作都写一个 MapStruct 吗?也不合适呀,有些就是方法中很简单的操作一下,写写代码就能搞定,问题就是懒的写,一多了还容易写错。别提 BeanUtils.copyProperties 有时候确定有性能问题,从编码上还看不出来属性的添加和减少 所以 我要写个 IDEA Plugin 解决这个问题,目的就一个,通过 IDEA 插件开发能力,定义到我需要转换属性的2个对象,把2个对象的转换代码自动生成出来,并织入到我的对象定位位置上。 设计一个插件 我是这么思考的:在 IDEA 开发工程代码中,在需要转换的2个对象间,复制第一个对象和属性,再把光标定位到转换对象上,接下来我给它提供个按钮或者快捷键,一点就把所有转换代码生成出来,这样不就解决了需要手写的问题了吗,效果如下: 1. 工程结构 vo2dto ├── .gradle └── src ├── main │ └── java │ └── cn.bugstack.guide.idea.plugin │ ├── action │ │ └── Vo2DtoGenerateAction.java │ ├── application │ │ └── IGenerateVo2Dto.java │ ├── domain │ │ ├── model │ │ │ ├── GenerateContext.java │ │ │ ├── GetObjConfigDO.java │ │ │ └── SetObjConfigDO.java │ │ └── service │ │ ├── impl │ │ │ └── GenerateVo2DtoImpl.java │ │ └── AbstractGenerateVo2Dto.java │ └── infrastructure │ └── Utils.java ├── resources │ └── META-INF │ └── plugin.xml ├── build.gradle └── gradle.properties 源码获取:https://github.com/fuzhengwei/vo2dto - 欢迎提交 issue、PR 共同维护 在此 IDEA 插件工程中,主要分为4块区域: action:提供菜单栏窗体,在插件中我们把这个菜单栏配置到 Generate 下,也就是通常你生成 get、set、constructor 方法的地方。 application:应用层定义接口,这里定义了一个用于生成代码并织入到锚点的方法接口。 domian:领域层专门处理代码的生成和织入动作,这一层把代码的中锚点位置获取、剪切板信息复制、应用上下文、类中get、set的解析,以及最终把生成代码织入到锚点后的操作。 infrastructure:在基础层提供了工具类,用于获取剪切板信息和锚点位置判断等操作。 2. 织入代码接口 cn.bugstack.guide.idea.plugin.application.IGenerateVo2Dto public interface IGenerateVo2Dto { void doGenerate(Project project, DataContext dataContext); } 定义接口其实非常重要的一步,因为这样一步就把生成的标准定义下来了,所有的生成动作都要从这个接口发起。学习源码也一样,你要找到一个核心的入口点,才能更好的开始学习 3. 定义模板方法 因为生成代码并织入锚点位置的操作,整个来看其实也是一套流程操作,因为在这个过程需要;获取上下文信息(也就是工程对象)、给当前锚点位置的类提取 set 方法集合、之后在给Ctrl+C剪切板上的信息读取出来提取 get 方法集合,第四步把set、get进行组合并织入代码到锚点位置。整体过程如下: 那么在使用模板方法后,就可以非常容易的把写在一个类里的成片的代码按照职责进行拆分。 同时因为有了模板的定义,也就定义出了整个一套标准流程,在流程规范下执行代码,后续再补充逻辑迭代功能也会更加容易。 4. 代码织入锚点 关于代码织入锚点前,我们在模板类中定义的方法,需要实现接口进行处理,重点包括: 通过 CommonDataKeys.EDITOR.getData(dataContext)、CommonDataKeys.PSI_ELEMENT.getData(dataContext) 封装 GenerateContext 对象上下文信息,也就是一些类、锚点位置、文档编辑的对象。 通过 PsiClass 获取光标位置对应的 Class 类信息,在通过 psiClass.getMethods() 读取对象方法,把 set 方法过滤出来,封装到集合中。 通过 Toolkit.getDefaultToolkit().getSystemClipboard() 获取剪切板信息,也就是你在锚点位置给对象生成 x.set(y.get) 时,复制的 Y y 对象,并开始提取 get 方法,同样封装到集合中。 那么最后就是代码的组装和织入动作了,这部分我们的代码如下; cn.bugstack.guide.idea.plugin.domain.service.impl.GenerateVo2DtoImpl @Override protected void weavingSetGetCode(GenerateContext generateContext, SetObjConfigDO setObjConfigDO, GetObjConfigDO getObjConfigDO) { Application application = ApplicationManager.getApplication(); // 获取空格位置长度 int distance = Utils.getWordStartOffset(generateContext.getEditorText(), generateContext.getOffset()) - generateContext.getStartOffset(); application.runWriteAction(() -&gt; { StringBuilder blankSpace = new StringBuilder(); for (int i = 0; i &lt; distance; i++) { blankSpace.append(" "); } int lineNumberCurrent = generateContext.getDocument().getLineNumber(generateContext.getOffset()) + 1; List<string> setMtdList = setObjConfigDO.getParamList(); for (String param : setMtdList) { int lineStartOffset = generateContext.getDocument().getLineStartOffset(lineNumberCurrent++); WriteCommandAction.runWriteCommandAction(generateContext.getProject(), () -&gt; { generateContext.getDocument().insertString(lineStartOffset, blankSpace + setObjConfigDO.getClazzParamName() + "." + setObjConfigDO.getParamMtdMap().get(param) + "(" + (null == getObjConfigDO.getParamMtdMap().get(param) ? "" : getObjConfigDO.getClazzParam() + "." + getObjConfigDO.getParamMtdMap().get(param) + "()") + ");\n"); generateContext.getEditor().getCaretModel().moveToOffset(lineStartOffset + 2); generateContext.getEditor().getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); }); } }); } 织入代码的流程动作,主要是对set方法集合进行遍历,把对应的x.set(y.get)通过 document.insertString 到具体的位置和代码。 最终所有生成的代码方法织入完成,即完成了整个 x.set(y.get) 的过程。 5. 配置菜单入口 plugin.xml <actions> <!-- Add your actions here --> <action id="Vo2DtoGenerateAction" class="cn.bugstack.guide.idea.plugin.action.Vo2DtoGenerateAction" text="Vo2Dto - 小傅哥" description="Vo2Dto generate util" icon="/icons/logo.png"> <add-to-group group-id="GenerateGroup" anchor="last" /> <keyboard-shortcut keymap="$default" first-keystroke="ctrl shift K" /> </action> </actions> 这次我们给生成 x.set(y.get) 代码的操作加个快捷键,可以让我们更加方便的进行操作。 安装使用验证 由于发布插件需要到 https://plugins.jetbrains.com/ 并等待审核,所以可以在 release 包下载:https://github.com/fuzhengwei/vo2dto/releases/tag/v2.2.2 下载后手动安装即可。 接下来你就可以 So Easy 的转换对象了,操作如下: 复制你需要被转换的对象,因为复制以后就可以被插件获取到剪切板信息了,也就能提取到get方法集合。 把鼠标定义到需要转换设置值的对象,之后鼠标右键,选择 Generate -> Vo2Dto - 小傅哥 1. 复制对象 2. 生成对象 3. 最终效果 最终你就可以看到已经把你全部的对象转换,自动生成出来代码了,是不是很香。 如果你直接使用快捷键 Ctrl + Shift + K 也是可以自动生成的。 拿去用用吧,最好再给提一些建议,提交issue、提交PR,都非常的欢迎!</string>

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册