内容简介:简介 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?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Persuasive Technology
B.J. Fogg / Morgan Kaufmann / 2002-12 / USD 39.95
Can computers change what you think and do? Can they motivate you to stop smoking, persuade you to buy insurance, or convince you to join the Army? "Yes, they can," says Dr. B.J. Fogg, directo......一起来看看 《Persuasive Technology》 这本书的介绍吧!