MyBatis的parameterType传入参数类型和resultType返回结果类型
记录:413
场景:MyBatis的parameterType传入参数类型和resultType返回结果类型。
版本:JDK 1.8,Spring Boot 2.6.3,mybatis-3.5.9。
1.传入参数parameterType是Integer
传入参数类型parameterType:java.lang.Integer。
返回结果类型resultType: java.lang.String。
1.1Mapper接口代码
@Repository
public interface CityTypeMapper {String getCity01(Integer cityId);
}
1.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity01" parameterType="java.lang.Integer" resultType="java.lang.String">select CITY_NAME FROM t_city WHERE CITY_ID=#{cityId}</select>
</mapper>
2.传入参数parameterType是Long
传入参数类型parameterType: java.lang.Long。
返回结果类型resultType: java.lang.String。
2.1Mapper接口代码
@Repository
public interface CityTypeMapper {String getCity02(Long cityId);
}
2.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity02" parameterType="java.lang.Long" resultType="java.lang.String">select CITY_NAME FROM t_city WHERE CITY_ID=#{cityId}</select>
</mapper>
3.传入参数parameterType是Double
传入参数类型parameterType: java.lang.Double。
返回结果类型resultType: java.lang.Double。
3.1Mapper接口代码
@Repository
public interface CityTypeMapper {Double getCity03(Double gross);
}
3.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity03" parameterType="java.lang.Double" resultType="java.lang.Double">select LAND_AREA FROM t_city WHERE GROSS=#{gross}</select>
</mapper>
4.传入参数parameterType是String
传入参数类型parameterType: java.lang.String。
返回结果类型resultType: java.lang.Long。
4.1Mapper接口代码
@Repository
public interface CityTypeMapper {Long getCity04(String cityName);
}
4.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity04" parameterType="java.lang.String" resultType="java.lang.Long">select CITY_ID FROM t_city WHERE CITY_NAME=#{cityName}</select>
</mapper>
5.传入参数parameterType是List<Long>
传入参数类型parameterType: java.util.ArrayList。
返回结果类型resultType: java.lang.Long。
5.1Mapper接口代码
@Repository
public interface CityTypeMapper {long[] getCity05(List<Long> cityIdList);
}
5.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity05" parameterType="java.util.ArrayList" resultType="java.lang.Long" >select POPULATION FROM t_city WHERE CITY_ID IN<foreach collection="list" item="cityId" open="(" separator="," close=")">#{cityId}</foreach></select>
</mapper>
6.传入参数parameterType是Long[]
传入参数类型parameterType: long[]。
返回结果类型resultType: java.lang.String。
6.1Mapper接口代码
@Repository
public interface CityTypeMapper {List<String> getCity06(Long[] cityIdList);
}
6.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity06" parameterType="long[]" resultType="java.lang.String">select CITY_NAME FROM t_city WHERE CITY_ID IN<foreach collection="array" item="cityId" open="(" separator="," close=")">#{cityId}</foreach></select>
</mapper>
7.传入参数parameterType是Map<String, Object>
传入参数类型parameterType: java.util.Map。
返回结果类型resultType: com.hub.example.domain.CityPO。
7.1Mapper接口代码
@Repository
public interface CityTypeMapper {CityPO getCity07(Map<String, Object> cityMap);
}
7.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity07" parameterType="java.util.Map" resultType="com.hub.example.domain.CityPO">select CITY_ID AS "cityId",CITY_NAME AS "cityName",LAND_AREA AS "landArea",POPULATION AS "population",GROSS AS "gross",CITY_DESCRIBE AS "cityDescribe",DATA_YEAR AS "dataYear",UPDATE_TIME AS "updateTime"from t_citywhere CITY_ID = #{cityId}AND CITY_NAME = #{cityName}</select>
</mapper>
8.传入参数parameterType是CityPO
传入参数类型parameterType: com.hub.example.domain.CityPO。
返回结果类型resultType: java.util.Map。
8.1Mapper接口代码
@Repository
public interface CityTypeMapper {Map<String, Object> getCity08(CityPO cityPO);
}
8.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity08" parameterType="com.hub.example.domain.CityPO" resultType="java.util.Map">select CITY_ID AS "cityId",CITY_NAME AS "cityName",LAND_AREA AS "landArea",POPULATION AS "population",GROSS AS "gross",CITY_DESCRIBE AS "cityDescribe",DATA_YEAR AS "dataYear",UPDATE_TIME AS "updateTime"from t_citywhere CITY_ID = #{cityId}AND CITY_NAME = #{cityName}</select>
</mapper>
9.传入参数parameterType是Date
传入参数类型parameterType: java.util.Date。
返回结果类型resultType: java.lang.String。
9.1Mapper接口代码
@Repository
public interface CityTypeMapper {String getCity09(Date date);
}
9.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity09" parameterType="java.util.Date" resultType="java.lang.String">select CITY_NAMEFROM t_citywhere UPDATE_TIME = #{date}</select>
</mapper>
10.传入参数parameterType是List<Long>
传入参数类型parameterType: java.util.ArrayList。
返回结果类型resultType: com.hub.example.domain.CityPO。
10.1Mapper接口代码
@Repository
public interface CityTypeMapper {List<CityPO> getCity10(List<Long> paraList);
}
10.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity10" parameterType="java.util.ArrayList" resultType="com.hub.example.domain.CityPO">select CITY_ID AS "cityId",CITY_NAME AS "cityName",LAND_AREA AS "landArea",POPULATION AS "population",GROSS AS "gross",CITY_DESCRIBE AS "cityDescribe",DATA_YEAR AS "dataYear",UPDATE_TIME AS "updateTime"from t_cityWHERE CITY_ID IN<foreach collection="list" item="cityId" open="(" separator="," close=")">#{cityId}</foreach></select>
</mapper>
11.传入参数parameterType是List<Long>
传入参数类型parameterType: java.util.ArrayList。
返回结果类型resultType: java.util.Map。
11.1Mapper接口代码
@Repository
public interface CityTypeMapper {List<Map<String, Object>> getCity11(List<Long> paraList);
}
11.2XML代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.mapper.CityTypeMapper"><select id="getCity11" parameterType="java.util.ArrayList" resultType="java.util.Map">select CITY_ID AS "cityId",CITY_NAME AS "cityName",LAND_AREA AS "landArea",POPULATION AS "population",GROSS AS "gross",CITY_DESCRIBE AS "cityDescribe",DATA_YEAR AS "dataYear",UPDATE_TIME AS "updateTime"from t_cityWHERE CITY_ID IN<foreach collection="list" item="cityId" open="(" separator="," close=")">#{cityId}</foreach></select>
</mapper>
12.测试代码
12.1代码
@Slf4j
@RestController
@RequestMapping("/hub/example/cityType")
public class CityTypeController {@Autowiredprivate CityTypeMapper cityTypeMapper;@GetMapping("/load01")public Object load01() {log.info("测试开始...");// 1.parameterType: java.lang.Integer; resultType: java.lang.StringString cityName01 = cityTypeMapper.getCity01(2);// 2.parameterType: java.lang.Long; resultType: java.lang.StringString cityName02 = cityTypeMapper.getCity02(1L);// 3.parameterType: java.lang.Double; resultType: java.lang.Doubledouble landArea = cityTypeMapper.getCity03(1.81D);// 4.parameterType: java.lang.String; resultType: java.lang.Longlong cityId = cityTypeMapper.getCity04("苏州");List<Long> paraList01 = Arrays.asList(1L, 2L);// 5.parameterType: java.util.ArrayList; resultType: java.lang.Longlong[] population = cityTypeMapper.getCity05(paraList01);// 6.parameterType: long[]; resultType: java.lang.StringLong[] paraList02 = new Long[]{1L, 2L};List<String> cityNameList = cityTypeMapper.getCity06(paraList02);// 7.parameterType: java.util.Map; resultType: com.hub.example.domain.CityPOMap<String, Object> map = new HashMap<>();map.put("cityId", 3L);map.put("cityName", "苏州");CityPO cityPO = cityTypeMapper.getCity07(map);// 8.parameterType: com.hub.example.domain.CityPO; resultType: java.util.MapCityPO cityPO02 = CityPO.builder().cityId(3L).cityName("苏州").build();Map<String, Object> map02 = cityTypeMapper.getCity08(cityPO02);// 9.parameterType: java.util.Date; resultType: java.lang.StringDate date = DateUtil.parse("2023-03-10 05:39:16", "yyyy-MM-dd HH:mm:ss");String time = cityTypeMapper.getCity09(date);// 10.parameterType: java.util.ArrayList; resultType: com.hub.example.domain.CityPOList<Long> paraList = Arrays.asList(1L, 2L, 3L);List<CityPO> list01 = cityTypeMapper.getCity10(paraList);// 11.parameterType: java.util.ArrayList; resultType: java.util.MapList<Long> paraList03 = Arrays.asList(1L, 2L, 3L);List<Map<String, Object>> list02 = cityTypeMapper.getCity11(paraList03);log.info("测试结束...");
return "执行成功";}
}
12.2测试请求
URL01: http://127.0.0.1:18080/hub-example/hub/example/cityType/load01
13.基础支撑
13.1实体对象
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CityPO implements Serializable {private Long cityId;private String cityName;private Double landArea;private Long population;private Double gross;private String cityDescribe;private String dataYear;private Date updateTime;
}
13.2建表语句
CREATE TABLE t_city (CITY_ID BIGINT(16) NOT NULL COMMENT '唯一标识',CITY_NAME VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '城市名',LAND_AREA DOUBLE DEFAULT NULL COMMENT '城市面积',POPULATION BIGINT(16) DEFAULT NULL COMMENT '城市人口',GROSS DOUBLE DEFAULT NULL COMMENT '生产总值',CITY_DESCRIBE VARCHAR(512) COLLATE utf8_bin DEFAULT NULL COMMENT '城市描述',DATA_YEAR VARCHAR(16) COLLATE utf8_bin DEFAULT NULL COMMENT '数据年份',UPDATE_TIME DATETIME DEFAULT NULL COMMENT '更新时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='城市信息表';
13.3引入MyBatis依赖
使用mybatis-spring-boot-starter方式引入mybatis,对应mybatis-3.5.9和mybatis-spring-2.0.7核心依赖。
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency>
以上,感谢。
2023年4月17日
相关文章:
MyBatis的parameterType传入参数类型和resultType返回结果类型
记录:413 场景:MyBatis的parameterType传入参数类型和resultType返回结果类型。 版本:JDK 1.8,Spring Boot 2.6.3,mybatis-3.5.9。 1.传入参数parameterType是Integer 传入参数类型parameterType:java.lang.Integer。 返回结…...
什么是Android FrameWork,请你介绍一下?
Framework是什么 Framework的中文意思是“框架”,在软件开发中通常指开发框架,在一个系统中处于内核层之上,为顶层应用提供接口,被设计用来帮助开发者快速开发顶层应用,而不必关心系统内核运行机制,通常Fr…...
【SQL 必知必会】- 第十六课 更新和删除数据
目录 更新数据 不要省略WHERE 子句 在UPDATE 语句中使用子查询 删除数据 不要省略WHERE 子句 友好的外键 删除表的内容而不是表 更快的删除 更新和删除的指导原则 这一课介绍如何利用UPDATE 和DELETE 语句进一步操作表数据。 更新数据 更新(修改)表中…...
常见哈希算法及其应用
哈希算法经常会被用到,比如我们Go里面的map,Java的HashMap,目前最流行的缓存Redis都大量用到了哈希算法。它们支持把很多类型的数据进行哈希计算,我们实际使用的时候并不用考虑哈希算法的实现。而其实不同的数据类型,所…...
PHP快速入门02-PHP语言基础
文章目录前言一、 数据类型1.1 String(字符串)1.2 Integer(整型)1.3 Float(浮点型)1.4 Boolean(布尔型)1.5 Array(数组)1.6 Object(对象ÿ…...
FSCapture - 长截图工具
FSCapture - 长截图工具前言下载使用推荐设置长截图前言 目前大部分手机系统都自带长截图功能,但Windows系统没有自带的长截图功能,因此推荐一款第三方工具FSCapture,该软件轻量强大,支持长截图,即滚动截图。 下载 …...
[ 云计算 | Azure ] Chapter 05 | 核心体系结构之管理组、订阅、资源和资源组以及层次关系
本文主要对如下内容进行讲解:Azure云计算的核心体系结构组件中的:资源、订阅和资源组,以及了解 Azure 资源管理器 (ARM) 如何部署资源。 本系列已经更新文章列表: [ 云计算 | Azure ] Chapter 03 | 描述云计算运营中的 CapEx 与…...
【算法LearnNO.1】算法介绍以及算法的时间复杂度和空间复杂度
目录 一、算法 1、算法概述 2、算法的5个特性 3、设计算法的标准 二、时间复杂度 1、时间复杂度的介绍 2、渐进时间复杂度的求法 3、计算时间复杂度的代码举例(平方阶示例) 4、时间复杂度排序 三、空间复杂度 一、算法 1、算法概述 算法就是解…...
013:Mapbox GL添加marker
第013个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加marker。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhu…...
智慧工厂可视化合集,推动行业数字化转型
图扑软件基于 HTML5(Canvas/WebGL/WebVR)标准的 Web 技术,满足了工业物联网跨平台云端化部署实施的需求,以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库,到 2D 和 3D 编辑,…...
工作流调度系统 Azkaban介绍与安装(一)
文章目录前言1、为什么要用工作流调度系统2、常见的工作流调度系统1 集群规划2 配置 MySQL3 配置 Executor Server3.1 修改 azkaban.properties3.2 启动3.3 激活4 配置 Web Server4.1 修改 azkaban.properties4.2 修改azkaban-users.xml文件,添加 atguigu 用户4.3 启…...
【Python基础入门学习】Python工具Pycharm的安装与使用
一、关于Python 1.1 下载Python 在下载与安装pycharm工具前,一定要先安装python 打开Python官网:python下载打开上述网站,选择 Downloads -> 系统 我是Windows系统,点击进入后,找到自己要安装的安装包以及想安装的…...
【版本控制】Github同步Gitee镜像仓库自动化脚本
文章目录Github同步Gitee镜像仓库自动化脚本前言什么是Hub Mirror Action?1.介绍2.用法配置步骤1.生成密钥对2.GitHub私钥配置3.Gitee公钥配置4.Gitee生成私人令牌5.Github绑定Gitee令牌6.编写CI脚本7.多仓库同步推送8.定时运行脚本总结Github同步Gitee镜像仓库自动…...
索引的分类
1.唯一索引 给表中某一列设置为了唯一约束(这列不允许出现重复数据)后,数据库会为将这一列设置索引,这个索引叫做唯一索引(主键那一列是一个特殊的唯一索引,不仅要满足唯一索引这一列不可以出现重复数据,而且这一列还…...
【整理九】
目录1.说说你对递归的理解?封装一个方法用递归实现树形结构封装2.Link和import有什么区别?3.什么是FOUC? 如何避免?4.说说你对预编译器的理解?5.shouldComponentUpdate 的作用6.概述下 React 中的事务处理逻辑7.React组件的划分业…...
钢网是SMT生产使用的一种工具,如何制作?
钢网是SMT生产使用的一种工具,其主要功能是将锡膏准确地涂敷在有需要焊接的PCB焊盘上。 钢网的好坏,直接影响印刷工作的质量,目前一般使用的金属钢网,是由薄薄的、带有小孔的金属板制作成的,在开孔处,锡膏…...
如何创建自己的gym环境
我们为什么要创建一个gym的环境呢?因为需要,哈哈哈,这是一句废话,但是也是一句真话。因为我不想自己写强化学习的算法了,我想用一些现成的框架,这些框架训练的都是gym的游戏,那我把我自己想要训…...
使用Marshaller 将Java对象转化为XML格式和字符串转为xml
使用Marshaller 将Java对象转化为XML格式 对象转xml内容 ①工具类 public static String convertObjectToXml(Object obj) throws Exception {StringWriter writer new StringWriter();// 创建 JAXBContext 和 MarshallerJAXBContext context JAXBContext.newInstance(obj.ge…...
NumPy 秘籍中文第二版:八、质量保证
原文:NumPy Cookbook - Second Edition 协议:CC BY-NC-SA 4.0 译者:飞龙 “如果您对计算机撒谎,它将帮助您。” – Perry Farrar,ACM 通讯,第 28 卷 在本章中,我们将介绍以下秘籍: …...
[ 应急响应篇基础 ] 日志分析工具Log Parser配合login工具使用详解(附安装教程)
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
FanControl终极指南:5步实现Windows风扇精准控制与静音优化
FanControl终极指南:5步实现Windows风扇精准控制与静音优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendi…...
在龙芯3A6000/7A2000上玩转GPIO和I2C:手把手教你解读和修改固件ACPI表
龙芯平台ACPI表深度解析:从GPIO配置到I2C设备驱动的实战指南 当你在龙芯3A6000或7A2000开发板上连接一个温湿度传感器,却发现系统毫无反应时,问题很可能出在ACPI表的配置上。作为嵌入式开发者,理解并掌握ACPI表的修改技巧&#x…...
告别Unity!用eDrawings ActiveX控件在WinForm里轻松嵌入CAD三维模型(附避坑指南)
轻量化CAD集成方案:eDrawings ActiveX控件在WinForm中的高效实践 当机械设计软件公司需要为内部物料管理系统添加零件预览功能时,技术选型往往面临两难抉择。Unity等游戏引擎虽然功能强大,但其资源占用和开发复杂度对于简单的CAD模型预览场景…...
保姆级教程:用YOLOv8和Pyside6从零搭建一个火焰烟雾检测桌面应用(附完整源码和数据集)
从零构建火焰烟雾检测桌面应用:YOLOv8与Pyside6实战指南 在工业安全、家庭监控和实验室防护场景中,火焰与烟雾的早期检测至关重要。传统监控系统依赖人工值守或简单传感器,难以实现精准的实时预警。本文将带你用Python生态中最前沿的YOLOv8目…...
有钱才懂爱:赚到钱你再去谈男女关系,你会发现,择偶逻辑都变了。 没钱的时候,你看到的是一堆条件:房子、车子、工作、家境。 有钱了之后,那些条件你都自己有了
先谋生,再谋爱:有钱之后,我才看懂了男女关系的真相 目录 先谋生,再谋爱:有钱之后,我才看懂了男女关系的真相 没钱的时候,你谈的从来都不是爱情,是“生存合伙” 钱是最好的过滤器,它能帮你滤掉所有的“功能性需求” 底层的“忠诚”,很多时候只是“没有选择”的同义词…...
Redis分布式锁进阶第六十一篇
一、本篇前置衔接 第九十二篇我们完成Redisson源码拆解、手写复刻、底层内核穿透,彻底明白分布式锁代码层、脚本层、线程层原理。到此为止,代码、源码、坑点、运维、监控、面试全部讲透。但很多开发最大的困惑依旧存在:不同体量公司为什么锁架…...
Vue3组合式API进阶:深入理解和高效使用Composition API
Vue3组合式API进阶:深入理解和高效使用Composition API 前言 大家好,我是前端老炮儿!今天咱们来聊聊Vue3组合式API的进阶用法。 你以为ref和reactive就够了?那你可太天真了!Vue3的Composition API远比你想象的更强大。…...
Excel MCP Server 完全指南:无需安装Excel的自动化处理方案
Excel MCP Server 完全指南:无需安装Excel的自动化处理方案 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server Excel MCP Server 是一个基于模…...
别再只问ChatGPT答案了!试试这个Prompt技巧,让大模型把解题思路‘说’给你听
解锁大模型思维密码:用Prompt技巧让AI展示完整推理路径 当你向ChatGPT抛出一个复杂问题时,是否曾对那个突然出现的最终答案感到困惑?就像看到魔术师从空帽子中变出兔子,却不知道机关在哪里。现代大型语言模型确实能给出惊人准确的…...
不懂PMP的项目经理,正在被AI和敏捷时代淘汰
一、一个正在发生的残酷事实 张伟是一家传统制造企业的项目经理,拥有十年工作经验。他的日常工作是这样的:每天早上整理Excel进度表,中午开会协调资源,晚上更新甘特图,睡前发送项目周报。他觉得自己很忙、很重要。 直到…...
