内容简介:在删除了SQL注解模式后,jSqlBox主模块的源码数量从30多个一下子降到了只有21个,清爽多了。多行文本支持需要配置Maven插件或手工拷贝源码到resources目录。jSqlBox中,所有ActiveRecord类自动具备Tail功能,查询时未映射到实体字段上的列将作为tail添加到实体中。当不想定义实体类时,也可以直接使用一个Tail实例来操作数据库,Tail类只有两行源码,继承于ActiveRecord类,相当于一个属性为空的实体。
本次更新内容如下:
-
添加了根据数据库生成实体类源码功能, 实际上是在jDialects模块中增加了一个方法,将所有数据库表格按表名生成实体POJO或ActiveRecord类源码输出到指定目录下,现在jSqlBox不仅具有生成DDL的功能,也有了由数据库生成实体源码的功能了:
TableModelUtils.db2JavaSrcFiles(DataSource ds, Dialect dialect, boolean linkStyle, boolean activeRecord,String packageName, String outputfolder)
-
Sharding功能添加一个shard()方法, 当分库注解和分表注解出现在同一个主键上时,SQL中只需要使用一个shard()方法就可以了:
//对于同时具有分库、分表注解的实体类 public class TheUser extends ActiveRecord<TheUser> { @ShardDatabase({ "MOD", "3" }) @ShardTable({ "MOD", "3" }) @Snowflake @Id private Long id; private String name; ... } //旧版本的 SQL 写法: iExecute(TheUser.class, "insert into ", shardTB(3), shardDB(3), " (id, name) values(?,?)", param(3, "u1")); //新版的SQL写法为: iExecute(TheUser.class, "insert into ", shard(3), " (id, name) values(?,?)", param(3, "u1")); //ActiveRecord写法保持不变, 依然是透明式分库分表 new TheUser().setId(3).setName("Tom").insert();
-
删除了Sql注解方式及对抽象类实例化的支持,因为发现这种用法带来的复杂性超过它的收益,不如直接利用Text类将SQL文本放在代码里。也就是说下面这种将SQL标注在方法上的写法在jSqlBox中不再支持:
@Sql("select * from users where name=? and address=?") public List<Map<String, Object>> selectUsers(String name, String address);
在删除了SQL注解模式后,jSqlBox主模块的源码数量从30多个一下子降到了只有21个,清爽多了。
-
增加Text类来支持多行SQL文本,支持IDE定位(利用类名)和重构,例如下面是jSqlBox中一个单元测试实例:
public class TextTest extends TestBase { public static class InsertDemoSQL extends Text { /*- insert into demo (id, name) values(?, ?) */ } public static class UpdateDemoSQL extends Text { /*- update demo set name=#{d.name} where id=:d.id */ } public static class SelectNameByIdSQL extends Text { /*- select name from demo where id=? */ } @Test public void test() { pExecute(new InsertDemoSQL(), "1", "Foo"); Demo d = new Demo().putField("id", "1", "name", "Bar"); tExecute(UpdateDemoSQL.class, bind("d", d)); Assert.assertEquals("Bar", pQueryForString(SelectNameByIdSQL.class, "1")); } }
多行文本支持需要配置Maven插件或手工拷贝源码到resources目录。
-
新增了tail功能(在jSqlBox模块的ActiveRecord类中),这个借签了BeetlSql的Tail和jFinal的Record,原来ActiveRecord中的put和putFiels方法取消,取而代之的是putField/putTail以及forFields方法等。在jSqlBox的ActiveRecord中,Tail和普通setter/setter可以混用:
//setter方法、Tail方法、实体属性赋值方法可以混用, tail()方法中如果不加表名,表示使用与实体类相同的表 new User().setId("u1").putTail("usr_addr","Beijing").putField("userName","Tom").update(tail()); //基于实体属性批量赋值 t.forFields("userName", "age", "birthDay"); t.putValues("Foo", 10, new Date()).insert(); t.putValues("Bar", 20, new Date()).insert(); //基于tail的批量赋值 t.forTails("user_name", "age", "birth_Day"); t.putValues("Foo", 30, new Date()).insert(TAIL); t.putValues("Bar", 40, new Date()).insert(tail("tb_user"));
jSqlBox中,所有ActiveRecord类自动具备Tail功能,查询时未映射到实体字段上的列将作为tail添加到实体中。当不想定义实体类时,也可以直接使用一个Tail实例来操作数据库,Tail类只有两行源码,继承于ActiveRecord类,相当于一个属性为空的实体。
-
个别方法名调整,而且原来entity系列方法全部改为采用单个e字母打头,如:
List<User> users = ctx.entityFindBySample(u1); ==> 现写为 List<User> users = ctx.eFindBySample(u1); List<User> users = ctx.entityFindAllList(User.class); ==> 现写为 List<User> users = ctx.eFindAll(User.class);
-
jSqlBox中用到的jDialects项目,开源协议从LGPL改为更开放的Apache 2.0开源协议。
-
jTransactions声明式事务项目添加jFinal连接管理器支持。
-
jBeanBox项目(这是个独立发行的IOC/AOP工具,被jSqlBox-Java8版引用)更新到2.4.9版本,修复了不能获取父类属性的Bug。
-
项目的demo目录下添加了三个常见MVC框架SpringBoot、ActFramework、jFinal的整合示例, 以及在SpringBoot环境下,jSqlBox和MyBatis混搭使用的演示(效果基本上就等同于MyBatis+MyBatisPlus)。
另外还在Wiki附录中添加了一个"DAO工具对比表" 详见 这里 ,将jSqlBox与其它DAO工具作了一个对比,对初学者、以及其它开源DAO软件作者来说可能都有借签意义,开源的优点就是可以互相借签、抄袭其它项目的设计思路、功能、甚至是源码(在符合开源协议前提下)而互相改进。
对比表中的打分和解释纯属个人看法,如有说错的还望指正。
以上为本次更新内容,完整的jSqlBox使用说明,请见它码云主页的 用户手册 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Linux Kernel 5.4 发布,exFAT 支持和内核锁定功能
- Linux内核TCP协议多个SACK功能拒绝服务漏洞分析
- jSqlBox 2.0.4 发布,基于 DbUtils 内核的全功能 DAO 工具
- Linux Mint 19.2“Tina”Beta 版发布,更好的内核管理功能
- 国产海光X86处理器已获Linux内核支持,相比EPYC无新功能
- 内核必须懂(六): 使用kgdb调试内核
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。