内容简介:jSqlBox主要特点是架构优、尺寸小、功能全,基本上所有与数据库操作相关的功能,jSqlBox都已提供。它的主要特点有: 1.内核基于DbUtils并与之兼容。 2.提倡在java里拼写SQL,独创参数内嵌式SQL写法, 而且任意CRU...
jSqlBox主要特点是架构优、尺寸小、功能全,基本上所有与数据库操作相关的功能,jSqlBox都已提供。它的主要特点有:
1.内核基于DbUtils并与之兼容。
2.提倡在 java 里拼写SQL,独创参数内嵌式 SQL 写法, 而且任意CRUD方法里都可以混插SQl片段,例如:
new Demo().setName("张三").insert().putField("age", 15).update(" and name=?", param("李四"), " and age> ",ques(20));
3.只有单个jar包,不依赖任何第三方库。
4.支持分库分表、声明式事务、分布式事务。
5.支持80多种数据库方言,支持DDL生成、分页、函数变换、实体源码生成。
6.学习成本低,兼容主要的实体JPA注解。
本次更新为jsqlbox-4.0.7.jre8版,有以下内容改动:
1.添加tx和tryTx两个事务模板方法
这两个方法类似于JdbcTemplae和jFinal中的事务模式回调方法。虽然源码只有十行,但这个语法糖可以简化事务的写法,不再需要每次手工开启、提交、回滚事务了,使用示例如下:
DbContext ctx = new DbContext(dataSource);
DbContext.setGlobalDbContext(ctx);ctx.tx(()->{ new User().putField("firstName", "Foo").insert(); new User().putField("firstName", "Bar").insert(); });
与tx方法类似的还有一个tryTx方法,如果方法体内有异常发生,它们事务都会回滚。两者的区别是tx方法没有返回值,如果方法体内有异常发生,事务会回滚,并抛出一个运行时异常DbException。而tryTx方法不抛出异常,它返回一个布尔值,返回true表示事务提交成功,返回false表示事务提交失败。
tx和tryTx两个方法都可以用ctx.getLastTxResult来返回一个TxResult对象,它的commitEx属性里存放了上次事务发生时捕获的异常,result属性里存放了事务提交结果,注意这是一个三态值,有SUCESS、FAIL、UNKNOW三种状态,UNKNOW态很少会遇到,它只发生在使用了jSqlBox的GTX分布式事务,有部分提交且自动回滚也未完成(如网线断掉或有一个数据库硬盘损坏)这种情形。
2.增加了缓存翻译功能
缓存翻译这个功能是从SqlToy这个ORM工具中抄过来的,当然不是抄源码了,而是抄这个功能,做开源要擅长于横向比较同类项目,并吸收其它开源项目的亮点才能互相促进。
缓存翻译(有时被称为“数据字典”)可以用内存中缓存的数据库表来避免多表关联查询,简化SQL的书写,并有可能提高查询效率。以下是一个使用了缓存翻译的示例,完整示例代码详见单元测试中的CacheTranslateTest.java,实现上使用起来也很简单,主要就下面几行:
Map<Integer, Map<String, Object>> users = ctx.iQuery("select * from users", new KeyedHandler<Integer>("id"));
Map<Integer, Map<String, Object>> groups = ctx.iQuery("select * from groups", new KeyedHandler<Integer>("id"));
List<Map<String, Object>> orders = ctx.iQueryForMapList("select id,orderNo,userId,groupId from orders where id>'10' ");
CacheTransUtils.translate(orders, users, "userID", "name", "userName", "age", "userAge", groups, "groupId", "groupName", "groupName");
以上translate方法对orders这个List集合,根据缓存users和groups表,添加了userName、userAge和groupName三个列。
translate方法的参数可以有无限个,但是必须严格按照以下参数顺序来使用: translate(要处理的集合,缓存A,"集合中的列名","缓存A中的列名1","列名1别名","缓存A中的列名2","列名2别名"......, 缓存B,"集合中的列名","缓存B中的列名1","列名1别名"...)
注意这个缓存翻译功能是针对List<Map<String,Object>>这个数据结构的,是对SQL的查询结果进行后处理,它与DAO工具实际上关系不大,也就是说,其它的DAO工具如MyBatis,JdbcTemplate等也可以调用jSqlBox的这个CacheTransUtils.translate方法实现缓存翻译功能。
缓存翻译通常缓存不常变动的表格(即数据字典)到内存中,如果数据字典偶尔有变动,可以有两种方案,一种是在更改数据字典时,强制刷新缓存。另一种方案是每次使用缓存翻译功能时,都重新查询数据字典,在查询数据字典给它传递一个缓存拦截器,由缓存拦截器的失效时间来决定是否实际发出SQL到数据库查询。
jSqlBox缓存翻译的缺点:被翻译后添加的这些字段,不能出现在SQL查询条件中,这是它的一个使用限制。如果既想将这些字段作为SQL参数参与查询,又不想采用多表关联这种传统写法,可以考虑打破数据库范式,采用添加冗余字段的技巧。
更多jSqlBox的使用说明请见其主页:https://gitee.com/drinkjava2/jsqlbox
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- flask 迁移数据库工具
- 数据库管理开源工具 DBeaver
- innotop-数据库性能动态查看工具
- Oracle数据库勒索病毒自检工具
- Oracle数据库勒索病毒自检工具
- python数据库连接工具DBUtils
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。