xbatis-ddl-auto:轻量自动建表工具,功能丰富且安全有保障!

发布时间:2026/8/25 11:57:02

xbatis-ddl-auto:轻量自动建表工具,功能丰富且安全有保障!
xbatis-ddl-auto简介xbatis-ddl-auto是一个基于xbatis实体元数据的轻量自动建表工具。它复用xbatis的 Table、TableId、TableField、ColumnDefinition等注解解析结果根据实体类生成并执行数据库DDL提供接近JPA ddl-autocreate/update的使用体验但不引入JPA或Hibernate。功能特性它具有以下功能根据xbatis实体生成 CREATE TABLE SQL表不存在时自动建表表存在时可在 UPDATE 模式下自动追加新增字段支持只生成SQL不执行数据库操作通过JDBC DatabaseMetaData 判断表、字段和索引是否存在支持常见Java类型到数据库列类型映射支持 ColumnDefinition 配置字段长度、精度、小数位、默认值、唯一约束、非空和字段注释支持类级 Index 创建普通索引和唯一索引。安全边界UPDATE 模式只会自动新增字段和缺失索引不会自动执行以下高风险操作删除数据库已有字段、修改字段类型、修改字段长度、修改字段是否可空、修改默认值、重命名字段、修改或删除已有索引、删除或重建表。这些操作可能造成数据丢失或生产事故建议通过人工审核SQL或专业迁移工具处理。Maven坐标本工具Maven坐标为cn.xbatisxbatis-ddl-auto1.0.1 运行依赖xbatis corecn.xbatisxbatis-core1.10.6 默认测试使用JUnit 5和H2需要真实数据库的集成测试通过Maven profile单独执行。快速开始首先定义xbatis实体示例如下import cn.xbatis.db.annotations.ColumnDefinition;import cn.xbatis.db.annotations.Table;import cn.xbatis.db.annotations.TableId;import java.math.BigDecimal;import java.time.LocalDateTime;Table(sys_user)public class SysUser { TableId private Long id; ColumnDefinition(length 64, nullable false) private String username; ColumnDefinition(precision 10, scale 2, defaultValue 0) private BigDecimal balance; private LocalDateTime createdAt;}然后执行自动建表import db.sql.api.DbType;DDLAuto.of(DbType.MYSQL).add(SysUser.class).execute(dataSource);CREATE模式CREATE 是默认模式执行方式为DDLAuto.of(DbType.MYSQL).add(SysUser.class).execute(dataSource);其行为是表不存在时执行 CREATE TABLE表已存在时跳过不做任何变更。UPDATE模式UPDATE 模式用于补新增字段和缺失索引执行方式为import cn.xbatis.ddl.auto.Mode;DDLAuto.of(DbType.MYSQL).mode(Mode.UPDATE).add(SysUser.class).execute(dataSource);其行为是表不存在时执行 CREATE TABLE表已存在时读取数据库已有列和索引只对实体中新增的字段执行 ALTER TABLE ... ADD COLUMN ...并创建缺失索引。重复执行 UPDATE 模式不会重复添加已存在字段或已存在索引。只生成SQL/预览SQL不连接数据库只生成建表SQL的方式为List sqlList DDLAuto.of(DbType.PGSQL).add(SysUser.class).sqlList();如果要按当前数据库状态预览将要执行的SQL可以传入 DataSource 或 Connection。该方法只读取JDBC元数据并生成SQL不会执行DDLList sqlList DDLAuto.of(DbType.MYSQL).mode(Mode.UPDATE).add(SysUser.class).sqlList(dataSource);其行为是表不存在时返回 CREATE TABLE 及附属DDL表已存在且是 CREATE 模式时返回空列表表已存在且是 UPDATE 模式时只返回缺失字段的 ALTER TABLE ... ADD COLUMN ... 及附属DDL以及缺失索引的 CREATE INDEX。也可以使用底层构建器生成单个字段的新增列SQLimport cn.xbatis.ddl.auto.DDLBuilder;import cn.xbatis.ddl.auto.DefaultDDLBuilder;DDLBuilder builder new DefaultDDLBuilder();String sql builder.addColumnSql(DbType.MYSQL, SysUser.class, email);生产或准生产环境建议先通过 sqlList(dataSource) 或 sqlList(connection) 生成SQL并审核再决定是否执行。执行监听DDL会按SQL列表逐条执行。若中途失败数据库可能已经保留前面成功执行的DDL。可以配置执行监听器记录已执行SQLimport cn.xbatis.ddl.auto.Mode;import cn.xbatis.ddl.auto.DDLExecutionListener;import java.util.ArrayList;import java.util.List;List executedSqlLog new ArrayList();DDLAuto.of(DbType.MYSQL).mode(Mode.UPDATE).executionListener(new DDLExecutionListener() { Override public void afterExecute(String sql, List executedSqlList) { executedSqlLog.add(sql); } Override public void onExecuteError(String sql, SQLException exception, List executedSqlList) { // sql为当前失败SQLexecutedSqlList为失败前已成功执行的SQL。 }}).add(SysUser.class).execute(dataSource);生产或准生产环境建议先通过 sqlList(dataSource) 或 sqlList(connection) 生成SQL并审核再决定是否执行。执行失败时抛出的 SQLException 消息也会包含当前失败SQL和失败前已执行SQL。支持的注解Table用于解析表名和schema示例如下Table(sys_user)public class SysUser {}TableId用于识别主键和数据库自增示例如下TableIdprivate Long id;默认自增类型为xbatis的 IdAutoType.AUTO。单主键会按数据库方言生成自增片段联合主键不会为每个主键字段自动生成自增片段。如果主键使用 IdAutoType.SQL 通过数据库序列取值会从 sql 中解析序列名并在建表前生成 CREATE SEQUENCETableId(dbType DbType.Name.PGSQL, value IdAutoType.SQL, sql select nextval(id_test_id_seq))TableId(dbType DbType.Name.ORACLE, value IdAutoType.SQL, sql select id_test_seq.NEXTVAL FROM dual)TableId(dbType DbType.Name.SQL_SERVER, value IdAutoType.SQL, sql select next value for id_test_sqlserver_seq)TableId(dbType DbType.Name.DB2, value IdAutoType.SQL, sql select next value for id_test_db2_seq from sysibm.sysdummy1)private Long id;当前支持解析PostgreSQLnextval(sequence_name)Oracle / DMsequence_name.NEXTVALSQL Server / DB2NEXT VALUE FOR sequence_name其他数据库兜底解析上述常见形式并生成通用序列DDLCREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;UPDATE 模式会读取数据库已有序列只创建缺失序列不重复创建。ColumnDefinition用于控制建表字段定义示例如下ColumnDefinition( length 64, nullable false, unique true, comment 用户名)private String username;常用配置有length字符串长度、precision数值精度、scale小数位数、defaultValue数据库默认值SQL片段、nullable是否允许为空、unique是否唯一、definition字段类型片段配置后优先替代Java类型到数据库类型的自动推导length、precision、scale、defaultValue、nullable、unique、comment 等其他配置仍会继续生效、comment字段注释MySQL使用列内联 COMMENTPostgreSQL / Oracle / DM使用独立 COMMENT ON COLUMNSQL Server使用 sys.sp_addextendedproperty。当 definition 本身没有包含括号参数时会按配置补齐长度或精度例如 ColumnDefinition(definition VARCHAR, length 64) 会生成 VARCHAR(64)如果已经写成 VARCHAR(64)则不会再追加参数。unique true 目前表示单字段唯一约束CREATE 模式下多数关系型数据库使用列内联 UNIQUEUPDATE 模式新增字段时SQLite不支持 ALTER TABLE ADD COLUMN ... UNIQUE会改为先新增字段再生成 CREATE UNIQUE INDEXClickHouse不支持传统唯一约束配置 unique true 时会直接抛出异常避免生成无效SQL不支持联合唯一、部分唯一索引、命名唯一约束和已存在字段的唯一约束同步。Index用于在实体类上声明数据库索引示例如下import cn.xbatis.db.IndexDirection;import cn.xbatis.db.annotations.Index;import cn.xbatis.db.annotations.IndexField;import cn.xbatis.db.annotations.Table;Index(name idx_sys_user_username, fields IndexField(name username))Index( name uk_sys_user_username_created_at, unique true, fields { IndexField(name username), IndexField(name createdAt, direction IndexDirection.DESC) })Table(sys_user)public class SysUser {}说明如下name索引名为空时按表名和列名生成稳定索引名、unique是否唯一索引、fields索引字段name 使用实体字段名也兼容已映射的列名、direction索引字段排序支持 ASC、DESC默认不追加排序片段、CREATE 模式下建表后生成 CREATE INDEXUPDATE 模式下只按索引名创建数据库中缺失的索引不修改或删除已有索引ClickHouse不支持传统 CREATE INDEX 时会直接抛出异常避免生成无效SQL。类型映射默认类型映射包括String / Character / UUID - VARCHARInteger / int - INTEGERLong / long / BigInteger - BIGINTShort / short - SMALLINTBoolean / boolean - BOOLEAN、MySQL为 TINYINT(1)BigDecimal - DECIMAL(precision, scale)Float / Double - 浮点类型byte[] - 二进制大字段LocalDate - DATELocalTime - TIMEOracle / DM使用 TIMESTAMPLocalDateTime / Timestamp / Date - TIMESTAMPMySQL使用 DATETIMESQL Server使用 DATETIME2普通 enum - VARCHAR(64)实现xbatis EnumSupport 的枚举 - 按 T 的类型映射例如 EnumSupport - INTEGER。具体类型会根据 DbType 做方言调整。

相关新闻

NoFences:终极免费Windows桌面分区工具,3分钟告别杂乱桌面

NoFences:终极免费Windows桌面分区工具,3分钟告别杂乱桌面

2026/8/25 11:56:07

NoFences:终极免费Windows桌面分区工具,3分钟告别杂乱桌面 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否厌倦了在混乱的Windows桌面上寻找文件…

【小白也能轻松玩转龙虾】虾壳云一键部署新手专属包,专门适配零基础用户安装(附最新安装包)

【小白也能轻松玩转龙虾】虾壳云一键部署新手专属包,专门适配零基础用户安装(附最新安装包)

2026/8/25 11:54:38

OpenClaw(小龙虾)Windows 一键部署实操手册|十分钟搭建专属本地数字员工 适配平台:Windows 10/11(64 位)|零基础友好|全可视化界面|无编程门槛 当下热度较高的开源 AI 智…

一文理解 Apache Hadoop 机架感知

一文理解 Apache Hadoop 机架感知

2026/8/22 17:34:41

大型分布式集群通常跨多个机架部署。机架内网络速度快于跨机架,且跨机架通信受上层交换机带宽限制。Hadoop HDFS 将文件按块存储,默认每块3个副本,放置策略为:第一副本放在客户端所在节点;第二副本放在不同机架的随机节…

JavaScript常见的内存泄露问题 - JavaScript学习系列文章

JavaScript常见的内存泄露问题 - JavaScript学习系列文章

2026/8/25 11:55:06

多前端同学可能觉得这是浏览器或引擎该操心的事, 但理解内存管理能帮你写出更高效的代码, 还能避免各种内存泄漏的坑. 一、常见的内存泄露场景 1) 意外的全局变量: function leaky() { leak 这是一个全局变量; // 本意是 let leak ... this.anotherLeak 这也是全局的; …

JavaScript对象与元编程 - JavaScript学习系列文章

JavaScript对象与元编程 - JavaScript学习系列文章

2026/8/25 11:55:06

一、属性描述符 当你写 obj.name张三 时, 你真的了解这个 name 属性吗? 其实每个属性背后都藏着一组"属性描述符"(Property Descriptor), 就像一个人的身份证信息一样记录着这个属性的详细特征. const obj { name: 张三 };const descriptor Object.getOwnPropert…

JavaScript异步编程的演进 - JavaScript学习系列文章

JavaScript异步编程的演进 - JavaScript学习系列文章

2026/8/25 11:55:06

一、 为什么需要异步编程? 先说说为什么要有异步这回事. JavaScript是单线程的, 也就是说它一次只能做一件事. 如果所有操作都同步执行, 遇到网络请求或者文件读取这种耗时的操作, 页面就会卡住不动, 用户体验直接爆炸. // 同步代码的灾难现场const data fetchDat…

JavaScript 中的原型与继承 - JavaScript学习系列文章

JavaScript 中的原型与继承 - JavaScript学习系列文章

2026/8/25 11:55:06

一、从对象说起, 一切皆对象 在 JS 中, 几乎所有的东西都是对象, 或者说最终都会指向某个对象. 比如: let arr [1, 2, 3];console.log(typeof arr); //"object"function foo() {}console.log(typeof foo); //"function" (但本质上也是对象) 简单的对象创建…

开源考试系统本地部署实战:从环境配置到联调排坑全指南

开源考试系统本地部署实战:从环境配置到联调排坑全指南

2026/8/25 11:55:06

1. 项目缘起:为什么要在本地折腾一个开源考试系统?如果你是一名开发者、教育技术从业者,或者是一个小团队的负责人,想搭建一个在线考试平台,大概率会先想到去网上找现成的开源项目。这个想法很对,毕竟从头造…

Python标准库:开箱即用的生产级工具箱与工程实践指南

Python标准库:开箱即用的生产级工具箱与工程实践指南

2026/8/25 11:45:06

1. 什么是Python标准库:不是“第三方”,而是你装完Python就自带的“出厂配置” 很多人第一次听说“Python标准库”,下意识会把它和pip install安装的requests、numpy、pandas混为一谈——这其实是个根本性误解。Python标准库(Pyt…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/24 19:53:32

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/24 19:56:07

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/24 21:16:09

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南

2026/8/25 0:04:34

三步把QQ空间历史说说导出到本地:GetQzonehistory 极简指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory Meta Description:GetQzonehistory 是一个QQ空间历史说…

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

洛谷 P7912:[CSP-J 2021 T4] 小熊的果篮 ← 双向链表

2026/8/25 0:04:35

【题目来源】 https://www.luogu.com.cn/problem/P7912 【题目描述】 小熊的水果店里摆放着一排 n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1,2,…,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里&#x…

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG

2026/8/25 0:04:35

Transformers.js 网页端图像抠图实战:零后端 3 行代码返回透明 PNG 【免费下载链接】transformers.js State-of-the-art Machine Learning for the web. Run 🤗 Transformers directly in your browser, with no need for a server! 项目地址: https:/…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/22 4:13:47

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/22 1:32:34

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…