Skip to content

注解 ​

本文档介绍了如何通过 Java 注解的方式操作数据库表 amazon_product_variant_example_table,实现数据的增删改查。我们将使用 JavaDb 框架中的 ActiveRecord 模块,并借助注解来简化数据库操作。

java-db 核心特性说明.

  • 驼峰命名映射 Java 属性如hiResImageUrl自动映射到数据库字段hi_res_image_url
  • JSONB 支持 使用 DbJsonObject 类型处理 PostgreSQL 的 JSONB 类型字段
  • 注解驱动 使用 @ATableName 明确指定数据库表名 ActiveRecord 支持直接通过实体类进行数据库操作,无需编写 SQL

1.添加依赖 ​

xml
    <dependency>
      <groupId>nexus.io</groupId>
      <artifactId>tio-boot</artifactId>
      <version>${tio-boot.version}</version>
    </dependency>

    <dependency>
      <groupId>nexus.io</groupId>
      <artifactId>java-db</artifactId>
      <version>${java-db.version}</version>
    </dependency>

2.数据库表结构 ​

sql
-- Table: product_variant (存储产品规格/变体信息)
drop table if exists amazon_product_variant_example_table;
CREATE TABLE amazon_product_variant_example_table (
    id bigint PRIMARY KEY,
    product_id BIGINT NOT NULL,
    variant_id VARCHAR(64) NOT NULL, -- 如 PT01, PT02, MAIN 等 (来自 variant 字段)
    hi_res_image_url TEXT, -- hiRes
    thumb_image_url TEXT, -- thumb
    large_image_url TEXT, -- large
    -- 可以考虑将 main 中的尺寸和 URL 存储为 JSONB 或者单独的列
    main_images JSONB, -- 存储 main 对象中的所有尺寸和 URL
    remark VARCHAR(256) COLLATE "pg_catalog"."default",
    creator VARCHAR(64) COLLATE "pg_catalog"."default" DEFAULT ''::CHARACTER VARYING,
    create_time TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updater VARCHAR(64) COLLATE "pg_catalog"."default" DEFAULT ''::CHARACTER VARYING,
    update_time TIMESTAMPTZ(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    deleted SMALLINT DEFAULT 0,
    tenant_id BIGINT NOT NULL DEFAULT 0,
    UNIQUE(product_id, variant_id) -- 确保同一产品下 variant_id 唯一
);

3.Java 实体类设计 ​

1. 基础实体类:DbBaseEntity.java ​

DbBaseEntity 是java-db内置的类,代码如下,自己编写的实体类直接继承即可,无需重复编写

java
package nexus.io.db.activerecord.model;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DbBaseEntity {
  private String remark;

  private String creator;
  private String updater;
  private java.sql.Timestamp createTime;
  private java.sql.Timestamp updateTime;

  private Short deleted;

  private Long tenantId;

  public String getBaseInfo() {
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append("(")
        //
        .append("remark=" + remark).append(",creator=" + creator).append(",updater=" + updater)
        //
        .append(",createTime=" + createTime).append(",updateTime=" + updateTime)
        //
        .append(",deleted=" + deleted).append(",tenantId=" + tenantId)
        //
        .append(")");

    return stringBuffer.toString();
  }
}

2. 核心实体类:ProductVariant.java ​

java
package nexus.io.product.model;

import nexus.io.db.DbJsonObject;
import nexus.io.db.activerecord.model.DbBaseEntity;
import nexus.io.db.annotation.ATableName;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ATableName("amazon_product_variant_example_table")
public class ProductVariant extends DbBaseEntity {

  private Long id;

  private Long productId;

  private String variantId;

  private String hiResImageUrl;

  private String thumbImageUrl;

  private String largeImageUrl;

  private DbJsonObject mainImages;
}

说明:

  • 使用 @ATableName 注解指定实体类对应的数据库表名。
  • 使用 Lombok 注解简化 Getter、Setter、构造函数等代码。
  • DbJsonObject 是一个用于处理 JSON 字段的封装类,适用于 PostgreSQL 的 JSONB 类型字段。

4.单元测试示例 ​

java
package nexus.io.product.model;

import java.util.List;

import org.junit.Test;

import com.jfinal.kit.Kv;
import nexus.io.db.DbJsonObject;
import nexus.io.db.activerecord.ActiveRecordException;
import nexus.io.db.activerecord.Db;
import nexus.io.db.activerecord.Row;
import nexus.io.product.config.AdminAppConfig;
import nexus.io.tio.boot.testing.TioBootTest;
import nexus.io.tio.utils.json.JsonUtils;
import nexus.io.tio.utils.snowflake.SnowflakeIdUtils;

public class ProductVariantTest {

  @Test
  public void testSave() {
    // 启动应用上下文
    TioBootTest.runWith(AdminAppConfig.class);

    // 构建 JSON 数据
    Kv kv = Kv.by("key", "value");
    String json = JsonUtils.toJson(kv);

    // 创建实体对象
    long id = SnowflakeIdUtils.id();
    ProductVariant productVariant = new ProductVariant().setId(id).setProductId(id).setVariantId("001")
        .setHiResImageUrl("url").setThumbImageUrl("url").setLargeImageUrl("url").setMainImages(new DbJsonObject(json));

    // 转换为 Row 并保存
    try {
      Db.save(Row.fromBean(productVariant));
    } catch (ActiveRecordException e) {
      e.printStackTrace();
    }
  }

  @Test
  public void testSelect() {
    // 启动应用上下文
    TioBootTest.runWith(AdminAppConfig.class);

    // 查询所有记录
    List<ProductVariant> list = Db.findAll(ProductVariant.class);

    // 打印结果
    for (ProductVariant productVariant : list) {
      System.out.println(productVariant);
      String baseInfo = productVariant.getBaseInfo();
      System.out.println(baseInfo);
    }
  }

}

查询输出

ProductVariant(id=540535090256961536, productId=540535090256961536, variantId=001, hiResImageUrl=url, thumbImageUrl=url, largeImageUrl=url, mainImages=DbJsonObject(value={"key": "value"}))
(remark=null,creator=,updater=,createTime=2025-07-30 22:13:30.027316,updateTime=2025-07-30 22:13:30.027316,deleted=0,tenantId=0)

本文档展示了如何使用 Java 注解方式操作数据库表 amazon_product_variant_example_table,包括实体类设计、数据保存与查询等操作。通过注解与 JavaDb ActiveRecord 的结合,可以极大简化数据库访问代码,提高开发效率。