"阴谋家"王莽鲜为人知的另一面

本文介绍了王莽在位期间对中国古代科学发展的贡献,包括支持尸体解剖、飞行实验及人造食品研究等,展现了这位帝王鲜为人知的科学精神。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前读过张宏杰《另一面:历史人物的另类传记》,其中《从先进模范到乱臣贼子:王莽》一文印象深刻,那个被骂了近两千年的王莽,作者却认为他是个标准的先进模范,甚至他最后当皇帝也有点“我不下地狱,谁下地狱”的献身精神,王莽同志把所有的精力都献给了国家,可惜他的鞠躬尽瘁,最终换来的是身败名裂,一直定位为“阴谋家”、“野心家”代言人。

  今天,我无意对他的为人和为政纲要翻案呐喊,只是想提提关于他不为人知的一面——支持科学的积极性颇为罕见,汇集如下:

  一、王莽曾支持过尸体解剖。中国古代一直视解剖尸体不道德,因而严厉禁止。南北朝时有人解剖尸体,结果被处死。可王莽却冲破这一传统观念,为了掌握人体结构,他曾于公元16年支持宫廷医生解剖被处死犯人的尸体,让医生对其五脏仔细观察测量,并用细竹篾插进血管检查血管的分布情况。这是我国历史上最早的有关尸体解剖的记载,比被称为“解剖之父”的维萨斯还要早一千五百多年。

  二、王莽曾支持过飞行实验。据《前汉书.王莽传》记载,王莽做皇帝的时候,为了抵御北方的匈奴,曾经召集天下有特殊技能的人为他服务,其中有一个打猎的青年声称自己会飞,能飞到匈奴那里去侦察敌情,王莽就叫他来试一下,结果青年从箱子中间拿出了一身用羽毛制造的衣服,穿在身上,头上也戴了一个用羽毛制造的帽子,就像一个大鸟一样。据说,他飞了几百步,王莽看他这种飞行能力还远不能去侦察敌情,于是便支持他进行飞行技术的“研发”,并封了他一个小官,送了他车和布匹作为礼物,这就是历史上一段关于中国人的飞行实验的记载,比达芬奇的扑翼机早了一千多年。在此之前的战国时期,墨子和鲁班都曾做过木鸟,据说鲁班做的木鸟能在天上飞三天三夜。不过这些充其量只是算是航空模型,而王莽支持的是真人实验,显然更进了一步。

  三、王莽支持过人造食品的研制。公元24年,由于连年灾荒,食品缺乏,王莽派人到各地调查可以食用的植物,进行人造食品研制。虽然没有成功,但这却是世界上最早的人造食品研究实验。

  遥想当年,已是千年之外,身为封建皇帝,能有这般科学头脑,着实难能可贵。由此,我们至少可以给王莽来个评论:他是一位伟大的理想主义者,一位崇尚科学的皇帝。

