jSqlBox5.0.10.jre8 发布,Java 全功能数据库持久层工具

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

内容简介:jSqlBox,Java数据库持久层工具, 主页:https://gitee.com/drinkjava2/jsqlbox 本次更新内容是5.0.6.jre8到5.0.10.jre8版的更新汇总: 在ImprovedQueryRunner类(是DbContext的基类)中添加了StatementConfigurat...

jSqlBox,Java数据库持久层工具,

主页:https://gitee.com/drinkjava2/jsqlbox

本次更新内容是5.0.6.jre8到5.0.10.jre8版的更新汇总:

  1. 在ImprovedQueryRunner类(是DbContext的基类)中添加了StatementConfiguration初始化参数,以保持与DbUtils的初始化参数一致。 
  2. 新增一个CamelHandler拦截器,当 SQL 中出现这个拦截器作为参数时,会将返回Map中的下划线字段名转为驼峰式字段名,如"user_name"将转变为"userName",使用示例:
      listMp = DB.qryMapList("select * from user_table order by id ",  new CamelHander());
  3. 在DialectFunctionTemplate中添加registerFunction方法,用来登录自定义函数,如下面的语句为 MySQL 和H2数据库添加一个名为regexlike的自定义函数: 
    DialectFunctionTemplate.registerFunction("regexlike", "2=$P1 regexp $P2", "MySQL", "H2"); 
    String sql=DB.trans("select regexlike(name, 'a') from user_tb"); 
  4. 方言模块添加一个通用qt函数,用于在不同数据库下使用时添加对应数据库的引用符号,如: 
    String sql = DB.trans("select qt(name) from qt(helloWorld) where qt(name) like ?"); 
  5. 更新单元测试junit和HikariCP版本到最新版。 
  6. 更正IdentityGenerator在PostgreSQL中的DDL生成bug。 
  7. jSqlBox除了可以用@Table和@Column注解对每个表和字段进行配置,从5.0.10版起,在jDialect中新增一个setGlobalNamingConversion方法,这样就可以不用每个类或属性上加注解了,目前可以有以下三种设定: 
    Dialect.setGlobalNamingConversion(NamingConversion.LOWER_CASE_UNDERSCORE); //实体表名或属性aaBb映射为aa_bb格式 
    Dialect.setGlobalNamingConversion(NamingConversion.UPPER_CASE_UNDERSCORE); //实体表名或属性aaBb映射为AA_BB格式 
    Dialect.setGlobalNamingConversion(NamingConversion.NONE); //实体表名或属性aaBb不作变换,这是缺省设定 
    当以上设定不满足使用时,可以在setGlobalNamingConversion方法中给一个自定义的NamingConversion类实例。 
  8. 添加一个@UUID注解,以方便使用,这个注解等效于@UUID32一样,表示是一个32位字符长的随机字符ID
     

    附jSqlBox主要特点介绍: 
    配置简单,没有依赖任何第三方库

    在pom.xml中加入以下依赖即可使用。 如果需要查看或修改源码,甚至可以直接将jSqlBox的源码拷到项目目录里就可以直接使用了。

    <dependency>
       <groupId>com.github.drinkjava2</groupId>
       <artifactId>jsqlbox</artifactId>  
       <version>5.0.10.jre8</version> <!-- 或最新版 -->
    </dependency> 
     

    直接在 Java 里写SQL

    jSqlBox的最大特点是直接在Java里SQL,它的整个架构都是围绕在这个基础上,这是它与其它DAO工具最大的区别。在Java里直接写SQL的最大优点是学习成本低,只要会SQL就可以立即上手使用,降低了学习难度。使用jSqlBox并不表示要使用它的全部功能,很多时候使用SQL就能处理业务,没必要引入复杂的ORM。

    DbContext db= new DbContext(dataSource);
    db.exe("insert into users (", //
              " name ,", par("Sam"), //一个参数写一行,方便维护
              notNull("address,", user.getAddress()), //空值判断
    	  when(age>10, "age,", par(user.getAge())), //根据条件动态添加SQL片段
              " address ", par("Canada"), //
              ") ", valuesQuestions()); //自动根据参数个数补上 values(?,?...?)片段
     

    在Java里写SQL谁都会,但是象jSqlBox这样写出花来的 工具 并不多,个人认为这种混写方式是最能发挥原生SQL的威力,同时也是易学性、灵活性、可护展性最好的SQL写法。

    借助字符串常量或Q类,可以写出支持重构的SQL

     QTbPriceSetting p=QTbPriceSetting.instance;
     DB.exe("insert into ",p," (", //
    	p.id, ",", par(1200), //
    	p.price, ",", par(80), //
    	p.currency, ",", par("USD"), //
    	p.created_at, par("2019-09-17 04:07:55"), //
    	")", valuesQuestions());
     

    Q类或包含字符串常量的实体类源码,可以使用jSqlBox的源码生成功能,从数据库直接生成,另外jSqlBox也支持从实体类或数据库中导出Excel格式的数据库表结构,详见jDialect的实体结构或数据库结构导出到Excel

    架构合理,模块式架构,各个子模块(jBeanBox,jDbPro,jDialects,jTransaction)都可以脱离jSqlBox单独存在。

    jSqlBox是源码包含模块式架构,目的是隔离功能点,并分享给其它工具重用。例如只想使用jDialcet数据库方言模块,可以在项目的pom.xml中加入:

    <dependency>
        <groupId>com.github.drinkjava2</groupId>
        <artifactId>jdialects</artifactId>
        <version>5.0.10.jre8</version>
    </dependency>
     

    基于jDialects模块,支持80多种数据库的分页、DDl脚本生成、从数据库生成实体源码、函数变换、主键生成等功能。

    例如下面的SQL语句,就可以在多种数据库上使用而不需要更改源码,jSqlBox的jDialects模块自动处理与方言相关的DDL生成、分页、函数翻译。

    DB.exe(DB.gctx().toCreateDDL(HelloWorld.class)); //根据实体生成DDL,创建数据库表
    String sql=DB.trans("select concat('a','b','c'), current_time() from user_tb where age>0"); //根据方言对SQL函数翻译
    DB.qryString(sql, " and price>100", pagin(1, 10));  //任意数据库分页只需要传入一个pagin对象
     

    简洁的ActiveRecord模式

    继承ActiveRRecord类,或只需要声明实现ActiveEntity接口(Java8以上),就可以实现ActiveRecord模式了:

    public class User implements ActiveEntity{
     @UUID
     private String id;
     private String name;
     //getter &setter .....
    }
    
    //用ActiveRecord模式来存取数据库
    new User().loadById("张三").setUserAge(13).update(); 
     

    强大的参数式设计。 拦截器、分页、模板、缓存、实体映射器等都可以当作参数拼接到SQL方法里去

    例如SQL模板引擎可以当作参数传到SQL里,这样jSqlBox就具备了支持并以扩充各种SQL模板的功能:

    SqlTemplateEngine TEMPLATE = BasicSqlTemplate.instance()
    ctx2.exe(TEMPLATE, "update users set name=#{user.name}, address=:user.address", bind("user", tom));
     

    再例如下面的SQL,只会执行一次,因为参数中有一个缓存拦截器,重复的SQL不再执行而是直接从缓存中取结果:

    SimpleCacheHandler cache = new SimpleCacheHandler();
    for (int i = 0; i < 10; i++)
       DB.qry(cache, new EntityListHandler(), DemoUser.class, "select u.* from DemoUser u where u.age>?", par(10));
     

    为Java8及以下开发环境提供多行文本支持,方便利用IDE快速定位到多行SQL文本上

    public static class InsertDemoSQL extends Text {
    /*-  
    insert into demo
          (id, name) 
    values( ?,  ?)
    */
    }
    //使用:
    DB.exe(InsertDemoSQL.class, par("1", "Foo"));
     

    灵活的实体关联查询

    例如下例,可以一次无递归查询树节点并装配成内存中对象树,其中的EntityNetHandler、alias, give等方法都是与实体关联映射相关的SQL参数:

    Object[] targets = new Object[] { new EntityNetHandler(), TreeNode.class, TreeNode.class,
    		alias("t", "p"), give("p", "t", "parent"), give("t", "p", "childs") };
    EntityNet net = ctx.qry(targets, //深度树的海底捞算法
      "select t.**, t.pid as p_id from treenodetb t where t.line>=? and ",
          "t.line< (select min(line) from treenodetb where line>? and lvl<=?) ", par(line, line, lvl));
    TreeNode node = net.pickOneEntity("t", d.getId());
     

    不同于Hibernate和MyBatis复杂的配置,在jSqlBox中,实体关联查询只不过是一种参数略微复杂的SQL而已,随用随拼,不需要配置。

    兼容主要JPA注解,支持在运行期动态更改配置

    为了方便学习,jSqlBox兼容JPA实体类的以下主要注解:

    @Entity, @Transient, @UniqueConstraint, @GenerationType, @Id, @Index, @SequenceGenerator, 
    @GeneratedValue, @Table, @Column, @TableGenerator, @Version, @Enumerated, @Convert, @Temporal
     

    jSql自带一些特殊实体注解如CreatedBy、LastModifiedBy、ShardTable、ShardDatabase、Snowflake等。 jSqlBox在运行期可动态更改实体关联配置,例如下面在运行期给一个pojo类动态配置UUID32主键,并更改它的name字段映射到address字段上:

    TableModel m = TableModelUtils.entity2Model(PojoDemo.class);
    m.column("id").pkey().uuid32();
    m.column("name").setColumnName("address");
    TableModelUtils.bindGlobalModel(PojoDemo.class, m);
     

    jSqlBox自带多租户、主从、分库分表功能

    jSqlBox的主从和分库分表功能除了默认的用实体Sharding注解操作外,还支持将分库分表方法作为参数直接传到SQL中使用,精准控制每一条SQL的分库分表:

    //实体的分库分表
    for (i:=0;i<100;i++)
       new TheUser().put("databaseId", i).insert(); 
       
    //SQL中的分库分表   
    db[2].exe(User.class, "insert into ", shardTB(tbID), shardDB(dbID)," (id, name, databaseId) 
              values(?,?,?)", par(tbID, "u1", dbID), USE_BOTH);
     

    多租户功能可以根据IP地址等进行分库分表,这个和根据实体字段内容分库分表是有区别的,实际多租户要配置TenantGetter实例:

     public static class CustomTenantGetter implements TenantGetter {
            @Override
            public ImprovedQueryRunner getTenant() {
                return DB.gctx(); //通常是根据IP地址等,从treadlocal中取一个DbContext实例:
            } 
        }
     //启动阶段
     ctx = new DbContext(); 
     ctx.setTenantGetter(new CustomTenantGetter());
     

    自带声明式事务,也支持使用Spring的事务

    jSqlBox内置IOC/AOP工具,自带声明式事务功能,详见“事务配置”一节。如果是在Spring环境中,单独或与其它工具比如Hibernate/MyBatis混用,配置也非常简单,如下:

    DbContext ctx = new DbContext(ds);
    ctx.setConnectionManager(SpringTxConnectionManager.instance());
    DbContext.setGlobalDbBoxContext(ctx);// 设定静态全局上下文
     

    自带分布式事务功能

    详见“分布式事务”一节,jSqlBox的分布式事务原理和Seata项目类似,可以自动生成回滚SQL,但jSqlBox的源码远比Seata简洁,因为jSqlBox是基于实体的CRUD生成回滚SQL,所以不需要考虑SQL兼容性这个问题。

    不重复发明轮子,避开反模式

    jSqlBox不重新发明轮子,使用DbUtils作为内核,以源码内含的方式包含到项目中,DbUtils是一个成熟、简洁、高效的JDBC工具。 jSqlBox尽量避免反模式,反模式就是花很多时间做没有意义的事,比如作者认为实体一对多、多对一的关联配置是个反模式,带来的性能、学习、维护问题往往比它解决的问题还要多,所以在jSqlBox中不支持一对多、多对一的JPA注解支持。 jSqlBox中也不存在用Java方法代替SQL关键字的这种做法,认为它也是一种反模式,比如下面这种写法:

    List<S1UserPojo> userPojoList = dslContext.select()
                .from(S1_USER)
                .where(S1_USER.ID.eq(1))
                .fetch(r -> r.into(S1UserPojo.class));
     

    只适合简单的CRUD,当逻辑稍微一复杂可读性、可维护性就非常差,还不如直接手写SQL来得方便。

    更多功能点介绍和使用,请详见jSqlBox的用户手册


以上所述就是小编给大家介绍的《jSqlBox5.0.10.jre8 发布,Java 全功能数据库持久层工具》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

阿里铁军

阿里铁军

宋金波、韩福东 / 中信出版集团 / 2017-7 / 58

【编辑推荐】 互联网地推天团,马云口中的中国电商“黄埔军校”,是如何铸造的? 超强执行力来自何处,价值观如何创造万亿价值?阿里铁军的团队建设、销售技巧、文化与价值观的创建与传播,深度剖析与分享。 阿里铁军,不仅走出过阿里巴巴集团的诸多高管,彭蕾、戴姗、蒋芳、孙彤宇、蔡崇信……,还走出过互联网江湖中的众多显赫人物,国内O2O战场,一度成为“铁军内战”:程维(滴滴打车创始人兼CEO)......一起来看看 《阿里铁军》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具