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都出来好几年了。

相关推荐
washingtin16 分钟前
Get “https://registry-1.docker.io/v2/“: context deadline exceeded
java·开发语言
一路往蓝-Anbo26 分钟前
C语言从句柄到对象 (七) —— 给对象加把锁:RTOS 环境下的并发安全
java·c语言·开发语言·stm32·单片机·嵌入式硬件·算法
利刃大大36 分钟前
【SpringBoot】validation参数校验 && JWT鉴权实现 && 加密/加盐
java·spring boot·jwt·加密
小北方城市网42 分钟前
第 3 课:前后端全栈联动核心 —— 接口规范 + AJAX + 跨域解决(打通前后端壁垒)
java·大数据·网络·python
降临-max1 小时前
JavaWeb企业级开发---MySQL
java·开发语言·数据库·笔记·后端·mysql
C雨后彩虹1 小时前
二维伞的雨滴效应
java·数据结构·算法·华为·面试
oMcLin1 小时前
Ubuntu 22.04 Docker 容器启动失败:解决 Overlay2 存储驱动冲突
java·ubuntu·docker
Knight_AL1 小时前
深入理解Java中的函数式接口
java·开发语言·python
Chen不旧1 小时前
Java实现三个线程顺序打印
java·开发语言
Ahtacca1 小时前
Redis 五大常用数据类型详解及 Java 客户端(RedisTemplate)操作实战
java·数据库·redis·学习·缓存