个人思考
其实在写这篇文章的时候我就产生了一个思考。
mybatis 为什么要去支持注解呢?
当然,我们都知道,基于注解开发是趋势,给我们简化了非常多的东西。
特别是 SpringBoot 的出现,可以说是注解开发的黄金时代。
遥想当年刚刚入行的时候,开发一个 SSM 项目大多数时间都是在进行 xml 文件的配置。
可以说是很羡慕现在入行的小年轻了,没有真正经历(也许自己搭建过,玩了一下)过被 xml 配置支配的恐惧。
在 xml 时代,大家都是粘来粘去的。而现在基于注解开发了,很多东西都简化了,渐渐的自己也能很轻松的搭建一个可以跑起来的小项目了。
所以,基于注解开发大体上一件很优雅,很好,很值得推广的事情。
为什么说大体上呢?
因为我个人偏见的觉得对于 mybatis 框架来说,没有 xml 文件的 mybatis 是没有灵魂的。
当然,如果你全是简单的 SQL 语句就能实现的功能,你可以用注解开发。但是这个情况,我觉得还是在少数的。
同样,我们可以用注解的形式实现所有 xml 文件能实现的功能。但是我觉得不太优雅。
所以,我觉得一个比较折中的方式是简单 SQL 可以用注解开发,如果是一些有诸如条件判断类的需求的 SQL 还是要写在 xml 文件中。
不要为了拥抱注解,而完全摒弃了 xml 的形式。
你记得吗,在 xml 时代转向注解时代的时候,还有一个经常用到的注解。
有人说这是过渡时代的产物,而在我看来,这更是求同存异的完美体现。
这个注解,就完全的体现最近这句很火的话:
君子美美与共,和而不同。
当然这些都是我在写这篇文章的过程中产生的一些浅显的个人看法而已。不具备参考意义。
骚代码
另外,再给大家分享一个我认为的 mybatis 的骚代码吧。
代码非常的简单明了,很久以前第一次看 mybatis 源码的时候我就是觉得有点“骚”,给我留下了深刻的影响:
org.apache.ibatis.session.defaults.DefaultSqlSession#selectOne(java.lang.String, java.lang.Object)
selectOne 方法:
该方法调用的还是 selectList 方法,但是对返回集合进行了一个判断,如果集合大小为 1,说明就真的是 selectOne ,如果大于 1,则抛出异常。
说真的,如果让我去实现这个功能,我不会一下就想到这个方法,我会去老老实实的写功能,然后对返回值进行判断。写完之后,我可能才会发现。哎,这段代码和 selectList 方法可以复用哦,然后才提取出来,变成这样。
记得很久之前面试,面试官问我对看过的源码中哪段影响深刻的,其中我就说到了这个方法。
总之,我个人觉得很妙。
注意坑
然后再说一个之前踩过的坑吧,还导致了一次紧急上线。
还是拿文中的示例说明:
如果我们把返回值从 Integer 变成 int:
用这个测试用例还是会正常查询出结果:
但是,如果我们查询一个数据库中不存在的人的年龄呢?比如这样:
那么就会抛出这样的错误:
找到对应源码,我们可以看到:
当返回值是 null 的时候,但是方法上的返回值类型又不是包装类型中的一种,也不是 void 类型,则抛出异常。
看一下这个方法,是 native 的:
java.lang.Class#isPrimitive
你想想为什么 mybatis 给你进行了这样的一个判断呢?
那就是如果返回为 null ,自动拆箱的时候会抛出空指针的。
即使 mybatis 帮我们挡了一下,我还是完美的踩了一个坑,写出了空指针异常。
代码是这样的,接收的时候我还是用 Integer 去接收了:
但是接口调用时的返回值我手贱写成了这样:
明白了吧,妥妥的,空指针,没得跑了。
最后说一句(求关注)
人的潜力真的是巨大的,不逼自己一把,我都不知道我这周真的可以把文章写完。
最近这周晚上回来的时间晚一点了,所以周内的晚上一般都没有时间写文章。
最近成都也热起来了,夏天我有时还是需要一小会的午睡,来保证下午的工作状态的。其他的季节我不需要午休,所以现在中午也很少有时间写一会文章了。
算了一下,连上这篇,我已经连续周更 39 周,输出 48 篇原创文章了。
啊,我真是牛皮呀。
周更作者的痛苦与快乐,你想象不到:
点个赞吧,周更很累的,不要白嫖我,需要一点正反馈。
才疏学浅,难免会有纰漏,如果你发现了错误的地方,由于本号没有留言功能,还请你在后台留言指出来,我对其加以修改。
感谢您的阅读,我坚持原创,十分欢迎并感谢您的关注。
我是 why,一个被代码耽误的文学创作者,不是大佬,但是喜欢分享,是一个又暖又有料的四川好男人。
欢迎关注我的公众号【why技术】,这号主要进行一些技术分享: