码周记(第三期)

提示:可能对很多人来说码周记中的内容比较菜,不喜勿喷!!!

前言:

这两周由于公司项目上线的问题,实在太忙,没有时间写博客。今天正好把上线之前遇到一些问题一起总结了!(感觉自己好菜。。。)

简介

本周想分享以下几个内容:

  1. mysql中的concat和find_in_set
  2. Integer和equals的坑
  3. mybatis中!=’ '的坑
  4. dubbo框架中对象序列化问题
  5. 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,然后用逗号隔开(当然如果满足第三范式的不会有这种问题。。。)

abcompanids
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在判断相等的时候,有很多坑需要注意

  1. 两个自定义出来的integer之间比较,在-128~127之间使用==时可以的,但是超过这个范围就返回false
  2. 如果一个对象的属性是integer类型的话,那么判断这个对象的这个属性值是否等于多少的时候就不能用==了,他别当成了一个对象,比如:MachineStatusEnum.IN_STORE.getCode()==zongsMachineDTO.getMachineStatus()虽然两个值相等,但是还是返回false
  3. 两个new出来的integer之间比较,返回的都是falseInteger 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启动就报错了。。。
在这里插入图片描述
当时我的脑子嗡嗡的,什么鬼?不实现序列化就报错?

我查了一下序列化的作用:

  1. 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
  2. 当你想用套接字在网络上传送对象的时候;
  3. 当你想通过RMI传输对象的时候(远程调用对象,在一个jvm上调用另一个jvm的对象。);

我们在controller层到服务层之间,需要通过一层dubbo,也就是rpc远程调用,这应该是属于RMI传输对象;

问题:这时候是不是应该思考一个问题,前后端之间的时候,对象也没实现序列化啊,为什么不报错呢,理论上前后端交互不是应该属于网络传输对象吗???

Spring帮我们做了什么?

其实我们所思考的问题,spring都帮我们做了。@ResponseBody或者用@RestController,spring会将我们返回的对象转换成json字符串,其实我最开始培训的时候就很奇怪,为什么不引入json包就会报错,然后spring再调用response的getWriter().write()方法返回前端(这一步是我个人猜想,我觉得应该就是这样的),这实际上和序列化没啥区别了,getWriter().write()实际上是采用字节流输出的,而序列化的作用也就是将一个对象转化成为二进制。

五、idea 一个项目多个运行问题

在本地搞集群(boot版本)的时候,想用idea用不同端口运行同一个项目,但是貌似不行
在这里插入图片描述
意思大改就是你把他设置为单例了。。。 把这个√去掉即可!
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值