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

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

内容简介: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 全功能数据库持久层工具》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Java Servlet & JSP Cookbook

Java Servlet & JSP Cookbook

Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99

With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具