XQL 文件接口映射

类似于 MyBatis 的 XQL 绑定接口,支持已注册到 XQLFileManagerXQL文件映射( BakiDao#proxyXQLMapper )到标记了注解 @XQLMapper 的接口,通过动态代理调用方法来执行相应的查询等操作。

ExampleMapper mapper = baki.proxyXQLMapper(ExampleMapper.class)

example.xql

/*[queryGuests]*/
select * from test.guest where id = :id;

/*[addGuest]*/
insert into test.guest(name, address, age)values (:name, :address, :age);

ExampleMapper.java

@XQLMapper("example")
public interface ExampleMapper {
  List<DataRow> queryGuests(Map<String, Object> args);
  
  @XQL(value = "queryGuests")
  Optional<Guest> findById(@Arg("id") int id);
  
  @XQL(type = SqlStatementType.insert)
  int addGuest(DataRow dataRow);
}

@XQLMapper 注解中的值对应 XQLFileManager 中已注册的 XQL 文件别名。

如果装有 Rabbit SQL 插件,可以使用插件来快速生成接口,参考指南 IDEA 插件

接口规范

如果接口方法标记了以下特殊注解,将忽略接口的映射关系,并执行此注解的具体操作:

接口方法不能定义默认实现 default 方法。

映射规则

默认情况下,所有方法均根据前缀来确定执行类型,并且SQL名字接口方法一一对应,如果不对应的情况下,使用注解 @XQL(value = "sql名",type = SqlStatementType.insert) 来指定具体的sql名字和覆盖默认行为 unset,接口方法定义需遵循如下规范:

sql类型 方法前缀
select select | query | find | get | fetch | search | list
insert insert | save | add | append | create
update update | modify | change
delete delete | remove
batch batch
procedure / function call | proc | func

参数类型

返回值类型

接口方法返回值类型定义如下表:

返回类型 sql类型 备注
List<DataRow/Map<String,Object>/<JavaBean>> query
Set<DataRow/Map<String,Object>/<JavaBean>> query
Stream<DataRow/Map<String,Object>/<JavaBean>> query
Optional<DataRow/Map<String,Object>/<JavaBean>> query
Map<String,Object> query
PagedResource<DataRow/Map<String,Object>/<JavaBean>> query @CountQuery@PageableConfig
IPageable query @CountQuery@PageableConfig
Long , Integer , DoubleStringBoolean query
<JavaBean> query
DataRow query, procedure, function, plsql, ddl, unset, insert, update, delete
int/Integer insert, update, delete
BatchResult batch

分页查询配置

如果方法返回值类型为 PagedResourceIPageable 可配置更多的参数。

条数查询配置:默认情况下,条数查询语句将使用简单的 count(*) 语句来构建,例如:

select count(*) from ( /*你的查询语句*/ );

可通过注解 @CountQuery() ,自定义条数查询语句。

分页参数配置 @PageableConfig 属性:

通过插件来配置分页参数,参数对应如上图。

Spring Boot 自动扫描机制:通过在启动类上加上注解 @XQLMapperScan 来实现自动生成代理,即可注入使用,具体可参考文档 集成 Spring Boot最佳实践