🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 单表多租户 多租户有多种实现方式,最简单是单表里通过tenant_id字段区分当前租户。因此每次数据库操作都必须带上此租户值。有时候为了安全考虑,交给程序员手工每次设置租户id会容易出错, BeetlSQL有俩种方法来实现自动赋值。 第一种是在POJO自动里定义tenantId属性,负责可以通过注解 ```java @Data @Table(name="order") public class Order extends TeantValue{ @AssingId private String id; } ``` 这里的TeantValue 定义如下 ```java @TeantId private String teantId; ``` 这里的@TeanId是用户自定义的BeetlSQL 注解,可以参考《数据模型》中的《AttributeConvert》 自定义一个注解动态赋值 ```java @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.METHOD, ElementType.FIELD}) @Builder(TeantIdConvert.class) public static @interface TeantId { } ``` 如上申明一个@TeantId,动态给POJO赋值租户信息,实现类TeantIdConvert ```java public static class TeantIdConvert implements AttributeConvert { public Object toDb(ExecuteContext ctx, Class cls, String name, Object pojo) { String teantId= (String)getCurrent(); //getCurrent方法获取租户id return teantId; } } ``` 对于SQL语句里自动赋值,可以利用SQLManagerExetned(参考SQLManager),为所有的beetlsql提供额外的租户参数,比如 ```java public class MyParaExtend extends ParaExtend { public Map morePara(ExecuteContext ctx){ HashMap map = new HashMap(); map.put("tenantId",TenantLocal.get()); return map; } } ``` sqlManger.getSqlManagerExtend().setParaExtend(new MyParaExtend()); 则生效。sql模板里则可以自动使用 tenantId参数 ```sql select * from order where tenant_id=#{teantId} ``` 如果想把分库做的酷炫,如上方式可以换一种实现方式,这里提供一个基本思路,未来有时间,会把例子写到源码samples里 使用jsr269注解处理器,可以在任意POJO上自动增加teantId注解,比如 ```java @Data @Table(name="order") @Teantable //编译时刻自动代码生成 public class Order extends TeantValue{ @AssingId private String id; } ``` @Teantable注解如果能被注解处理器识别,自动生成如下代码而不需要手工编写 ```java @Data @Table(name="order") public class Order extends TeantValue{ @AssingId private String id; @TeantId private String teantId; } ``` > 我的另外一本书包含了jsr269注解处理器的说明