Entity SQL 是一个轻量级的 Java ORM 工具库,旨在简化数据库操作,提供基于注解的实体映射和链式编程的 SQL 构建方式,快速构建单表维护和数据可视化界面。
- 一键生成单表维护界面AI项目
这是一个基于Spring Boot和AI技术的一键生成单表维护界面的应用。用户只需描述业务需求,系统会自动分析需求并生成相应的Java实体类和Web界面。
- 基于注解的实体类与数据库表映射
- 支持主键自动生成(UUID)
- 字段级别的详细配置(展示、编辑、搜索等)
- 链式编程 API,易于使用和理解
- 支持常见的 CRUD 操作
- 自动处理 SQL 注入防护
- 支持分页查询
- 多种条件查询(等于、模糊匹配、范围查询等)
- 灵活的数据源配置
- 自动连接管理和释放
- 自动处理 Java 对象与数据库类型之间的转换
- 支持常见的数据类型(String、Integer、Date、BigDecimal 等) Table.java
- @Table: 标注实体类对应的表名
- @Column: 配置字段属性(类型、长度、展示方式等)
- @Key: 标识主键字段及生成策略
- @View: 配置字段的展示属性
- @Edit: 配置字段的编辑属性
- @Search: 配置字段的搜索属性
- SQL: 静态方法入口,用于构建各种 SQL 语句
- SQL.query(): 构建查询语句
- SQL.update(): 构建更新语句
- SQL.insert(): 构建插入语句
- SQL.delete(): 构建删除语句
- SQL.createTable(): 构建建表语句
- SQL.dropTable(): 构建删表语句
- SQL.isTableExists(): 检查表是否存在
- Entity: 针对实体对象的操作入口
- Entity.insertOrUpdate(): 插入或更新实体
- Entity.query(): 查询实体列表
- Entity.grtById(): 根据主键获取实体
- Entity.deleteById(): 根据主键删除实体
增加 JitPack 仓库
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories><dependency>
<groupId>com.gitee.wb04307201.entity-sql</groupId>
<artifactId>entity-sql-spring-boot-starter</artifactId>
<version>1.4.3</version>
</dependency> if (dataSourceHelper.execute(SQL.isTableExists(User.class))) {
dataSourceHelper.execute(SQL.dropTable(User.class));
}
dataSourceHelper.execute(SQL.createTable(User.class));
int count = dataSourceHelper.execute(SQL.insert(User.class).set(User::getId, "11111").set(User::getUserName, "11111"));
Assertions.assertEquals(count, 1);
count = dataSourceHelper.execute(SQL.update(User.class).set(User::getUserName, "11111+++").eq(User::getId, "11111"));
Assertions.assertEquals(count, 1);
IntStream.range(0, 10).forEach(i -> {
dataSourceHelper.execute(SQL.insert(User.class).set(User::getId, UUID.randomUUID()).set(User::getUserName, UUID.randomUUID()));
});
List<User> userList = dataSourceHelper.execute(SQL.query(User.class));
Assertions.assertEquals(userList.size(), 11);
count = dataSourceHelper.execute(SQL.delete(User.class).eq(User::getId, "11111"));
userList = dataSourceHelper.execute(SQL.query(User.class));
Assertions.assertEquals(userList.size(), 10);
count = dataSourceHelper.execute(SQL.delete(User.class).isNotNull(User::getUserName));
Assertions.assertEquals(count, 10);
userList = dataSourceHelper.execute(SQL.query(User.class).page(0,1));
Assertions.assertEquals(userList.size(), 1);先创建一个类
package cn.wubo.entity.sql;
import cn.wubo.entity.sql.core.annotations.*;
import cn.wubo.entity.sql.core.enums.ColumnType;
import cn.wubo.entity.sql.core.enums.EditType;
import lombok.Data;
import java.time.LocalDate;
@Data
@Table(value = "test_user", init = true)
public class User {
@Key
@Column(value = "id",key = @Key(isKey = true))
private String id;
@Column(value = "user_name", label = "用户名", type = ColumnType.VARCHAR, length = 20, edit = @Edit(required = true),search = @Search(searchable = true))
private String userName;
@Column(value = "department", label = "部门",
items = {@Item(value = "1", label = "部门1"), @Item(value = "2", label = "部门2"), @Item(value = "3", label = "部门3")},
view = @View(width = 300),
edit = @Edit(type = EditType.SELECT),
search = @Search(searchable = true))
private String department;
@Column(value = "birth", label = "生日", type = ColumnType.DATE,edit = @Edit(type = EditType.DATE))
private LocalDate birth;
@Column(value = "age", label = "年龄", type = ColumnType.NUMBER, precision = 10, scale = 0,edit = @Edit(type = EditType.NUMBER))
private Integer age;
@Column(value = "amount", label = "薪酬", type = ColumnType.NUMBER, precision = 10, scale = 2,edit = @Edit(type = EditType.NUMBER))
private Float amount;
@Column(value = "status", label = "在职", type = ColumnType.VARCHAR, length = 1,
items = {@Item(value = "Y", label = "在职"), @Item(value = "N", label = "离职")},
view = @View(),
edit = @Edit(type = EditType.CHECKBOX)
)
private String status;
}使用
if (dataSourceHelper.execute(SQL.isTableExists(User.class))) {
dataSourceHelper.execute(SQL.dropTable(User.class));
}
dataSourceHelper.execute(SQL.createTable(User.class));
User user = new User();
user.setUserName("99999");
user.setBirth(LocalDate.now());
dataSourceHelper.execute(Entity.insertOrUpdate(user));
user.setUserName("99999+");
dataSourceHelper.execute(Entity.insertOrUpdate(user));
User user1 = dataSourceHelper.execute(Entity.grtById(user));
Assertions.assertEquals(user1.getUserName(), "99999+");
List<User> userList = dataSourceHelper.execute(Entity.query(new User()));
Assertions.assertEquals(userList.size(), 1);
Integer count = dataSourceHelper.execute(Entity.deleteById(user));
Assertions.assertEquals(count, 1);
userList = dataSourceHelper.execute(Entity.query(new User()));
Assertions.assertEquals(userList.size(), 0);@Component
public class AppReadyListener implements ApplicationRunner {
private final EntityWebService entityWebService;
@Autowired
public AppReadyListener(EntityWebService entityWebService) {
this.entityWebService = entityWebService;
}
@Override
public void run(ApplicationArguments args) throws Exception {
// user 为页面访问标识,多个界面注意标识不要重复
entityWebService.build("user", User.class);
}
}http://ip:port/entity/view/user
单表维护
绘制图表

