- 导航
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
博客目录
一.问题描述
1.现象
已知有一个实体对象,对象信息如下,我们需要重点关注的是 id 字段是 Integer 类型的
@Data
@TableName(value = "test", autoResultMap = true)
public class Test3PO implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.NONE)
private Integer id;
@TableField(typeHandler = Str2DateTypeHandler.class)
private Date date;
}
有一个查询方法,是将实体作为参数传入,id 的值为 0
@Component
public class TestRunner3 implements CommandLineRunner {
@Autowired
private TestMapper testMapper;
@Override
public void run(String... args) throws Exception {
Test3PO test3PO = new Test3PO();
test3PO.setId(0);
test3PO.setDate(new Date());
this.testMapper.judge(test3PO);
}
}
xml 中的语句
<select id="judge">
SELECT id, date
FROM test1
where 1=1
<if test="query.id!=null and query.id!=''">
order BY id DESC
</if>
</select>
2.结果
输出的 sql 结果如下,也就是 query.id!=''为false
了,是不是比较震惊,一个 Integer 类型的 0 和字符串相互比较,结果居然是true
SELECT id, date
FROM test1
where 1=1
二.源码探究
1.ASTNotEq
因为比较的是!=方法,所以在 ASTNotEq 的源码的比较地方打了断点,关键点在于 OgnlOps.equal(v1, v2)方法
2.isEqual 方法
断点跟进 compareWithConversion 方法
3.compareWithConversion
4.doubleValue
学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容: