java14 record

文章目录

  Java14新推出的record关键字确实让人耳目一新,减少了大量数据类的代码。在写实体类的时候,set方法和get方法,虽然可以用lombok自动生成,但毕竟不是官方的实现。现在有了官方实现就不一样了。

语法

  语法上,record是一种类型,跟枚举一样,是被严格限制的类型,下面是一个简单的record:

java 复制代码
public record House(String building, String unit, String number) {
}

  创建和读取属性的语法如下:

java 复制代码
public class RecordDemo {

    public static void main(String[] args) {
        House house = new House("3栋", "一单元", "1508");
        System.out.println(house.building());
        System.out.println(house.unit());
        System.out.println(house.number());
    }
}

  Record的所有属性都是只读的,而且类型体里面只能定义静态字段。我比较关心的是能不能与现有的框架集成。

JSON序列化/反序列化

  spring默认的json序列化实现是Jackson,那么看看Jackson能不能record。先写代码试试吧:

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version> <!-- 请替换为最新的版本号 -->
</dependency>
java 复制代码
public static void main(String[] args) {
    House house = new House("3栋", "一单元", "1508");
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        String jsonString = objectMapper.writeValueAsString(house);
        System.out.println(jsonString);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
}

  结果表明是支持的:

shell 复制代码
{"building":"3栋","unit":"一单元","number":"1508"}

  那么反序列化呢?

java 复制代码
public class RecordDeserializeDemo {
    public static void main(String[] args) throws IOException {
        String s = """
                {"building":"3栋","unit":"一单元","number":"1508"}
                """;
        ObjectMapper objectMapper = new ObjectMapper();
        House house = objectMapper.readerFor(House.class).readValue(s, House.class);
        System.out.println(house);
    }
}

  反序列化也是支持的:

shell 复制代码
House[building=3栋, unit=一单元, number=1508]

  国产框架fastjson,从2.0.3才开始支持Java 14record的。

mybatis支持情况

  那就写一个demo测试一下呗。首先加上pom.xml配置:

xml 复制代码
<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>


        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.3.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>

  然后加上yml配置:

yml 复制代码
# 数据源
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8

  最后写一个简单的mapper类:

java 复制代码
public interface HouseMapper {

    @Select("select '7栋' as building, '一单元' as unit, '901' as number")
    House select();
}

  然后写个main函数就可以测试了:

java 复制代码
@SpringBootApplication
@MapperScan
public class MyBatisDemo {

    @Autowired
    private HouseMapper houseMapper;
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MyBatisDemo.class);
        MyBatisDemo bean = context.getBean(MyBatisDemo.class);
        House house = bean.houseMapper.select();
        System.out.println(house);
    }
}

  测试结果表明mybatis是支持record的。其他的框架,比如spring webmvc我没去尝试,但是我觉得肯定是会支持的,比较java14都出来好几年了。

相关推荐
wdfk_prog24 分钟前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
卓怡学长33 分钟前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
这个DBA有点耶3 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
csdn2015_4 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky4 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
云云只是个程序马喽6 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
C137的本贾尼7 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
Flittly7 小时前
【AgentScope Java新手村系列】(19)多模态-图像音频视频
java·spring boot·spring
Javatutouhouduan7 小时前
国内大厂Java面试高频题库(2026突击版)
java·架构师·java面试·java面试题·后端开发·java程序员·java八股文
Tim_107 小时前
【C++】017、new/delete与malloc/free的区别
java·数据结构·算法