Long 和 long 的区别

在Java中,Longlong 是两个不同的概念,它们分别代表不同的数据类型:

  1. long

    • 这是一个 基本数据类型 (primitive type)。
    • 它用于存储 64位带符号的整数
    • 它的取值范围是 -9,223,372,036,854,775,8089,223,372,036,854,775,807
    • 在使用 long 类型变量时,你可以直接赋值,例如 long number = 123456789012345678L;,这里的 L 是可选的,用来表明这是一个 long 类型的字面量。
    • long 类型的变量不能为 null
  2. Long

    • 这是一个 包装类 (wrapper class),属于 java.lang 包。
    • 它是 long 类型的基本数据类型的对象形式。
    • Long 类提供了许多静态方法来操作 long 类型的数据,如 parseLong(String s)valueOf(long l)
    • Long 类的对象可以为 null
    • Long 类还实现了 SerializableComparable<Long> 接口,因此可以进行序列化和比较。
    • 使用 Long 类型时,需要进行装箱(boxing)和拆箱(unboxing)。例如,Long value = new Long(123456789012345678L); 或者使用自动装箱 Long value = 123456789012345678L;

使用场景

  • 基本类型 long 通常用于性能敏感的应用场合,因为它们不需要额外的对象开销。
  • 包装类 Long 通常用于需要对象的地方,比如集合框架(如 List, Set, Map 等),或者需要进行空值处理的地方。

示例

// 使用基本类型 long
long primitiveLong = 123456789012345678L;
System.out.println(primitiveLong); // 输出:123456789012345678 // 使用包装类 Long
Long objectLong = new Long(123456789012345678L);
System.out.println(objectLong); // 输出:123456789012345678 // 自动装箱
Long autoBoxedLong = 123456789012345678L;
System.out.println(autoBoxedLong); // 输出:123456789012345678 // 自动拆箱
long autoUnboxedLong = autoBoxedLong;
System.out.println(autoUnboxedLong); // 输出:123456789012345678

总结来说,long 是一个基本类型,主要用于数值计算;而 Longlong 的包装类,主要用于对象操作和需要空值支持的场合。

为什么在Springboot中一般使用Long 而不是long

在 Spring Boot 中,通常使用 Long 而不是 long,主要是出于以下几个方面的考虑:

1. 处理空值的能力

  • Long:作为一个对象类型,Long 可以持有 null 值。这意味着它可以表示数据库中可为空(nullable)的字段。
  • long:作为基本数据类型,long 无法表示 null 值。如果一个字段在数据库中是可以为 NULL 的,使用 long 类型会引发编译错误或运行时异常(如 NullPointerException)。

2. 对象模型的一致性

在面向对象编程中,通常希望所有的属性都是对象类型。使用对象类型 Long 能够保持对象模型的一致性。例如,如果你的实体类中有多个属性,有些可能是字符串、日期等对象类型,使用 Long 能够保持一致性。

3. 框架支持

  • ORM 框架(如 Hibernate 或 JPA):这些框架通常期望实体类中的属性是对象类型,以便于进行对象关系映射(ORM)。使用 Long 可以更方便地与这些框架集成。
  • Spring Data JPA:通常也会建议使用对象类型来表示数据库中的字段,尤其是在涉及到查询和关系映射时。

4. 集合框架的兼容性

Java 的集合框架(如 List, Set, Map)只接受对象类型,不接受基本类型。使用 Long 可以让你更方便地将数据放入集合中。

5. 自动装箱和拆箱

Java 提供了自动装箱和拆箱功能,使得在大多数情况下,使用 Longlong 没有明显的区别。这意味着你可以像使用基本类型一样使用 Long,而不需要显式地进行类型转换。

示例

假设你有一个实体类 User,其中包含一个可能为 NULLid 字段:

package com.guaiguailang.harmony.domain.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id; @Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private String name; // 构造函数、getter 和 setter 省略
}

在这个例子中,id 字段使用 Long 类型,即使它是自动生成的主键。这样做可以方便地处理 null 值,例如在新建用户时,还没有分配主键的情况下。

使用场景

1. 数据库字段为 NULLABLE

如果数据库中的某个字段允许为 NULL,那么使用 Long 类型可以更好地映射这种情形。

2. ORM 框架的要求

在使用 ORM 框架时,如 JPA 或 Hibernate,通常要求实体类中的字段为对象类型。这是因为 ORM 框架需要处理对象的关系映射,而基本类型不支持 null 值,这会导致一些问题。

总结

虽然 long 类型在某些性能敏感的情况下可能会更合适,但在 Spring Boot 应用程序中,为了更好地处理 null 值、支持集合框架以及方便地与 ORM 框架集成,通常会选择使用 Long 类型来对应数据库中的 BIGINT 类型。

总的来说,使用 Long 能够提供更多的灵活性,并且更符合面向对象编程的原则。

MySQL的bigint类型,在java中,用什么数据类型接收最合适

如果你的BIGINT列不允许NULL值,那么使用基本类型long就足够了。

如果你的BIGINT列允许NULL值,那么使用Long包装类更合适,因为它可以持有null值。

