内容简介:简介 jDialects是一个Java数据库方言工具,目的是解决跨数据库问题,支持80多种关系数据库方言,具有分页、函数变换、类型变换、DDL生成、JPA注解解析等功能。它可以与JDBC工具组合使用,也可以作为ORM工具的一个...
简介
jDialects是一个 Java 数据库方言工具,目的是解决跨数据库问题,支持80多种关系数据库方言,具有分页、函数变换、类型变换、DDL生成、JPA注解解析等功能。它可以与JDBC工具组合使用,也可以作为ORM工具的一个组件。
优点
- 无侵入:jDialects原理基于对 SQL 文本进行变换,对持久层 工具 无侵入
- 依赖少:不依赖任何第三方库,基至把源码拷到项目里也能工作
- 从Annotation创建DDL:根据实体注解生成解析,包括一些主要的JPA注解的解析
- 从Java方法创建DDL:提供Java方法配置来创建DDL,同样的语法也可以在运行期修改配置。
- 从数据库生成实体类源码:可以读取数据库结构,生成各种可定制格式的实体类源码或导出Excel。
- 主键生成器:提供十多种主键生成器,和一个分布式主键生成器,为开发ORM工具提供便利
- 分页:提供跨数据库的分页方法
- 函数变换:对不同的数据库解析成对应方言的函数,尽量做到一次SQL到处运行。
- 类型变换:对不同的数据库字段类型,提供与Java类型的互相变换。
- 保留字检查:提供数据库保留字检查功能。
本次更新:
1. 添加运行期增删列DDL生成功能,这个要求已多次出现,据说可以用于动态表单。胳膊拧不过大腿,这次就增加这个功能。结合jSqlBox的使用示例如下:
@Test
public void testAddDropColumnsAtRuntime() {//动态添加删除列
DbContext db = new DbContext(ds);
Dialect dialect = db.getDialect();
TableModel t1 = new TableModel("tb_test");
t1.column("id").INTEGER().pkey();
db.quiteExecute(db.toDropAndCreateDDL(t1));//新建表
db.exe("insert into tb_test (id) values(?)", DB.par(1));
Systemout.println("此时只有1列=" + db.qryMapList("select * from tb_test"));
ColumnModel name = new ColumnModel("name").STRING(10).comment("新增的列");//column可以单独创建,再设定它的tableModel
name.setTableModel(t1);
String[] add = dialect.toAddColumnDDL(name, t1.column("age").INTEGER(), t1.column("price").DOUBLE());
db.executeDDL(add); //新增三个列
db.exe("insert into tb_test (id, name, age, price)", DB.par(2, "tom", 5, 100.0), DB.VQ);
Systemout.println("此时有4列 =" + db.qryMapList("select * from tb_test ") );
db.executeDDL(dialect.toDropColumnDDL(t1.column("name"), t1.column("age"))); //删除两个列
Systemout.println("此时有2列=" + db.qryMapList("select * from tb_test")); //此时有2列
//改名和改类型目前不能直接做到,但可以新建一列,再用SQL拷贝,然后再删除旧列
db.executeDDL(dialect.toAddColumnDDL(t1.column("new_price").DECIMAL(5, 2)));
db.exe("update tb_test set new_price=price");
db.executeDDL(dialect.toDropColumnDDL(t1.column("price")));
Systemout.println("此时price被改名成了new_price=" + db.qryMapList("select * from tb_test")); //此时price被改名成了new_price
}
使用jDialects生成的DDL,是跨数据库的,这是和直接使用原生SQL的区别。当然如果有bug发现请提交issue,因为条件所限,我不能做到在所有数据库上一一测试。
另外动态增删列要注意3点:
1).动态修改数据库结构后,可能需要关闭数据连接池并重新初始化,否则某些数据连接池(如HikariCP)因为PreparedStatement缓存没有清除的原因,用"select *"读取所有列时会出错。
2).在jDialects中,为了维护简单化,动态增删的列不能有外键、主键、约束、自增、索引,只允许是普通的列。
3).目前不支持直接改列名或改变列属性定义,这个可以通过新建一列,拷贝旧列内容到新列再删除旧列的方法变通实现。
2. 更正Decimal、Datatime类型在生成DDL时出错的bug
3. 更正cast函数不支持的bug
4. 重构源码,以便于阅读和扩展新的方言。如需扩展新方言可见jSqlBox项目test目录下的SampleDialectTest.java示例。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- mongoose对MongoDB数据库的增删查改
- 链表!比数组更适合做增删操作的数据结构
- 深度有趣 | 29 方言种类分类
- JVM 上的 Lisp 方言 Clojure 1.9
- Go 语言函数式编程系列教程(十) —— 数据类型篇:在数组切片中动态增删元素
- 使用Hibernate和Oracle 10g方言,如何用JPA生成我的id?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
图片转BASE64编码
在线图片转Base64编码工具