🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## BaseMapper定制 Mapper 是BeetlSQL3推荐的的使用方法,你可以编写接口继承BaseMapper,能得到很多内置的CRUD方法,你可以编写自己的BaseMapper. @AutoMapper注解适合作为你的BaseMapper方法,@AutoMapper指明了mapper方法的执行类,如下insert方法的执行类是InsertAMI ```java public interface BaseMapper<T> { /** * 通用插入,插入一个实体对象到数据库,所以字段将参与操作,除非你使用ColumnIgnore注解 *SqlResource * @param entity */ @AutoMapper(InsertAMI.class) void insert(T entity); } ``` InsertAMI非常简单,它是一个MapperInvoke子类,需要实现call方法 ```java public class InsertAMI extends MapperInvoke { @Override public Object call(SQLManager sm, Class entityClass, Method m, Object[] args) { int ret = sm.insert(args[0]); return ret; } } ``` 参数entityClass代表了Mapper的泛型类,参数m代表了被调用的mapper方法,参数args是调用的实际参数 Mapper提供了很多注解,比如@Sql,@Template,@SpringData,@SqlProvider等等,你也许想定义自己的注解来解释mapper执行 这是可行的。以@SpringData为例子, ```java @Target({java.lang.annotation.ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Builder(SpringDataBuilder.class) public @interface SpringData { } ``` 我们可以到此注解被@Builder注解标注,那么所有被@SpringData标注的Mapper方法,都通过SpringDataBuilder类来解释执行。SpringDataBuilder类实现了MapperExtBuilder,职责是构造一个MapperInvoke方法供BeetSQL调用 ```java public class SpringDataBuilder implements MapperExtBuilder { @Override public MapperInvoke parse(Class entity, Method m) { //解析method的方法,得出MapperInvoke } } ``` MapperInvoke会在Mapper方法调用时候被BeetlSQL3调用,MapperInvoke对应Mapper的每一个方法,在InsertAMI中我们已经看到一个实现。 与@SpringData类似的是@SubQuery,定义如下,有兴趣的可以看看SubQueryBuilder的实现,非常简单 ```java @Target({java.lang.annotation.ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Builder(SubQueryBuilder.class) public @interface SubQuery { } ``` 总结一下实现Mapper的自定义注解,是需要定义任何一个注解,并用@Builder(XXX.class) 说明执行类是XXX.class,此执行类需要实现MapperExtBuilder接口,能根据标注的方法,返回一个MapperInvoke执行类 ![](/Users/xiandafu/books/beetlsql3_guide/images/mapper.png)