-
跨越周期迷雾:2023 Java 工程师进阶与薪资跃迁的底层逻辑在 2023 年这个技术演进与经济周期发生剧烈碰撞的十字路口,Java 开发领域正经历着一场极其残酷却合乎逻辑的洗牌。曾几何时,只要熟练掌握 SSH/SSM 框架,会写基本的增删改查,就能在互联网红利期轻松拿到高薪入场券。然而今天,伴随着流量见顶与产业互联网的深化,“会用框架”已经从核心竞争力退化成了从业者应有的“呼吸能力”。大量仍停留在业务胶水代码层面的 Java 工程师,正陷入无休止的内卷与薪资停滞的泥沼。“告别死工资,实现薪资跃迁”,这句话在当下绝不仅仅是跳槽换名片那么简单。它背后要求 Java 工程师必须重新审视自身的发展轨迹,精准把脉当前的就业市场趋势,完成从“代码搬运工”到“复杂系统架构师”的底层逻辑重构。一、 就业趋势之变:从“野蛮生长”到“精耕细作”的价值重估想要实现薪资跃迁,首先要看懂企业在 2023 年到底愿意为什么样的能力买单。当前的就业市场呈现出两个极其明显的断裂带。第一个断裂带是初级人才的绝对过剩与高级架构人才的极度稀缺。随着各大厂降本增效成为常态,企业缩减了毫无经验的“螺丝钉”HC。但与此同时,企业在进行数字化转型、微服务改造、底层性能调优时,却发现能真正扛起大旗的人少之又少。市场不再愿意为“人力堆叠”买单,而是疯狂追逐“智力杠杆”。这意味着,那些能够以一己之力解决线上 OOM 频繁宕机、能够将系统吞吐量提升数倍的 Java 工程师,其薪资定价权完全掌握在自己手中。第二个断裂带是技术栈的收敛与底层深度的要求急剧上升。过去几年,Java 生态中出现了海量的中间件和框架,很多人沾沾自喜于“用过多少框架”。但在 2023 年的就业面试中,简历上写“熟悉 Redis、熟悉 MQ”已经无法引起面试官的任何兴趣。企业的考察点正在疯狂向下穿透:你不仅要用 Redis,你还要懂底层跳表结构、懂 RDB 与 AOF 混合持久化的底层 IO 模型;你不仅要用消息队列,你还要能画出极其严谨的分布式事务状态机,能讲清楚在极端宕机情况下消息防丢失、防重复消费的底层机制。就业趋势已经明确宣告:知其然的时代结束了,知其所以然才是高薪的护城河。二、 发展趋势之变:从“业务支撑”向“技术赋能”的角色蜕变从程序员个人长远的职业发展来看,Java 工程师的价值锚点正在发生根本性的位移。这也是打破“死工资”天花板的核心所在。传统的 Java 开发者,往往被定位为“业务需求的翻译机”。产品经理画原型,开发者写代码实现。在这种模式下,你的薪资上限是由业务部门的利润上限决定的,一旦业务停滞,你的发展也就随之停滞。而 2023 年之后的进阶趋势是,优秀的 Java 工程师必须成为“技术赋能者”。所谓技术赋能,是指你不再被动等待需求,而是能够利用底层技术手段,主动为业务开辟新的可能性。例如,当业务面临高并发秒杀瓶颈时,你能够主动引入多级缓存架构、异步化改造,将原本只能支撑 1000 QPS 的系统拉升到 10 万 QPS,直接为公司创造出承接更大规模营销活动的条件;当数据库面临千万级大表的查询危机时,你能够通过分库分表、索引深度优化、甚至引入 ES 和 CQRS 架构,将响应时间从秒级降到毫秒级。当你完成了这种角色蜕变,你交付的不再是“代码行数”,而是“性能指标的提升”和“服务器成本的节约”。你的价值评估模型就从“研发成本”变为了“利润中心”,薪资跃迁自然水到渠成。三、 薪资跃迁的破局之道:重塑三大核心壁垒看懂了趋势,接下来就是如何将认知转化为实际的进阶动作。想要在 2023 年告别死工资,必须着力重塑以下三大核心壁垒:1. 夯实底层基石:将 JVM 与并发编程化为肌肉记忆不要再去纠结各种边缘框架的使用,把最核心的精力投入到 Java 底层。深入理解 JVM 内存模型、垃圾回收算法在不同业务场景下的调优策略;将 Java 并发编程(JUC)啃透,不仅要知道各种锁的实现原理,更要深刻理解线程池的底层运转机制、内存可见性与指令重排在实际高并发场景下的致命影响。能够在线上复杂的生产环境中,通过 dumped 内存快照快速定位内存泄漏,是拿到高薪的绝对硬通货。2. 攻克分布式难题:构建高可用架构的系统化思维微服务不是简单的把一个大项目拆成几个小项目,而是面对分布式环境下“一切皆不可靠”的妥协与治理。必须死磕分布式事务(如 Seata 的 AT、TCC 模式的底层原理)、分布式锁、以及限流熔断降级的完整链路。你要在脑海中建立一套完整的系统可用性防御体系:当某个节点挂掉时,如何做到无损容灾?当流量洪峰到来时,如何保护核心链路?这种全局的架构视角,是区分初级开发与资深架构的分水岭。3. 拥抱云原生生态:拓宽技术与业务的物理边界Java 已经不再是孤立的运行在物理机上的程序。未来的进阶方向必须与云原生(Docker、Kubernetes)深度绑定。你需要理解 Java 程序在容器环境下的资源限制问题、懂服务网格的流量调度逻辑。更重要的是,要将视野向外延伸,理解大数据的离线/实时计算链路(如 Flink、Kafka 的深度应用),理解基础架构如何支撑业务数据的流转。你的技术视野越宽广,能够解决的业务复杂度就越高,薪资的弹性空间就越大。结语在 2023 年这个时间节点,Java 工程师告别死工资的过程,注定是一次逆人性的苦行。它要求你彻底砸碎过去赖以生存的“舒适区”,向下扎根到枯燥的底层原理中,向上延展到复杂的业务架构里。时代的红利已经从“普及计算机知识”转移到了“攻克高深复杂系统”。当你不再畏惧底层的晦涩,当你能够以架构师的上帝视角审视每一行代码对整个系统的影响时,你会发现,所谓的薪资天花板,不过是弱者给自己设定的心理牢笼。跨越它,前方是另一片广阔的星辰大海。
-
org.postgresql.util.PSQLException: The authentication type 5 is not supported. Check that you have configured the pg_hba.conf file to include the client's IP address or subnet, and that it is using an authentication type supported by this driver.at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:556)at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:195)at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactoryImpl.java:65)at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:124)连接Gaussdb库,使用的是<dependency> <groupId>com.huaweicloud.dws</groupId> <artifactId>huaweicloud-dws-jdbc</artifactId> <version>8.3.0</version></dependency>试过:1、在连接的配置参数是将spark.yarn.user.classpath.first、spark.driver.userClassPathFirst、spark.executor.userClassPathFirst三个参数均设置true,但是没啥用
-
初衷竟然只是为了防止开挂。。反正也是单核
-
全球贵金属行情查询,包括:实时价格、历史价格、K线走势、期货合约等,覆盖国内和国外贵金属交易数据。国内贵金属包括:黄金、白银、铜、国际铜、锌、铝、镍、锡、铅、不锈钢、螺纹钢。国际贵金属包括:伦敦金、伦敦银、伦敦铜、伦敦铝、伦敦锌、伦敦镍、伦敦铅、伦敦锡、现货铂金、现货钯金、美黄金、美白银、美铜。下面介绍贵金融行情的API参见此处国内贵金属报价请求参数名称类型必须说明symbolString是国内贵金属期货品种代码成功返回样例{ "code": 200,//返回码对应描述 "msg": "成功",//返回码,详见返回码说明 "taskNo": "138485498227260625726111",//本次请求号 "data": { "presettle": 614.51, "ask_vol": 3, //卖量(手数) "change": 3.71,//涨跌额 "bid_vol": 1, //买量(手数) "hold": 236472, //持仓量 "volume": 13396, //成交量 "update_time": 1731090599, "high": 619.7, //最高价 "low": 614.2, //最低价 "price": 618.22,//当前价格 "name": "黄金延期", //名称 "ask": 618.68, //卖价 "preclose": 612.87,//昨日收盘价 "bid": 616.02, //买价 "changeRate": 0.6,//涨跌率 "value": 8273493248,//成交额 "open": 614.3 //今日开盘价 } } 国内贵金属K线请求参数名称类型必须说明symbolString是国内贵金属品种typeString是k线类型0:日k1:1分钟5:五分钟30:30分钟60:60分钟120:120分钟240:240分钟limitString否返回条数 默认10成功返回样例{ "code": 200,//返回码对应描述 "msg": "成功",//返回码,详见返回码说明 "taskNo": "089625202232146663243632",//本次请求号 "data": { "lines": [ [ 621.5, 624.78, 625.7, 620.32, 3.28, 0.53, 34402, 1730044800 ] ], "fields": [ "open",//当前分钟开盘价 "close",//当前分钟收盘价 "high", //当前分钟最高价 "low", //当前分钟最低价 "change", //当前分钟涨跌额 "changeRate", //当前分钟涨跌率正常返回示例 "volume", //当前分钟成交数 "tick_at" //数据时间戳 ] } } 国内贵金属期货合约请求参数名称类型必须说明symbolString是国内贵金属期货品种代码成功返回样例{ "code": 200,//返回码对应描述 "msg": "成功",//返回码,详见返回码说明 "taskNo": "668229506174286233793097",//本次请求号 "data": { "list": [ { "symbol": "AU0", //代码 "name": "黄金2412" //名称 }, { "symbol": "AU2412",//代码 "name": "黄金2412" //名称 } ] } } 国际贵金属报价请求参数名称类型必须说明symbolString是国际贵金属品种成功返回样例{ "code": 200,//返回码对应描述 "msg": "成功",//返回码,详见返回码说明 "taskNo": "795463438161562841240471",//本次请求号 "data": { "presettle": 614.51, "ask_vol": 3, //卖量(手数) "change": 3.71,//涨跌额 "bid_vol": 1, //买量(手数) "hold": 236472, //持仓量 "volume": 13396, //成交量 "update_time": 1731090599, "high": 619.7, //最高价 "low": 614.2, //最低价 "price": 618.22,//当前价格 "name": "伦敦金(现货黄金)", //名称 "ask": 618.68, //卖价 "preclose": 612.87,//昨日收盘价 "bid": 616.02, //买价 "changeRate": 0.6,//涨跌率 "value": 8273493248,//成交额 "open": 614.3 //今日开盘价 } } 国际贵金属K线请求参数名称类型必须说明symbolString是国际贵金属品种typeString是k线类型0:日k1:1分钟5:五分钟30:30分钟60:60分钟120:120分钟240:240分钟limitString否返回条数 默认10成功返回样例{ "code": 200,//返回码对应描述 "msg": "成功",//返回码,详见返回码说明 "taskNo": "881490008152974143098955",//本次请求号 "charge": true,//计费标志 "data": { "lines": [ [ 2734.83, 2736, 2736.09, 2734.83, 1.17, 0.04, 55, 1732310100 ], [ 2736, 2736.63, 2736.63, 2736, 0.63, 0.02, 42, 1732310400 ] ], "fields": [ "open",//当前分钟开盘价 "close",//当前分钟收盘价 "high",//当前分钟最高价 "low", //当前分钟最低价 "change",//当前分钟涨跌额 "changeRate",//当前分钟涨跌率正常返回示例 "volume",//当前分钟成交数 "tick_at" //数据时间戳 ] } } 国际贵金属期货合约请求参数名称类型必须说明symbolString是国际贵金属期货品种代码成功返回样例{ "code": 200,//返回码对应描述 "msg": "成功",//返回码,详见返回码说明 "taskNo": "251234402215985750524304",//本次请求号 "charge": true,//计费标志 "data": { "list": [ "SI", "SI2411", "SI2412", "SI2501", "SI2503", "SI2505", "SI2507", "SI2509", "SI2512" ] } } }
-
>run_and_test.bat ./demos/Solution.java ./data/practice_2.in ./data/practice_1.outCompiling Solution.java...Begin running ...本地运行后一直卡在这里python的也是这样
-
不然根本不知道自己的分应该优化正确性还是速度,优化了交上去都没有提示,作为练习赛,应该放开这一点吧
-
依据任务书3.0所说,先判断欧式距离是否和正确答案差距小于1e-4,再判断图形是否重合。如果出现图形A,B之间在边缘处重合,但是因为所需位移小于1e-4而输出(0,0)答案是否算错误
-
书号通常指国际标准书号(ISBN,International Standard Book Number),是国际通行的图书唯一标识符,相当于每一本书、每一种版本的“身份证号码”。书号的构成目前使用最广的是13位ISBN(2007 年之后全面推行),其结构为:前缀元素:固定为978或979(图书产品代码)国家/语言区号:如中国为7(简体中文出版物常用)出版社代码:由书号管理机构分配给出版社书序号:出版社为具体出版物分配的编号校验码:最后一位,用于验证书号是否正确书号的作用唯一标识:一本书的不同版本(精装、平装、电子书)、不同语种、不同格式都会有各自独立的书号。全球通用:在世界范围内,通过书号可以精准定位一本出版物。出版必备:在中国,正规出版物必须配有书号,才能进入发行渠道(实体书店、电商平台、图书馆等)。流通与数据基础:图书的编目、订购、库存、销售统计、版权管理都依赖书号。#书号查询API介绍可以接入书号查询API,根据书号来查询书本的详细信息,包括:书名、作者(编者、译者)、出版社、出版日期、出版地、版次、印次、装帧信息、纸张开数、语言、字数、页数等信息。详细使用参见此处请求参数名称类型必须说明isbnString是书的isbn码(必须是10、13位的纯数字)返回样例{ "code": 200, "msg": "成功", "taskNo": "65171553403304103621", "charge": true, "data": { "details": [ { "series": "",//丛书信息(不是丛书为空字符串) "title": "2",//书名 "author": "",//作者(编者、译者)信息 "publisher": "",//出版社 "pubDate": "",//出版日期 "pubPlace": "长春",//出版地 "isbn": "9787555357902",//13位isbn号 "isbn10": "7555357909",//10位isbn号 "price": "28.80",//定价 "genus": "TP311.132.3",//中图分类号 "levelNum": "",//读者评分 "heatNum": "0",//图书热度(即:购买或评论总人次) "format": "",//纸张开数 "binding": "平装",//装帧信息 "page": "",//页数 "wordNum": "",//字数 "edition": "1版",//版次 "yinci": "1",//印次 "paper": "",//书籍纸张类型 "language": "",//语言 "keyword": "",//图书关键词 "img": "",//封面图片大图链接,有效期10天。建议自行下载保存,避免丢失 "bookCatalog": "",//目录 "gist": "",//图书内容简介 "cipTxt": "",//cip信息 "annotation": "",//一般附注 "subject": "",//主题 "batch": ""//丛编信息 } ] } }
-
线上判题器对时延的敏感性到底如何?10s的时间不改变成绩嘛?
-
想问一下各位py,c++,java交demo分别多少分啊,一样吗?
-
本地可以编译的情况下排查起来真的很费时间
-
sh脚本好像只编译Solution文件,和官方说的编译全部文件不一致,导致无法多文件运行。
-
用的codearts IDE,用户指南说单元测试要用UT智能体但是ide没有这一项挠头
-
经过年复一年的开发积累,企业的代码仓逐渐变得臃肿,甚至变成屎山代码。这些屎山代码,往往经过N个程序员之手,他们水平参差不起,风格不一。如何对这些屎山代码进行统一的管理,让它们可以被监控、评价和批量改造?建立“代码管理系统”的第一个难点在于,如何在庞大的代码仓中,快速的查找出具有某些特征的代码段。由于我们需要查找的是代码段,而不是代码行,用传统的正则表达式难以实现,需要通过语法解析器进行自定义语法配置,然后进行代码查找。 以小实例说明 : ### 实例1: 找出JAVA代码中,入参数量超过4个的函数:# 配置查找规则(Code_manage.syn)如下所示:__DEF_CASE_SENSITIVE__ Y __DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_LINE_COMMENT__ // __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __NAME__ <1,200> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$?? [0,199]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] import if else for while break continue class return try except finally final static public private __DEF_PATH__ __FUNCTION_DEF__ 0101 : x1 @ | public : x2 @ + private 0 0 : x3 @ CAN_SKIP | static 1 1 : x4 @ | __NAME__ : x5 @ | __NAME__ : x6 @ | ( 1111 : p1 @ CAN_SKIP | final : p11 @ | __NAME__ : p111 @ | __NAME__ : p2 @ | , : p22 @ CAN_SKIP | final : p222 @ | __NAME__ : p2222 @ | __NAME__ : p3 @ | , : p33 @ CAN_SKIP | final : p333 @ | __NAME__ : p3333 @ | __NAME__ NNNN : p4 @ | , : p44 @ CAN_SKIP | final : x444 @ | __NAME__ : x4444 @ | __NAME__ 1111 : xx @ | )# 假设java代码(MyCode.java) 如下所示:private int alreadyBufferedSize = 0; // The index in the byte[] found at buffers.getLast() to be written next private int index = 0; // Is the stream closed? private boolean closed = false; public FastByteArrayOutputStream(int initialBlockSize) { Assert.isTrue(initialBlockSize > 0, "Initial block size must be greater than 0"); this.initialBlockSize = initialBlockSize; this.nextBlockSize = initialBlockSize; } @Override public void applyBeanPropertyValues(Object existingBean, String beanName, int autowireMode, boolean dependencyCheck, int initSize) throws BeansException { markBeanAsCreated(beanName); BeanDefinition bd = getMergedBeanDefinition(beanName); BeanWrapper bw = new BeanWrapperImpl(existingBean); initBeanWrapper(bw); applyPropertyValues(beanName, bd, bw, bd.getPropertyValues()); } @Override public Object initializeBean(Object existingBean, String beanName) { return initializeBean(beanName, existingBean, null); }根据配置规则,执行查找命令: ZGLanguage -e Code_manage.syn -f MyCode.java可以得到结果:C:\>ZGLanguage -e Code_manage.syn -f MyCode.java Run type : Find Syntax file : Code_manage.syn code file : MyCode.java Output file : out.zgl -------------------------------------------------------------------- ### Found code by : __FUNCTION_DEF__ | Lines : 17 ~ 17 : -------------------------------------------------------------------- public void applyBeanPropertyValues(Object existingBean, String beanName, int autowireMode, boolean dependencyCheck, int initSize)可以看出,查找结果只输出了函数 applyBeanPropertyValues,它的入参数量为5个,其他2个函数的入参均不超过4个,因此被忽略。 ### 实例2: 提取SQL代码中的关联(on)和筛选(where)代码段:# 配置查找规则(Code_manage.syn)如下所示:__DEF_DEBUG__ N __DEF_FUZZY__ Y __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_PATH__ __WHERE__ 1 : x1 | where : x2 | __PATH_4_EXPR__ __DEF_PATH__ __ON__ 1 : x1 | __\b__ : x2 + __\t__ : x3 + __\n__ : x4 | on : x5 | __PATH_4_EXPR__ __DEF_SUB_PATH__ __PATH_4_EXPR__ 1 : x1 | __SUB_PATH_EXPR__ : x2 + __ONE_PATH_EXPR__ __DEF_SUB_PATH__ __SUB_PATH_EXPR__ 1 : x1 | ( : x2 | __ONE_PATH_EXPR__ : x3 | ) __DEF_SUB_PATH__ __ONE_PATH_EXPR__ NN : @ | __NAME__ : @ + __INT__ : @ + __FLOAT__ : @ + __CASE_WHEN__ : @ + __STRING__ : @ + __CAST_AS__ : @ + __FUNCTION__ : @ + __SUB_PATH_EXPR__ : @ + = : @ + <> : @ + != : @ + > : @ + >= : @ + < : @ + <= : @ + . : @ + , : @ + + : @ + - : @ + * : @ + / : @ + || : @ + null : @ + between : @ + and : @ + or : @ + like : @ + in : @ STRING + not in : @ STRING + is null : @ STRING + is not null __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] select inner left join on from where group order by having union all with as table date time __DEF_STR__ __FLOAT__ <1,100> [1,50]0123456789 [1,1]. [1,50]0123456789 __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | ' __DEF_SUB_PATH__ __DECIMAL__ 111 : x1 | decimal 0 : x2 | ( 01 : x3 | __INT__ 00 : x4 | , 00 : x5 | __INT__ 01 : x6 | ) __DEF_SUB_PATH__ __VAR_NAME__ 1 : x1 | $ : x2 | { : x3 | __NAME__ : x4 | } __DEF_SUB_PATH__ __CASE_WHEN__ 1 : x1 @ | case N : x2 @ | when : x3 @ | __PATH_4_EXPR__ : x4 @ | then : x5 @ | __PATH_4_EXPR__ 1 : x6 @ CAN_SKIP | else : x7 @ CAN_SKIP | __PATH_4_EXPR__ : x8 @ | end __DEF_SUB_PATH__ __CAST_AS__ 1 : x1 | cast : x2 | ( 1 : x3 | __PATH_4_EXPR__ : x4 | as : x5 | date : x6 + int : n1 + double : n2 + float : n3 + bigint : x8 + __DECIMAL__ 1 : xx | ) __DEF_SUB_PATH__ __FUNCTION__ 1 : x1 @ | __NAME__ : x2 @ | ( N : x3 @ CAN_SKIP | __PATH_4_EXPR__ e : x4 @ CAN_SKIP | , 1 : x5 @ | )# 假设SQL代码(myproc.sql) 如下所示:CREATE OR REPLACE PROCEDURE PROC_F_CWWS_LOAN ( P_AS_OF_DATE IN DATE, RET_FLG OUT VARCHAR2, RET_MSG OUT VARCHAR2 ) IS -- 声明变量并初始化 V_COUNT NUMBER := 0; V_PROC_NAME VARCHAR2(200) := 'PROC_F_CWWS_LOAN'; V_PROC_DESC VARCHAR2(100) := 'xxxx业务数据ETL处理'; V_P_FREQ VARCHAR2(4) := ''; BEGIN --写入初始日志 INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 1'); COMMIT; --设置会话日期格式 EXECUTE IMMEDIATE ' ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD'''; --查询参数表中,该程序对应的频率值 SELECT P_FREQ INTO V_P_FREQ FROM ETL_PROC_STATUS_DEF WHERE PROC_NAME = V_PROC_NAME; --判断是调度频率 ETL.ETL_ADD_PARTITION('MA_F_LOAN', P_AS_OF_DATE, 'ETL'); --从还款计划表中取每笔账户最近一次小于等于数据日期还款日,作为上次还款日 INSERT INTO ETL.TMP_XD_LAST_PAYDATE (OBJECTNO, LAST_PAYDATE) SELECT OBJECTNO, LAST_PAYDATE FROM (SELECT T.OBJECTNO, MAX(TO_DATE(PAYDATE, 'YYYY-MM-DD')) LAST_PAYDATE FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE T WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.SEQID <> '999' AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE GROUP BY T.OBJECTNO); INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 3'); COMMIT; MERGE INTO ETL.MA_F_LOAN A USING (SELECT /*+PARALLEL(8)*/ T.ACCOUNT_NUMBER, T.GL_ACCOUNT_ID, T.INT_GL_ACCOUNT_ID FROM ETL.MA_F_LOAN T INNER JOIN ETL.MA_D_GL_SUBJECT T1 ON T.INT_GL_ACCOUNT_ID = T1.SUBJECT_NO3 AND T1.SUBJECT_NAME3 LIKE '%已减值%' AND T1.AS_OF_DATE = P_AS_OF_DATE WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.ACCOUNT_NUMBER IN (SELECT ACCOUNT_NUMBER FROM (SELECT /*+PARALLEL(8)*/ T2.ACCOUNT_NUMBER, COUNT(1) FROM ETL.MA_F_LOAN T2 WHERE T2.AS_OF_DATE = P_AS_OF_DATE GROUP BY T2.ACCOUNT_NUMBER HAVING COUNT(1) > 1))) B ON (A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER AND A.AS_OF_DATE = P_AS_OF_DATE AND A.GL_ACCOUNT_ID = B.GL_ACCOUNT_ID AND A.INT_GL_ACCOUNT_ID = B.INT_GL_ACCOUNT_ID) WHEN MATCHED THEN UPDATE SET A.CUR_BOOK_BAL = 0, A.OVERDUE_BAL = 0; COMMIT; RET_FLG := '0'; RET_MSG := '执行成功'; EXCEPTION WHEN OTHERS THEN --写入异常日志 ETL.PROC_ETL_LOG(P_AS_OF_DATE,V_PROC_NAME,V_PROC_DESC,V_COUNT,-1,SQLCODE,SQLERRM); RET_MSG := SQLCODE || ':' || SQLERRM; END; /根据配置规则,执行查找命令: ZGLanguage -e Code_manage.syn -f myproc.sql可以得到结果:C:\>ZGLanguage -e Code_manage.syn -f myproc.sql Run type : Find Syntax file : Code_manage.syn code file : myproc.sql Output file : out.zgl -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 27 ~ 27 : -------------------------------------------------------------------- WHERE PROC_NAME = V_PROC_NAME -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 39 ~ 41 : -------------------------------------------------------------------- WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.SEQID <> '999' AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE -------------------------------------------------------------------- ### Found code by : __ON__ | Lines : 52 ~ 54 : -------------------------------------------------------------------- ON T.INT_GL_ACCOUNT_ID = T1.SUBJECT_NO3 AND T1.SUBJECT_NAME3 LIKE '%宸插噺鍊?' AND T1.AS_OF_DATE = P_AS_OF_DATE -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 55 ~ 56 : -------------------------------------------------------------------- WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.ACCOUNT_NUMBER IN -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 61 ~ 61 : -------------------------------------------------------------------- WHERE T2.AS_OF_DATE = P_AS_OF_DATE -------------------------------------------------------------------- ### Found code by : __ON__ | Lines : 64 ~ 66 : -------------------------------------------------------------------- ON (A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER AND A.AS_OF_DATE = P_AS_OF_DATE AND A.GL_ACCOUNT_ID = B.GL_ACCOUNT_ID AND A.INT_GL_ACCOUNT_ID = B.INT_GL_ACCOUNT_ID) WHEN MATCHED THEN UPDATE SET A.CUR_BOOK_BAL = 0, A.OVERDUE_BAL = 0可以看出,查找结果将 myproc.sql 代码中的 where 和 on 代码块及其所在行号提取出来。
-
作为后端开发者,API 是系统的门面,也是前后端协作的基石。一份规范、优雅、可扩展的 RESTful API,不仅能降低协作成本,更能支撑系统长期迭代。今天用实战视角,把 RESTful 设计规范与落地最佳实践一次性讲透。 一、先搞懂:什么是 RESTfulREST(Representational State Transfer)是一种架构风格,而非强制标准。 满足以下核心原则,才能叫 RESTful:面向资源(Resource),一切皆资源使用 HTTP 方法表达行为无状态(Stateless):每个请求独立完整统一接口:URI、Method、Status、Response 标准化目标:直观、自解释、易维护、易扩展。 二、URI 设计规范(最容易踩坑的地方) 1. 使用名词,而非动词/getUser/deleteOrder/createProduct错误:/getUser/deleteOrder/createProduct正确:/users/orders/products2. 复数形式 资源是集合,统一用复数: /users 而非 /user/items 而非 /item3. 层级关系用 / 表示/users/{id}/orders/users/{userId}/addresses/{addressId}4. 禁止大写、下划线,用中横线/userInfo ❌/user-info ✅5. 不要暴露文件后缀/api/users.json ❌/api/users ✅三、HTTP 方法语义(必须严格遵守)方法作用幂等安全GET查询资源✅✅POST新增资源❌❌PUT全量更新 / 替换✅❌PATCH局部更新✅❌DELETE删除✅❌实战示例:获取用户列表:GET /users获取单个用户:GET /users/{id}新建用户:POST /users全量更新:PUT /users/{id}局部更新:PATCH /users/{id}删除用户:DELETE /users/{id} 四、状态码使用(别再只返回 200/404 了)成功类200 OK:查询 / 修改成功201 Created:创建成功204 No Content:删除成功(无返回体)客户端错误400 Bad Request:参数错误401 Unauthorized:未登录 / Token 无效403 Forbidden:已登录但无权限404 Not Found:资源不存在405 Method Not Allowed:方法不支持422 Unprocessable Entity:校验失败服务端错误500 Internal Server Error:服务器异常502 Bad Gateway:网关错误503 Service Unavailable:服务不可用 五、统一响应体结构(前后端必约定)推荐通用结构:{ "code": 200, // 业务码 "message": "success", "data": {}, // 主体数据 "requestId": "xxx" // 方便排查问题}成功:code=200失败:使用具体业务码,如 1001、4001禁止:成功失败混用结构六、分页、排序、过滤(标准写法)1. 分页GET /users?pageNum=1&pageSize=102. 排序GET /users?sort=createTime,desc3. 过滤GET /users?gender=male&status=active原则: 查询条件全部放 query不要放 body(GET 不规范) 七、版本管理(API 必做)三种主流方式,任选其一并统一:URL 路径(最常用)/api/v1/users/api/v2/users请求头Accept-version: v1参数/users?version=1建议:新项目直接用 v1 起步。八、安全与最佳实践必须 HTTPSToken 放 Header:Authorization: Bearer {token}敏感参数不暴露在 URL请求参数必校验接口限流防刷日志记录 requestId、入参、耗时、异常跨域使用 CORS,不要乱用 JSONP提供 API 文档:Swagger / Knife4j / OpenAPI 九、反例 vs 正例(一眼看懂差距)❌ 混乱不规范:/getUserInfo?id=1/api/delete_order/1/userList?type=1&page=1✅ RESTful 规范:GET /api/v1/users/1DELETE /api/v1/orders/1GET /api/v1/users?type=1&pageNum=1&pageSize=10十、总结一句话RESTful 不是花架子,而是团队协作的通用语言:资源用名词复数行为用 HTTP 方法状态码表达结果结构统一、版本必加、安全必做
上滑加载中
推荐直播
-
码道新技能,AI 新生产力——从自动视频生成到开源项目解析2026/04/08 周三 19:00-21:00
童得力-华为云开发者生态运营总监/何文强-无人机企业AI提效负责人
本次华为云码道 Skill 实战活动,聚焦两大 AI 开发场景:通过实战教学,带你打造 AI 编程自动生成视频 Skill,并实现对 GitHub 热门开源项目的智能知识抽取,手把手掌握 Skill 开发全流程,用 AI 提升研发效率与内容生产力。
回顾中 -
华为云码道:零代码股票智能决策平台全功能实战2026/04/18 周六 10:00-12:00
秦拳德-中软国际教育卓越研究院研究员、华为云金牌讲师、云原生技术专家
利用Tushare接口获取实时行情数据,采用Transformer算法进行时序预测与涨跌分析,并集成DeepSeek API提供智能解读。同时,项目深度结合华为云CodeArts(码道)的代码智能体能力,实现代码一键推送至云端代码仓库,建立起高效、可协作的团队开发新范式。开发者可快速上手,从零打造功能完整的个股筛选、智能分析与风险管控产品。
回顾中 -
华为云码道全新升级,多会话并行与多智能体协作2026/05/08 周五 19:00-21:00
王一男-华为云码道产品专家;张嘉冉-华为云码道工程师;胡琦-华为云HCDE;程诗杰-华为云HCDG
华为云码道4月份版本全新升级,此次直播深度解读4月份产品特性,通过“特性解读+实操演示+实战案例+设计创新”的组合,全方位展现码道在多会话并行与多智能体协作方面的能力,赋能开发者提升效率
正在直播
热门标签