- 调整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
@Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) @Builder(Base64Convert.class) public static @interface Base64 { }
0
这里的$$代表了属性占位符号,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
@Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) @Builder(Base64Convert.class) public static @interface Base64 { }
0
这里的$$代表了属性占位符号,BeetlSQL的内置生成sql语句依据此生成合适的sql语句,如替换$$
,生成#{jsonData}::JSON
.
可以参考源码例子 org.beetl.sql.postgres.JacksonConvert
还没有评论,来说两句吧...