欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

barRowMapper); System.out.println(bar);} JdbcTem 劳务派遣管理系统 p

点击: 次  来源:宝鼎软件 时间:2017-11-08

原文出处: 徐靖峰

就在最近,项目组开始强调开拓类型了,本日分享一个变量名定名不类型的小案例,强调一下类型的重要性。例子虽小,但却较量有开导意义。

Boolean变量名定名类型

16年底,阿里果真了《Java开拓类型手册》,个中有一条即是“布尔范例不能以is为前缀”。类型中没有举出例子,可是给出了原因:会导致部门序列化框架的无法理会。

看看错误的示范,会导致什么问题,以Spring中的jdbcTemplate来举办尝试。

界说实体类

@Entity
public class Bar {
    @Id
    @GeneratedValue
    private Integer id;
    private Boolean isSuccess;// 留意这是错误的定名
    private boolean isSend;// 留意这是错误的定名
    public Boolean getSuccess() {
        return isSuccess;
    }
    public void setSuccess(Boolean success) {
        isSuccess = success;
    }
    public boolean isSend() {
        return isSend;
    }
    public void setSend(boolean send) {
        isSend = send;
    }
}

个中,isSuccess利用的是包装范例Boolean,而isSend利用的是原生范例boolean,而getter,setter要领是利用Intellij IDEA自动生成的,布尔范例生成getter,setter要领时略微非凡,好比原生范例的getter方法是以is开头的,他们略微有点区别,留意区分。生成getter,setter要领之后,其实已经有点奇怪了,不急,继承下面的尝试。

在数据库中,isSuccess被映射了is_success,isSend被映射成了is_send,这切合我们的预期。而且为了后续的尝试,我们事先筹备一笔记录,用于后续的查询,在mysql的方言中,布尔范例被默认自动映射成byte,1代表ture,0代表false。

id is_success is_send
1 1 1

利用JdbcTemplate查询

public void test(String id) {
    RowMapper<Bar> barRowMapper = new BeanPropertyRowMapper<Bar>(Bar.class);
    Bar bar = jdbcTemplate.queryForObject("select * from bar where id = ?", new Object[]{id}, barRowMapper);
    System.out.println(bar);
}

JdbcTemplate提供了BeanPropertyRowMapper完成数据库到实体类的映射,事先我重写了Bar类的toString要领,挪用test(1)看看是否能乐成映射。功效如下:

Bar{id=1, isSuccess=null, isSend=false}

数据库中是实际存在这样的字段,而且值都是true,而利用JdbcTemplate,却查询不到这样的问题,这边是不遵循类型导致的问题。

相信这个例子可以让各人越发加深映像,出格是在维护老旧代码时,假如发明有is开头的boolean值,需要特别地留意。

包装范例与原生范例

在回首一下上述的demo,原生范例和包装范例都没有封装乐成,isSuccess获得了一个null值,劳务派遣管理系统,isSend获得了一个false值。后者足够引起我们的鉴戒,假如说前者会引起一个NullPointerExcepiton导致措施异常,还可以引起开拓者的留意,尔后者很有大概一直作为一个埋没的bug,不被人所察觉,因为boolean的默认值为false。

在类变量中,也普遍倡导利用包装范例,而原生范例的不敷之处是很明明的。以Integer num;字段为例,num=null代表的寄义是num字段未被生存,未界说;而num=0代表的寄义是明晰的,数量为0。原生范例的表达本领有限。所以倡导在局部浸染域的计较中利用原生范例,而在类变量中利用包装范例。

JavaBean类型

如今的微处事的时代,都是在聊架构,聊容器编排,竟然尚有人聊JavaBean,但既然说到了类型,顺带提下。

先来做个选择题,以下选项中切合JavaBean定名类型的有哪些?:

A : ebook
B : eBook
C : Ebook
D : EBook

正确谜底是:A,D

怎么样,切合你的预想吗?JavaBean类型并不是像许多人想的那样,首字母小写,之后的每一个单词首字母大写这样的驼峰定名法。正确的定名类型应该是:要么前两个字母都是小写,要么前两个字母都是大写。因为英文单词中有URL,USA这样牢靠形式的大写词汇,所以才有了这样的类型。出格鉴戒B那种形式,一些诸如sNo,eBook,eMail,cId这样的定名,都是不类型的。

由此引申出了getter,setter定名的类型,除了第一节中Boolean范例的特例之外,网上尚有不上文章,强调了这样的观念:eBook对应的getter,setter该当为geteBook(),seteBook(),即当类变量的首字母是小写,而第二个字母是大写时,生成的getter,setter该当是(get/set)+类变量名。但上面已经先容过了,eBook这样的变量定名自己就是不类型的,在不类型的变量定名下强调类型的getter,setter定名,出发点就错了。有乐趣的伴侣可以在eclipse,intellij idea中试试,这几种类型,不类型的变量定名,各自对应的getter,昆山软件公司,setter要领是如何的。别的需要知晓一点,IDE提供的自动生成getter,setter的机制,以及lombok这类框架的机制,都是由默认的配置,在与其他反射框架共同利用时,只有两边都遵循类型,才气够共同利用,而不能笃信框架。这一点上,有部门国产的框架做的并不是很好。