前言:
这两周由于公司项目上线的问题,实在太忙,没有时间写博客。今天正好把上线之前遇到一些问题一起总结了!(感觉自己好菜。。。)
简介
本周想分享以下几个内容:
- mysql中的concat和find_in_set
- Integer和equals的坑
- mybatis中!=’ '的坑
- dubbo框架中对象序列化问题
- idea 一个项目多个运行问题
一、mysql中的concat和find_in_set
1、mysql中的concat:
这个函数用于字符串拼接,用的最多的地方应该是like模糊查询拼接吧,这里需要扩展一下,如果使用like模糊查询没有用到索引的话,建议使用instr(字段,值)>0,这样效率更高;
在oracle中,如果三个字符串拼接的话,需要使用两次concat函数,即:concat(cancat(字符串1,字符串2),字符串3),可是在mysql中,则只要写一个就行,即:cancat(字符串1,字符串2,字符串3)
2、mysql中的find_in_set:
我想应该很多人和我一样,第一次接触mysql中的这个函数,我们有没有遇到过这种场景,一个字段里面存了N个字段的值,然后用逗号隔开,即:companids存了他所有的公司id,然后用逗号隔开(当然如果满足第三范式的不会有这种问题。。。)
a | b | companids |
---|---|---|
1 | 小明 | 123,124,125 |
2 | 小红 | 12,13,14 |
如果需找出含有companid为12公司的老板,你会怎么查?如果用模糊查询,那小明是不是也会被查出来,但是小明并没有这个公司啊。
SELECT * FROM test_d where companids like '%12%';
SELECT * FROM test_d where instr(companids,'12')>0
如果使用find_in_set函数就能轻松解决这个问题:
SELECT * FROM test_d where find_in_set('12',companids)
二、Integer和equals的坑
1、Integer: Integer在判断相等的时候,有很多坑需要注意
- 两个自定义出来的integer之间比较,在-128~127之间使用==时可以的,但是超过这个范围就返回false
- 如果一个对象的属性是integer类型的话,那么判断这个对象的这个属性值是否等于多少的时候就不能用==了,他别当成了一个对象,比如:
MachineStatusEnum.IN_STORE.getCode()==zongsMachineDTO.getMachineStatus()
虽然两个值相等,但是还是返回false - 两个new出来的integer之间比较,返回的都是false
Integer i3=new Integer(12); Integer i4=new Integer(12);
2、equals: 这个东西就更加坑了。。。两个不相等的类型在比较的时候不会报编译错误(可能这也是为自己粗心在找借口吧。。。)
场景: 在判断一个状态是否一个枚举中的code相等的时候,枚举没有调用getCode方法,导致产生了bug
quarterRentBill.getQuarterBillStatus().equals(QuarterBillStatusEnum.UN_PAY)
分析: 这个代码,在当时脑子嗡嗡的时候,是真的找不出错误,直到把日志打出来,才发现,我一个integer在和一个枚举equals。。。
三、mybatis中!=’ '的坑
可能是我上家公司用习惯了String,所有字段数据库都是varchar,java对象都是String,虽然这种写法,可以避免不少问题,但是对于数据库开销和查询速度来说,极度下降;然而用了Integer,Long这种来修饰id之后,出现了mybatis判断问题,就是!=‘’的问题,我们在一般String类型属性update的时候都是判断一下!=null and!=‘’,然后进行更新,但是在Integer,Long修饰的属性再判断!=‘’的话,这辈子都是不会进去的
四、dubbo框架中对象序列化问题
第一次使用dubbo的我,建一个bean之后没有实现序列化,然后dubbo启动就报错了。。。
当时我的脑子嗡嗡的,什么鬼?不实现序列化就报错?
我查了一下序列化的作用:
- 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
- 当你想用套接字在网络上传送对象的时候;
- 当你想通过RMI传输对象的时候(远程调用对象,在一个jvm上调用另一个jvm的对象。);
我们在controller层到服务层之间,需要通过一层dubbo,也就是rpc远程调用,这应该是属于RMI传输对象;
问题:这时候是不是应该思考一个问题,前后端之间的时候,对象也没实现序列化啊,为什么不报错呢,理论上前后端交互不是应该属于网络传输对象吗???
Spring帮我们做了什么?
其实我们所思考的问题,spring都帮我们做了。@ResponseBody或者用@RestController,spring会将我们返回的对象转换成json字符串,其实我最开始培训的时候就很奇怪,为什么不引入json包就会报错,然后spring再调用response的getWriter().write()方法返回前端(这一步是我个人猜想,我觉得应该就是这样的),这实际上和序列化没啥区别了,getWriter().write()实际上是采用字节流输出的,而序列化的作用也就是将一个对象转化成为二进制。
五、idea 一个项目多个运行问题
在本地搞集群(boot版本)的时候,想用idea用不同端口运行同一个项目,但是貌似不行
意思大改就是你把他设置为单例了。。。 把这个√去掉即可!