关于java程序设计的一点感悟

1:可扩展性越强越好,虽然有可能会影响一点点性能。

我一直觉得hibernate比mybatis好用,因为它是真正O/R框架,你做的操作真的可以只操作对象,mybatis不行,mybatis自己写sql配置文件,相当于摈弃了java中一个很牛逼的功能,反射,从而导致在程序中,mybatis的可扩展性很差。

1)比如我的字段名字改变。hibernate的hql 可以保证from entity这里不需要做任何修改,mybatis必须修改sql配置文件。

2)比如我新增了一个字段,同样的道理,mybatis每次都需要做一些简单,但是繁琐的修改,可扩展极差。

能将对象的字段全部查出来,就全部查出来,当然是用反射的方式,自己写sql我是不建议的。因为写sql面临就是和mybatis一样的问题,如果字段名字修改了,或者实体新增了字段,那么修改起来是很枯燥乏味的。(现实中就是产品的迭代过程,经常伴随着字段的修改,添加,甚至是删除,如果实体中字段不变,这样的项目我还没有遇到过)


2:写程序前面的逻辑,不要影响到后面的逻辑

我现在正在做的项目,有这样一个场景,航空公司的订单表Order关联了乘机人表Passenger,同时Order还关联了航段表Flight,如果乘机人中既有成人,又有儿童,那么需要将一个订单一分为二,成人一个订单,儿童一个订单.

最初,我在Passenger中设计了一个isDelete字段,用于判断,这个乘机人是否已经被拆单了。

因为我的项目是用的hibernate,查询的时候Order关联passenger级联查询的,每次都将isDelete=true的订单查询出来了,而当我用order.passengers.size()的时候,还得现将isDelete=true的先去掉。

而且我觉得后面做报表统计的人,如果不知道这里有个isDelete字段有这个作用,统计人数的时候,人数还得统计错,最后,我就将拆单的逻辑删除改成物理删除了,效果奇好,后面的流程再也不会受影响了。


3:最近做项目关于初始值设置有点感悟

场景是这样的,我的项目中有个字符串字段表示的时间。如果初始值不设置,在sqlserver数据库中是一种很特别的NULL,如果在java中设置会java中的null,在Sqlserver数据库中会是加斜的NULL,(sqlserver也是坑),如果是字符串NULL,在sqlserver中表现出的是带单引号的NULL。

问题来了,我需要用到这个字段来排序,我发现,sqlserver中的这个三个NULL,和一般的时间字符串“2016-01-01”比较的时候,有的比“2016-01-01”大,有的比它小。

于是我就在每条记录插入的时候,给这个字段附初始值,初始值是字符串NULL,在sqlserver中表现为带单引号的。因为我发现字符串的NULL和正常时间字符串做比较是,刚好比正常字符串大,这个也是我想要的排序效果,

我这样设计之后,问题又来,这个字段是可以修改的,修改的时候又有可能将它修改成java中的null,所以最后在我的数据中又存在3种格式的数据,排序的时候又出问题了。

最后,我将这个字段的初始值设置为java中null,或者设置为正常的时间可是字符串。(设置为一个很大的时间格式字符串),因为我需要将NULL的排序大最后,最后我用的“9999-12-31”,然后排序的时候,数据库只有2中格式的数据。

然后用case when,如果是java中的null格式,我将它变成“9999-12-31”,排序问题最终解决。


注:上面这个表明,即使给字段附初始值的时候,也是需要好好设计考虑的。

最经典的就是java中public boolean method()与public Boolean method()那个好的问题。(推荐用小写的boolean)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值