转载

jSqlBox 4.0.7 发布,Java 数据库 ORM 工具

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中的事务模式回调方法。虽然源码只有十行,但这个语法糖可以简化事务的写法,不再需要每次手工开启、提交、回滚事务了,使用示例如下:

<code>DbContext ctx = new DbContext(dataSource);
</code>DbContext.setGlobalDbContext(ctx);<code>ctx.tx(()->{
    new User().putField("firstName", "Foo").insert();
    new User().putField("firstName", "Bar").insert();
  });
</code>

与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     

原文  https://www.oschina.net/news/116715/jsqlbox-4-0-7-released
正文到此结束
Loading...