BeetlSQL 3.16.0 发布,JSONB 支持

  • 调整AttributeConvert,增加新接口,干预内置生成语句方式,参考Postgress BJSON
  • 视图支持通过@AssingId指定主键,以支持内置查询,更新操作,参考视图更新

Maven

<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetlsql</artifactId>
    <version>3.16.0-RELEASE</version>
</dependency>

 BeetlSQL 自主研发自 2015 年,目标是提供开发高效,维护高效,运行高效的数据访问框架,它适用范围广,定制性强,写起数据库访问代码特别顺滑,不亚于 MyBatis。你不想写 SQL 也好,或者想更好地写 SQL 也好,BeetlSQL 都能满足这要求,目前支持的数据库如下

  • 传统数据库:MySQL (包括支持 MySQL 协议的各种数据库), MariaDB ,Oralce ,Postgres (包括支持 Postgres 协议的各种数据库), DB2 , SQL Server ,H2 , SQLite , Derby ,神通,达梦,华为高斯,人大金仓,PolarDB,GBase8s,GreatSQL 等
  • 大数据:HBase,ClickHouse,Cassandar,Hive,GreenPlum
  • 物联网时序数据库:Machbase,TD-Engine,IotDB
  • SQL 查询引擎:Drill,Presto,Druid
  • 内存数据库:ignite,CouchBase

阅读文档 源码和例子 在线体验 多库使用 性能测试

关于AttributeConvert类说明

可以自定义一个属性注解,BeetlSQL上遇到此属性注解,将按照属性注解的执行类去执行映射,比如对手机号码的入库加密,出库解密。比如对JSON对象序列化成字符串到数据库,然后从数据库反序列成成对象。同其他BeetlSQL扩展注解机制类似,实现一个扩展注解,需要使用@Builder注解申明其执行类

@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
@Builder(Base64Convert.class)
public static @interface Base64 {

}

如上申明一个@Base,用于字段在入库加密,出库解密。其实现类使用@Builder注解申明,本例其执行类是Base64Convert。

执行类必须是一个AttributeConvert的子类,实现AttributeConvert方法

public static class Base64Convert  implements AttributeConvert {
  Charset utf8  = Charset.forName("UTF-8");
  public  Object toDb(ExecuteContext ctx, Class cls, String name, Object pojo) {
    String value= (String) BeanKit.getBeanProperty(dbValue,name);
    byte[] bs = java.util.Base64.getEncoder().encode(value.getBytes(utf8));
    return new String(bs,utf8);
  }
  
  public  Object toAttr(ExecuteContext ctx, Class cls, String name, ResultSet rs, int index) throws SQLException {
    String value  = rs.getString(index);
    return new String(java.util.Base64.getDecoder().decode(value),utf8);
  }
}

toDb方法用于将属性转化为列,pojo指入库的POJO对象,name是指其属性名称,可以调用BeetlSQL3提供的类BeanKit.getBeanProperty获取对象属性值

toAttr将数据库转化为属性

@Table(name="sys_user")
@Data
public  class UserData{
  @AutoID
  Integer id;
  @Base64
  String name;
}

另外一个例子,自定义Jackson注解

@Data
@Table(name="json_test")
public class JsonDataEntity {
   @AssignID
   String id;
   @Jackson
   @Column("json_data")
   Color jsonData;

}

@Jackson注解负责序列化和反序列化,定义如下,使用JacksonConvert



@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
@Builder(JacksonConvert.class)
public @interface Jackson {

}

以toDb方法为例子

public class JacksonConvert implements AttributeConvert {
    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public  Object toDb(ExecuteContext ctx,  Class cls,String name, Object dbValue) {
        Object obj = BeanKit.getBeanProperty(dbValue,name);
        if(obj==null){
            return null;
        }
        try {
            String str = objectMapper.writeValueAsString(obj);
            return str;
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException(...);
        }
    }
    
}

 本次发布新增功能: AttributeConvert还能影响针对POJO自动生成的内置SQL语句,提供如下方法

default  String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){
		return null;
}

默认情况下,返回nul,不会影响自动生成语句,比如对于内置insert语句,生成的是

insert into ....  value( #{id},#{jsonData} )

在postgres数据库,如果json_data列使用了jsonb,那期望内置生成的insert sql语句是

insert into ....  value( #{id},#{jsonData}::JSON )

针对这个情况,可以JacksonConvert 可以重写toAutoSqlPart

default  String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){
		return "$$::JSON";
}

这里的$$代表了属性占位符号,BeetlSQL的内置生成sql语句依据此生成合适的sql片段,如替换$$,生成#{jsonData}::JSON.

可以参考源码例子 org.beetl.sql.postgres.JacksonConvert

 

JacksonConvert 实现了AttributeConvert,以toDb为例子

public class JacksonConvert implements AttributeConvert {
    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public  Object toDb(ExecuteContext ctx,  Class cls,String name, Object dbValue) {
        Object obj = BeanKit.getBeanProperty(dbValue,name);
        if(obj==null){
            return null;
        }
        try {
            String str = objectMapper.writeValueAsString(obj);
            return str;
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException(...);
        }
    }
    
}

AttributeConvert还能影响针对POJO自动生成的内置SQL语句,提供如下方法

default  String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){
		return null;
}

默认情况下,返回nul,不会影响自动生成语句,比如对于内置insert语句,生成的是

insert into ....  value( #{id},#{jsonData} )

在postgres数据库,如果json_data列使用了jsonb,那期望内置生成的insert sql语句是

insert into ....  value( #{id},#{jsonData}::JSON )

针对这个情况,可以JacksonConvert 可以重写toAutoSqlPart

default  String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){
		return "$$::JSON";
}

这里的$$代表了属性占位符号,BeetlSQL的内置生成sql语句依据此生成合适的sql语句,如替换$$,生成#{jsonData}::JSON.

可以参考源码例子 org.beetl.sql.postgres.JacksonConvert

猜你喜欢

转载自www.oschina.net/news/203747/beetlsql-3-16-0-released