java:sqlj2ava的静态字段保护

不论是Thrift RPC还是SpringWeb服务,服务方法的输入和输出参数都要通过网络在Server/Client之间传输。实现数据对象传输,发送端需要对数据对象进行序列化(JSON或二进制数据流),接收端需要对收到的数据反序列化还原为原始的数据对象。

从3.32.0版本开始,sql2java增加了静态字段过滤功能,是指在生成sql2java的数据库表记录对象类时,允许指定字段的可见度(ColumnVisibility)。

sql2java的完整使用示例参见码云仓库: sql2java-example: sql2java调用示例 (gitee.com)

可见度是指字段对数据接收端是否可见,只要控制数据库表对象在序列化/反序列化时忽略不可见字段,数据接收端最终收到数据库对象中就不会包含该字段。

具体实现就是sql2java-generator会根据字段的可见度要求,对于不可见字段,在生成对应字段代码时增加Jackson,Fastjson,Thrift注解(Annotation)指定在表对象序列化/反序列化时忽略该字段。

字段可见度定义

sql2java中字段可见度定义对应枚举类型gu.sql2java.ColumnVisibility

枚举变量 JSON是否可见 Thrift是否可见 说明
DEFAULT true true 默认:全可见
LOCAL false false 仅本地可见,与远端(Spring WEB,Thrift RPC)交互时不可见
THRIFT false true Thrift RPC 传输时可见,Thrft RPC 客户端与服务端交互时可见
JSON true false JSON序列化时可见,Spring WEB 客户端与服务端 交互时可见(Spring WEB是基于jackson实现序列化和反序列化的),使用fastjson对数据库对象进行序列化和反序列化时同样有效。

定义可见度

字段注释标记 SCOPE@@EPOSC 用于定义字段可见度,具体格式为

复制代码
SCOPE@(LOCAL|JSON|THRIFT)@EPOSC

标记中的LOCAL,JSON,THRIFT对应着上述的三种可见度

如下示例,下面的表定义中,private_time字段定义了SCOPE@@EPOSC注释标记,指定了该字段仅本地可见。也就是说只有服务端本身可以读写该字段。

sql 复制代码
CREATE TABLE IF NOT EXISTS dc_device (
  `id`             int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'X@NAME:设备id@X',
  `name`           varchar(32) DEFAULT NULL COMMENT 'X@NAME:设备名称@X,用户指定',
  `physical_address` varchar(32) NOT NULL UNIQUE COMMENT '设备X@NAME:物理地址@X,MAC地址,IMEI或其他设备识别码',
  `private_time`     bigint DEFAULT 0 COMMENT 'SCOPE@LOCAL@EPOSC设备令牌创建的时间戳(毫秒)',
  `os_arch`        varchar(64) DEFAULT NULL COMMENT 'X@NAME:操作系统平台@X,操作系统名称及版本及硬件架构名称,例如:Windows-x86_64,Linux-x86_64,Android-arm...'
) COMMENT 'X@NAME:前端设备记录@X,前端设备基本信息' DEFAULT CHARSET=utf8;

sql2java-generator生成的DeviceBean对象中dc_device.private_time字段的对应成员privateTime定义代码如下:

java 复制代码
    /** comments:设备令牌创建的时间戳(毫秒) */
    @ApiModelProperty(value = "设备令牌创建的时间戳(毫秒)"  ,dataType="Long")
    @CodegenDefaultvalue("0")@CodegenInvalidValue("-1")
    @ExcelColumn(sort=9)
    @com.alibaba.fastjson.annotation.JSONField(serialize = false,deserialize = false)
    @com.fasterxml.jackson.annotation.JsonIgnore
    private Long privateTime;
    /**
     * Getter method for {@link #privateTime}.<br>
     * Meta Data Information (in progress):
     * <ul>
     * <li>full name: dc_device.private_time</li>
     * <li>comments: 设备令牌创建的时间戳(毫秒)</li>
     * <li>default value: '0'</li>
     * <li>column size: 19</li>
     * <li>JDBC type returned by the driver: Types.BIGINT</li>
     * </ul>
     *
     * @return the value of privateTime
     */
    @JsonIgnore
    public Long getPrivateTime(){
        return privateTime;
    }

可以看到,privateTime成员定义的Jackson注解@JsonIgnore和fastjson注解@JSONField指定该字段在JSON序列化和反序列化时忽略应该字段。同时privateTime的getter方法上也没有thrift字段注解@ThriftField,代表应该字段没有被定义为Thrift Struct成员字段。

swift2thrift-maven-plugin插件生成的IDL中就不会有privateTime字段:

idl 复制代码
struct DeviceBean {
  1: required bool _new;
  2: required i32 modified;
  3: required i32 initialized;
  4: optional i32 id;
  5: optional string name;
  6: optional string physicalAddress;
  7: optional string osArch;
}

完整说明

参见 sql2java: 轻量级数据库(SQL)访问代码(java)生成器 (gitee.com) README.md的《静态字段过滤》章节

相关推荐
q***47183 小时前
Spring中的IOC详解
java·后端·spring
vx_vxbs664 小时前
【SSM电影网站】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·小程序·php·idea
SunnyDays10114 小时前
如何使用 Java 删除 Word 文档中的水印
java·删除word文档水印
毕设源码-邱学长5 小时前
【开题答辩全过程】以 基于Java企业人事工资管理系统为例,包含答辩的问题和答案
java·开发语言
转转技术团队5 小时前
回收系统架构演进实战:与Cursor结对扫清系统混沌
java·架构·cursor
AI分享猿5 小时前
Java后端实战:SpringBoot接口遇异常请求,轻量WAF兼顾安全与性能
java·spring boot·安全
稚辉君.MCA_P8_Java5 小时前
Gemini永久会员 Java中的四边形不等式优化
java·后端·算法
DKPT5 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
n***F8755 小时前
修改表字段属性,SQL总结
java·数据库·sql
q***69775 小时前
【Spring Boot】统一数据返回
java·spring boot·后端