jDialects 5.0.12 更新,数据库方言工具,添加动态增删列功能

栏目: 软件资讯 · 发布时间: 2年前

内容简介:简介 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示例。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

追踪Linux TCP/IP代码运行

追踪Linux TCP/IP代码运行

秦健 / 北京航空航天大学出版社 / 2010-4-1 / 69.00元

本书以应用程序为线索,详细描述了数据包在协议栈的分段、重组、发送、接收过程,同时分析了路由的初始化和设置过程,主要包括socket应用程序、 TCP/IP协议、路由、通知链、邻居子系统等内容。全书涵盖了协议栈的全部知识点,对于广大的读者来说这是一本极其难得的技术资料。同时,书中论述了网络设备的工作原理,解释了RTL8169和嵌入式CS8900、DM9000网卡设备的核心过程。一起来看看 《追踪Linux TCP/IP代码运行》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码