## AttributeConvert
可以自定义一个属性注解,BeetlSQL上遇到此属性注解,将按照属性注解的执行类去执行映射,比如对手机号码的入库加密,出库解密。比如对JSON对象序列化成字符串到数据库,然后从数据库反序列成成对象。同其他BeetlSQL扩展注解机制类似,实现一个扩展注解,需要使用@Builder注解申明其执行类
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
@Builder(Base64Convert.class)
public static @interface Base64 {
}
```
如上申明一个@Base64,用于字段在入库加密,出库解密。其实现类使用@Builder注解申明,本例其执行类是Base64Convert。
执行类必须是一个AttributeConvert的子类
```java
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(pojo,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将数据库转化为属性。 如下是使用@Base64的一个例子
```java
@Table(name="sys_user")
@Data
public class UserData{
@AutoID
Integer id;
@Base64
String name;
}
```
如下是定义了一个@Update注解
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
@Builder(UpdateTimeConvert.class)
public @interface UpdateTime {
}
public class UpdateTimeConvert implements AttributeConvert {
@Override
public Object toDb(ExecuteContext ctx, Class cls,String name, Object pojo){
Date now = new Date();
BeanKit.setBeanProperty(pojo,now,name);
return now;
}
}
```
这样,在每次入库操作的时候,都取得最新的时间。并调用BeanKit.setBeanProperty赋值给pojo对象,并返回当前时间
。BeetlSQL3通过返回的当前时间做入库操作,因此调用BeanKit.setBeanProperty 不是必须操作。但POJO对象还需要有一个与数据库操作结果一致的值。如果未调用。pojo的对应属性为null。
源码例子org.beetl.sql.test.annotation.Jackson 是一个把对象序列化成字符串存入数据库,或者从数据库取出反序列化成对象。
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.METHOD, ElementType.FIELD})
@Builder(JacksonConvert.class)
public @interface Jackson {
}
```
JacksonConvert 实现了AttributeConvert,以toDb为例子
```java
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语句,提供如下方法
```java
default String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){
return null;
}
```
默认情况下,返回nul,不会影响自动生成语句,比如对于内置insert语句,生成的是
```sql
insert into .... value( #{id},#{jsonData} )
```
在postgres数据库,如果json_data列使用了jsonb,那期望内置生成的insert sql语句是
```sql
insert into .... value( #{id},#{jsonData}::JSON )
```
针对这个情况,可以`JacksonConvert` 可以重写toAutoSqlPart
```java
default String toAutoSqlPart(DBStyle dbStyle,Class cls,AutoSQLEnum autoSQLEnum, String name){
return "$$::JSON";
}
```
这里的$$代表了属性占位符号,BeetlSQL的内置生成sql语句依据此生成合适的sql语句,如替换`$$`,生成`#{jsonData}::JSON`. 或者替换成`?::JSON` 取决于生成方式。
可以参考源码例子 org.beetl.sql.postgres.JacksonConvert
- BeetlSQL 3 指南
- 数据访问框架
- 适合用户
- 编译源码
- 直接看代码
- 闲大赋介绍
- BeetlSQL3 特点
- 数据库访问工具的痛点
- BeetlSQL3 例子
- 基础例子
- 结果集映射
- 翻页查询
- 演示like,batchUpdate,in 操作
- 自动fetch
- 多数据库
- 代码生成框架
- 安装BeetlSQL
- 直接安装
- 框架集成
- 编译源码
- 快速开始
- 环境准备
- 环境搭建
- 使用BeetlSQL
- 按照主键查寻
- 更新
- 按照模板查询
- 执行SQL
- 执行模板SQL
- 使用Query
- 使用Mapper
- 使用模板文件
- SQLManager
- 内置语句
- 内置查询API
- template查询
- 更新操作
- 执行SQL
- 执行模板SQL
- 把SQL放到文件里
- 翻页查询
- SQLResult
- Stream查询
- 存储过程调用
- NameConversion(重要)
- DBStyle
- Inerceptor
- SQLManagerExtend
- 强制使用数据源
- Mapper
- 实现Mapper
- @Sql
- @Update @BatchUpdate
- @Template
- 参数名称
- 参数返回值
- 执行SQL文件
- 翻页查询
- @SqlProvider
- @SpringData
- @SubQuery
- @InheritMapper
- @Call
- StreamData
- Default Method
- 定义自己的BaseMapper
- 限制Java代码中SQL长度
- 数据模型
- POJO
- 不严格的POJO
- 交集(重要)
- @Table 注解
- @Column 注解
- 主键
- RowMapper
- ResultSetMapper
- Json配置映射
- Json自动映射
- XML支持
- 自动Fetch
- AttributeConvert
- BeanConvert
- 枚举
- 混合模型
- Map模型
- 动态模型
- 模型其他注解
- 安全扩展注解
- BeetlSql 单表查询工具Query
- Query使用方式和风格介绍
- Query主要操作简介
- 查询器获取
- SELECT简单的条件查询
- 复杂的条件查询
- 查询字段智能处理
- 健壮的变量
- 自定义实现
- INSERT操作
- UPDATE操作
- DELETE操作
- single查询和unique
- COUNT查询
- GROUP分组查询和Having子句
- 分页查询
- ORDER BY 排序
- page分页查询
- 方法调用顺序
- Markdown文件
- Beetl 入门
- 定界符号
- 变量
- 算数表达式
- 逻辑表达式
- 控制语句
- 访问变量属性
- 判断对象非空(重要)
- 调用方法
- 自定义方法
- 内置方法
- 标签功能
- 附录
- Idea 插件
- 代码生成
- 多库使用
- 业务主从库
- 主从库延迟问题
- 多个业务库
- 合并多个业务库 1
- 合并多个业务库 2
- 单表多租户
- 每个租户一个表
- 多库多租户
- 使用ShardingSphere
- Saga(试验)
- 关于Saga的一些认识
- 关于隔离性
- BeetlSQL Saga
- SagaMapper
- Saga 多库事务实现
- Saga 微服务 实现
- 配置 Saga Server
- Swagger
- BeetlSQL 性能
- 测试方法
- 最新
- 2021-11-21
- 2020-9-28
- Spring 快速开始
- 环境准备
- 环境搭建
- SpringBoot 快速开始
- 环境准备
- 环境搭建
- 扩展BeetlSQL3
- 完整配置
- BaseMapper定制
- 代码生成
- SQLExecutor定制
- 第三方
- MetadataManager
- JFinal集成
- ExecuteContext
- 参考ACT
- 数据库表到Java对象
- Solon
- NameConversion
- ViewType
- RowMapper
- ResultSetMapper
- AttributeConvert
- BeanConvert
- Fetch
- 代码生成
- 扩展BeetlSQL3
- BaseMapper定制
- SQLExecutor定制
- MetadataManager
- ExecuteContext
- 数据库表到Java对象
- NameConversion
- ViewType
- RowMapper
- ResultSetMapper
- AttributeConvert
- BeanConvert
- Fetch
- 代码生成
- BeetlSQL 多数据库支持
- 多库之间的不同
- 跨库支持实现
- DBStyle
- MySqlStyle 例子
- H2Style例子
- ClickHouseStyle例子
- HBaseStyle例子
- DruidStyle例子
- MetadataManager
- BeanProcessor
- 与BeetlSQL2的区别
- 使用区别