注解
本文档介绍了如何通过 Java 注解的方式操作数据库表 amazon_product_variant,实现数据的增删改查。我们将使用 JavaDb 框架中的 ActiveRecord 模块,并借助注解来简化数据库操作。
java-db 核心特性说明.
- 驼峰命名映射 Java 属性如hiResImageUrl自动映射到数据库字段hi_res_image_url
- JSONB 支持 使用 DbJsonObject 类型处理 PostgreSQL 的 JSONB 类型字段
- 注解驱动 使用 @ATableName 明确指定数据库表名 ActiveRecord 支持直接通过实体类进行数据库操作,无需编写 SQL
1.添加依赖
<dependency>
<groupId>com.litongjava</groupId>
<artifactId>tio-boot</artifactId>
<version>${tio-boot.version}</version>
</dependency>
<dependency>
<groupId>com.litongjava</groupId>
<artifactId>java-db</artifactId>
<version>${java-db.version}</version>
</dependency>
2.数据库表结构
-- Table: product_variant (存储产品规格/变体信息)
CREATE TABLE amazon_product_variant (
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. 基础实体类:BaseEntity.java
package com.litongjava.product.model;
import java.sql.Timestamp;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BaseEntity {
private String remark;
private String creator;
private Timestamp createTime;
private String updater;
private Timestamp updateTime;
private Short deleted;
private Long tenantId;
}
2. 核心实体类:ProductVariant.java
package com.litongjava.product.model;
import com.litongjava.db.DbJsonObject;
import com.litongjava.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")
public class ProductVariant extends BaseEntity {
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.单元测试示例
package com.litongjava.product.model;
import java.util.List;
import org.junit.Test;
import com.jfinal.kit.Kv;
import com.litongjava.db.DbJsonObject;
import com.litongjava.db.activerecord.ActiveRecordException;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.product.config.AdminAppConfig;
import com.litongjava.tio.boot.testing.TioBootTest;
import com.litongjava.tio.utils.json.JsonUtils;
import com.litongjava.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, "amazon_product_variant");
// 打印结果
for (ProductVariant productVariant : list) {
System.out.println(productVariant);
// 输出示例:
// ProductVariant(id=540501207345758208, productId=540501207345758208,
// variantId=001,
// hiResImageUrl=url, thumbImageUrl=url, largeImageUrl=url,
// mainImages=DbJsonObject(value={"key": "value"}))
}
}
}
本文档展示了如何使用 Java 注解方式操作数据库表 amazon_product_variant,包括实体类设计、数据保存与查询等操作。通过注解与 JavaDb ActiveRecord 的结合,可以极大简化数据库访问代码,提高开发效率。