🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### ResultSetMapper ResultSetMapper对象相当于告诉BeetlSQL,不需要BeetlSQL来映射,交给ResultSetMapper来实现,比如一个select join结果需要映射到复杂的对象上(比如一个用户有多个角色,属于多个组织),BeetlSQL自带了JsonConfigMapper实现,用json来申明如何映射,类似MyBatis用xml来申明如何映射 ```java String sql = "select d.id id,d.name name ,u.id u_id,u.name u_name " + " from department d join beetlSQLSysUser u on d.id=u.department_id where d.id=?"; Integer deptId = 1; SQLReady ready = new SQLReady(sql,new Object[]{deptId}); List<DepartmentInfo> list = sqlManager.execute(ready,DepartmentInfo.class); @Data @ResultProvider(JsonConfigMapper.class) @JsonMapper( "{'id':'id','name':'name','users':{'id':'u_id','name':'u_name'}}") public static class DepartmentInfo { Integer id; String name; List<UserInfo> users; } ``` 注解ResultProvider提供了一个ResultSetMapper实现类,@JsonMapper是一个配置注解,与ResultProvider搭档,提供额外配置,JsonMapper支持配置在java代码里,或者通过文件配置 > Pojo类上所有注解都在`ClassAnnotation`类上存放,ResultProvider和JsonMapper 被缓存在ClassAnnotation类里,因为JsonMapper注解被`ProviderConfig`注解所申明,所以他俩是一对一 > > ``` > @ProviderConfig() > public @interface JsonMapper { > String value() default ""; > String resource() default ""; > } > > ``` > > ClassAnnotation 不仅仅寻找ResultProvider注解,也寻找使用了@ProviderConfig()的注解,并作为配置注解放在一起。BeetlSQL大量使用这种注解的注解,来提供扩展机制 JsonConfigMapper定义如下 ```java public class JsonConfigMapper extends ConfigJoinMapper { protected AttrNode parse(ExecuteContext ctx, Class target, ResultSetMetaData rsmd, Annotation config){ } } ``` ConfigJoinMapper 是基类,他会根据AttrNode描述来做映射,因此JsonConfigMapper只需要读取config注解申明的配置,然后转化成AttrNode即可,如果你想让配置是yml或者xml,可以实现parse方法即可