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

相关推荐
小筱在线6 分钟前
SpringCloud微服务实现服务熔断的实践指南
java·spring cloud·微服务
luoluoal10 分钟前
java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)
java·vue.js·spring boot
ChinaRainbowSea16 分钟前
十三,Spring Boot 中注入 Servlet,Filter,Listener
java·spring boot·spring·servlet·web
小游鱼KF19 分钟前
Spring学习前置知识
java·学习·spring
扎克begod23 分钟前
JAVA并发编程系列(9)CyclicBarrier循环屏障原理分析
java·开发语言·python
青灯文案124 分钟前
SpringBoot 项目统一 API 响应结果封装示例
java·spring boot·后端
我就是程序猿34 分钟前
tomcat的配置
java·tomcat
阳光阿盖尔40 分钟前
EasyExcel的基本使用——Java导入Excel数据
java·开发语言·excel
二十雨辰41 分钟前
[苍穹外卖]-12Apache POI入门与实战
java·spring boot·mybatis
程序员皮皮林42 分钟前
开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)
java·pdf·开源·apache