总结来说,如果你确定你的业务逻辑不需要处理null值,并且BIGINT列也定义为NOT NULL,则使用long是最简单直接的选择。否则,为了更好地处理潜在的null值,使用Long会更加合适。

在实际开发中,很多框架(如Hibernate、MyBatis等)都支持自动将数据库中的NULL值映射到Java中的null,在这种情况下,使用Long可以简化代码实现。

[AI回答]Java中Long和long的区别,为什么在Springboot项目中一般使用Long的更多相关文章

  1. SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL

    1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...

  2. 自身使用的springboot项目中比较全的pom.xml

    在学习的时候常建新的项目,mark下商用的jar <dependency> <groupId>org.mybatis</groupId> <artifactI ...

  3. SpringBoot项目中遇到的BUG

    1.启动项目的时候报错 1.Error starting ApplicationContext. To display the auto-configuration report re-run you ...

  4. SpringBoot项目中,表单的验证操作

    在创建Springboot项目中,我们使用了表单验证操作,这一操作将极大地简化我们编程的开发 1.接收数据,以及验证 @PostMapping("/save") public Mo ...

  5. springboot项目中使用maven resources

    maven resource 组件可以把pom的变量替换到相关的resouces目录中的资源文件变量 示例项目:内容中心 (文章管理)  生成jar包,生成docker ,生成k8s文件 1.项目结构 ...

  6. 后端分页神器,mybatis pagehelper 在SSM与springboot项目中的使用

    mybatis pagehelper想必大家都耳熟能详了,是java后端用于做分页查询时一款非常好用的分页插件,同时也被人们称为mybatis三剑客之一,下面 就给大家讲讲如何在SSM项目和sprin ...

  7. springboot项目中接口入参的简单校验

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  8. 国际化的实现i18n--错误码国际化以及在springboot项目中使用

    国际化 ,英文叫 internationalization 单词太长 ,又被简称为 i18n(取头取尾中间有18个字母); 主要涉及3个类: Locale用来设置定制的语言和国家代码 Resource ...

  9. 在SpringBoot项目中添加logback的MDC

    在SpringBoot项目中添加logback的MDC     先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...

  10. springboot 项目中获取默认注入的序列化对象 ObjectMapper

    在 springboot 项目中使用 @SpringBootApplication 会自动标记 @EnableAutoConfiguration 在接口中经常需要使用时间类型,Date ,如果想要格式 ...

随机推荐

  1. meltdown 安全漏洞原理是怎么样的?

    Meltdown是2018年初公开的一种严重的计算机安全漏洞,影响了多种处理器,包括英特尔.ARM和某些AMD处理器.其原理基于利用现代CPU的"推测执行"(speculative ...

  2. 2. 王道OS-操作系统的特征,发展和分类

    1. 并发:宏观上是同时发生的,微观是交替发生的 :ps:并行:宏观和微观都是同时发生的 : ps:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行 : 多核CPU同一时刻可以同时执行多个程 ...

  3. 云原生周刊:HashiCorp Vault 1.14 发布 | 2023.6.26

    开源项目推荐 Helmfile Helmfile 是一个开源工具,使用 Helm charts 简化复杂应用程序的部署.它提供了一种声明性的方式来定义 Kubernetes 资源的期望状态,并管理 H ...

  4. Saas多租户数据权限设计(参考RuoYi)

    导航 引子 场景梳理 基于角色的访问控制(RBAC) 多租户系统的权限设计 RuoYi系统的数据权限设计 最终设计方案 参考 本文首发<智客工坊-Saas多租户数据权限设计(参考RuoYi)&g ...

  5. Halcon 快速入门教程

    文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉. 本人水平有限,文章如有问题,欢迎及时指出.如果看完文章有所收获,一定要先点赞后收藏.毕竟,赠人玫瑰,手有余 ...

  6. CMake 生成器表达式---条件表达式和逻辑运算符

    [写在前面] CMake 的生成器表达式用于在构建系统级别上进行条件判断和逻辑运算,它们通常用在目标属性和生成器表达式上下文中.这些表达式允许你根据不同的平台.配置或编译器来定制构建过程. 本文引用的 ...

  7. 今日一学,5道Java基础面试题(附Java面试题及答案整理)

    前言 马上国庆了,本来想着给自己放松一下,刷刷博客,慕然回首,自动拆装箱?equals?==?HashCode? instanceof? 似乎有点模糊了,那就大概看一下5道Java基础面试题吧.好记性 ...

  8. WinDbg符号配置

    符号文件介绍 它包含了应用程序二进制文件(比如:EXE.DLL等)调试信息,专门用来作调试之用,最终生成的可执行文件在运行时并不需要这个符号文件,但你的程序中所有的变量信息都记录在这个文件中.所以调试 ...

  9. 4.2 Linux tar打包命令详解

    Linux 系统中,最常用的归档(打包)命令就是 tar,该命令可以将许多文件一起保存到一个单独的磁带或磁盘中进行归档.不仅如此,该命令还可以从归档文件中还原所需文件,也就是打包的反过程,称为解打包. ...

  10. Nuxt.js 应用中的 webpack:change 事件钩子

    title: Nuxt.js 应用中的 webpack:change 事件钩子 date: 2024/11/24 updated: 2024/11/24 author: cmdragon excerp ...