内容简介: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
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Intersectional Internet
Safiya Umoja Noble、Brendesha M. Tynes / Peter Lang Publishing / 2016
From race, sex, class, and culture, the multidisciplinary field of Internet studies needs theoretical and methodological approaches that allow us to question the organization of social relations that ......一起来看看 《The Intersectional Internet》 这本书的介绍吧!