<think>首先,用户的问题是关于在MyBatis中处理或使用字符串'0'的问题。具体来说,他们问:&quot;MyBatis 中如何正确处理字符串类型的 '0'&quot;。 我需要回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考的引用: - 引用[1]: 讨论了MyBatis中的字符串问题,包括动态SQL、字符串拼接、类型处理器等。 - 引用[2]: 强调MyBatis的字符串处理机制,包括安全性和优化。 - 引用[3]: 具体提到MyBatis空字符串判断问题,特别是当数字类型与空字符串比较时的问题。 - 引用[4]: 展示了在MyBatis中使用if条件判断字符串类型是否一致。 用户的问题焦点是处理字符串'0'。在MyBatis中,'0'可能被误判为false或null,尤其是在条件判断中,因为MyBatis在OGNL表达式中可能将'0'视为false。 关键点: - 在MyBatis的if标签中,test属性使用OGNL表达式。 - OGNL会将字符串'0'解释为数字0,这可能导致问题。 - 例如,如果有一个字符串字段,值是'0',在if test=&quot;field != null and field != ''&quot;中,'0'可能被错误地排除,因为它不等于空字符串,但可能被误判为false。 根据引用[3],它提到当数字类型与空字符串比较时的问题,比如obj != '',如果obj是Long类型,空字符串会被转换为0。类似地,对于字符串'0',如果直接比较,可能出问题。 解决方案: 1. 在if条件中,正确处理字符串比较。引用[4]展示了使用toString()来比较字符串,如test=&quot;udt_license_plate != '1'.toString()&quot;。 2. 使用MyBatis的类型处理器来确保字符串值被正确处理。 3. 避免在非字符串类型上使用字符串比较。 结构化回答: - 逐步解释问题。 - 提供解决方案。 - 使用代码示例。 - 最后生成相关问题。 回答结构: 1. 介绍问题:解释在MyBatis中处理字符串'0'时可能遇到的问题。 2. 分析原因:简要说明MyBatis的OGNL表达式如何解释字符串'0'。 3. 解决方案: - 使用toString()方法进行比较。 - 确保正确使用类型处理器。 - 其他技巧。 4. 代码示例:展示正确的方式。 5. 总结。 6. 生成相关问题。 确保使用中文。 生成相关问题: - 基于主题,如MyBatis字符串处理、条件判断等。 引用标识: - 在回答中,如果引用参考内容,添加引用标识。例如,引用[3]提到数字类型比较问题,可以引用。 用户的问题直接针对字符串'0',所以焦点在条件判断中处理'0'。 最终回答框架: - 开头:直接回答问题。 - 步骤: a. 问题描述 b. 原因分析 c. 解决方案 d. 代码示例 - 结尾:总结。 - 相关问题。</think>### MyBatis 中正确处理字符串类型 '0' 的指南 在 MyBatis 中处理字符串类型的 '0' 时,常见问题是它可能被误判为 `false`、`null` 或空值,尤其是在动态 SQL 的条件判断中。这是因为 MyBatis 使用 OGNL(Object-Graph Navigation Language)解析表达式,而 OGNL 会将字符串 '0' 隐式转换为数字 0 或布尔值 `false`,导致逻辑错误。例如,在 `<if>` 标签中直接比较 `field == '0'` 可能失败。下面我将逐步解释原因并提供可靠解决方案,确保代码健壮性。 #### 1. **问题根源分析** - **OGNL 的隐式类型转换**:MyBatis 的动态 SQL 依赖 OGNL 表达式。当比较字符串 '0' 时,OGNL 会尝试将其转换为数字或布尔值: - 字符串 '0' 被转换为数字 0(例如,在 `field == 0` 的上下文中)。 - 在布尔上下文中,'0' 被视为 `false`(而非字符串)。 - 这会导致条件判断失效,例如 `<if test=&quot;status == '0'&quot;>` 可能错误地返回 `false`。 - **引用示例**:引用 [3] 指出,MyBatis 对非字符串类型进行空串判断时,会将空串转换为数字 0,类似地,字符串 '0' 也可能被误处理[^3]。 #### 2. **解决方案:正确比较字符串 '0'** 以下是针对字符串 '0' 的可靠处理方法,确保在动态 SQL 中准确判断。 **方法一:使用 `toString()` 显式转换** - 在 OGNL 表达式中,通过调用 `toString()` 强制将比较双方视为字符串,避免隐式转换。 - **代码示例**: ```xml <select id=&quot;selectUsers&quot; resultType=&quot;User&quot;> SELECT * FROM users WHERE 1=1 <if test=&quot;status != null and status.toString() == '0'.toString()&quot;> AND status = 'active' <!-- 当 status 为字符串 '0' 时执行 --> </if> </select> ``` - **说明**:`status.toString() == '0'.toString()` 确保双方都是字符串类型,防止 OGNL 将 '0' 解释为数字 0。 - **引用支持**:引用 [4] 展示了类似技巧,使用 `toString()` 处理字符串比较[^4]。 **方法二:利用 MyBatis 类型处理器** - 自定义类型处理器(TypeHandler)可精确控制字符串 '0' 的映射逻辑,适用于字段映射或参数传递。 - **代码示例**: ```java // 自定义类型处理器:将字符串 '0' 映射为特定值 public class ZeroStringHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { if (&quot;0&quot;.equals(parameter)) { ps.setString(i, &quot;zero&quot;); // 将 '0' 存储为 'zero' } else { ps.setString(i, parameter); } } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { String value = rs.getString(columnName); return &quot;zero&quot;.equals(value) ? &quot;0&quot; : value; // 查询时将 'zero' 转回 '0' } } ``` - **配置**:在 MyBatis 配置文件中注册此处理器: ```xml <typeHandlers> <typeHandler handler=&quot;com.example.ZeroStringHandler&quot; javaType=&quot;String&quot;/> </typeHandlers> ``` - **优点**:适用于复杂场景,如数据库字段存储 '0' 但需特殊逻辑处理。 - **引用支持**:引用 [1] 强调自定义类型处理器是解决字符串问题的核心策略之一[^1]。 **方法三:避免空值混淆** - 结合 `<isNotNull>` 或 `<isNotEmpty>` 标签,确保 '0' 不被误判为空值。 - **代码示例**: ```xml <if test=&quot;status != null and status != ''&quot;> <choose> <when test=&quot;status.toString() == '0'.toString()&quot;> AND action = 'start' </when> <otherwise> AND action = 'stop' </otherwise> </choose> </if> ``` - **说明**:`<choose>` 结构增强可读性,`status != ''` 排除空字符串,但保留 '0'。 #### 3. **开发技巧与注意事项** - **技巧一:预防 SQL 注入** 使用 `#{}` 占位符(而非 `${}`)传递参数,确保字符串 '0' 安全处理: ```xml <if test=&quot;input != null&quot;> AND column = #{input} <!-- 安全:MyBatis 自动转义 --> </if> ``` - **引用支持**:引用 [2] 指出,MyBatis 的字符串处理机制内置安全性,但需正确使用占位符[^2]。 - **技巧二:测试边界条件** 在单元测试中覆盖字符串 '0' 的场景: ```java @Test public void testZeroString() { Map<String, Object> params = new HashMap<>(); params.put(&quot;status&quot;, &quot;0&quot;); // 明确传递字符串 '0' List<User> users = sqlSession.selectList(&quot;selectUsers&quot;, params); Assert.assertFalse(users.isEmpty()); // 验证逻辑正确 } ``` #### 4. **总结** 在 MyBatis 中处理字符串 '0' 时,核心是**避免 OGNL 的隐式类型转换**。优先使用 `toString()` 进行显式字符串比较,或通过自定义类型处理器精细控制映射逻辑。结合 `<isNotNull>` 等标签可提升健壮性,同时始终用 `#{}` 预防注入风险。这些方法确保 '0' 被正确识别为字符串,而非 `false` 或数字 0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值