多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 动态模型 当系统自动生成表时候,又不想使用Map作为beetlsql参数来操作这些表,可以使用BeetSQL提供的扩展包,向操作POJO一样操作这些动态表 ```xml <dependency> <groupId>com.ibeetl</groupId> <artifactId>sql-dynamic-table</artifactId> <version>${version}</version> </dependency> ``` 使用方式举例如下,使用DynamicEntityLoader来获取一个动态表对应的动态类 ```java SQLManager sqlManager = getSQLManager(); int max = 5; //创建5个表 for(int i=0;i<max;i++){ String dml="create table my_table"+i+"(id int NOT NULL" + ",name varchar(20)" + ",PRIMARY KEY (`id`)" + ") "; sqlManager.executeUpdate(new SQLReady(dml)); } // 配置加载类,使用默认的BassEntity,也可以使用任何类作为父类,比如MyOfficeEntity DynamicEntityLoader<BaseEntity> dynamicEntityLoader = new DynamicEntityLoader(sqlManager); for(int i=0;i<max;i++){ Class<? extends BaseEntity> c = dynamicEntityLoader.getDynamicEntity("my_table"+i); long count = sqlManager.allCount(c); System.out.println(count); } for(int i=0;i<max;i++){ Class<? extends BaseEntity> c = dynamicEntityLoader.getDynamicEntity("my_table"+i); BaseEntity obj = c.newInstance(); obj.setValue("id",1); obj.setValue("name","hello"); sqlManager.insert(obj); } ``` dynamicEntityLoader.getDynamicEntity方法本质上会根据表,生成一个临时的POJO类(参考 beetlsql代码生成),,返回的是baseEntity的一个子类(可以通过debug 看到这个子类,就是一个跟表对应的JavaBean) 使用此类操作的时候,beetlsql就当成一个普通的POJO类,如下代码allCout将访问my_table 表 ```java Class<? extends BaseEntity> c = dynamicEntityLoader.getDynamicEntity("my_table"); long count = sqlManager.allCount(c); ``` BaseEntity是扩展包内置的的类,所有生成的类都是BaseEntity的子类,比如my_table表 ``` @Table(name="mytable") public class MyTable exends BaseEntity{ @AssingId private Integer id; private String name; } ``` BaseEntity具有setValue和getValue方法,通过反射用于程序设置POJO属性. ```java public class BaseEntity { public void setValue(String attrName,Object value){ MethodInvoker methodInvoker = ObjectUtil.getInvokder(this.getClass(),attrName); if(methodInvoker==null){ throw new IllegalArgumentException("不存在的属性 "+attrName); } methodInvoker.set(this,value); } public Object getValue(String attrName){ MethodInvoker methodInvoker = ObjectUtil.getInvokder(this.getClass(),attrName); if(methodInvoker==null){ throw new IllegalArgumentException("不存在的属性 "+attrName); } return methodInvoker.get(this); } } ``` dynamicEntityLoader.getDynamicEntity也可以使用其他父类作为生成的POJO的父亲对象,比如 ```java Class<? extends MyOfficeEntity> c = dynamicEntityLoader.getDynamicEntity("my_table"+i,MyOfficeEntity.class); ``` 可以有如下定义,假设所有表都有id列 ```java public abstract MyOfficeEntity { public abstract Integer getId(); public abstract void setId(Integer id); public abstract String getName(); public abstract void setName(String name); } ```