beetsql的sql模板及mapper

beetlsql如果碰到特殊的sql语句怎么办?

那就需要自己动手实现sql语句了。

我们在classpath下新建一个叫sql的文件夹,里面新建个user.md或者user.sql

selectLikeName
===
select * from user 
	where 1 =1 
@if(!isEmpty(name)){
	and name like #name#
@}

然后执行:

       
		Map map = new HashMap<>();
		map.put("name", "%tom%");
		List list = sqlManager.select("user.selectLikeName", User.class, map);
		System.out.println(list);

 这时候发现是查询成功了啊。

问答解析:

1.为什么md或者sql文件要建在sql文件夹下,建在其他地方不好吗?

在Sqlmanager创建的时候,会新建个SQLLoader sqlLoader = new ClasspathLoader();

我们打开下ClasspathLoader的构造方法:

public  ClasspathLoader() {
		this("/sql");
}

可以得知,你什么参数都不写,则默认是classpath/sql

2.md文件或者sql文件是什么?

这个就是sql语句存放的文件了,文件是以beetl模板为基础的。

它的格式就是这样

sql名

===

sql语句



sql名

===

sql语句

一个文件里可以有很多个sql

那么这个sql语句的sqlid就是文件名前缀加上sql名。

比如我上面写的例子,它的sqlid就是user.selectLikeName

那么我就可以使用SqlManager根据sqlid去查询了。

3.为什么sql模板里的定界符是@符号?

因为beetlsql.jar包里,根目录下有了一个btlsql.properties

它里面对定界符做了配置:

DELIMITER_STATEMENT_START=@
DELIMITER_STATEMENT_END=

4.我的user.md模板名字取其他名字行不行?我叫user1.md

最好不要这样,最好和实体类一一对应,因为这个名字还有其他作用。

但这种方式是纯属硬编码,还是比较坑的。

去查询的话要硬编码sqlid

beetsql提供了另一种方案,不必硬编码,这种方案就是mapper方案

我们新建一个UserDao的接口,继承BaseMapper.这个BaseMapper是beetlsql提供的一个接口,里面有很多方法。

然后我们根据user.md里写的sql语句,再写一个方法。sql名对应方法名,包括参数。

import java.util.List;

import org.beetl.sql.core.annotatoin.Param;
import org.beetl.sql.core.mapper.BaseMapper;

import com.bai.btsql.domin.User;

public interface UserDao extends BaseMapper{
	List selectLikeName(@Param("name")String name);
}

那么再试一下:

List list2 = sqlManager.getMapper(UserDao.class).selectLikeName("%tom%");

发现也是可以执行并且成功的 。

这个就不必硬编码了。

而且你还可以使用Basemapper里的一大堆单表操作方法,它里面的方法很多都和SqlManager里面的一样。

那么你需要注意的一点是,命名。

UserDao 对应的就user.md或者user.sql

如果瞎起名,是找不到sql模板的然后调用对应的方法的。

那么如果真的想瞎起名怎么办呢?

beetlsql提供了一个注解@SqlResource

@SqlResource("user")
public interface UserDao extends BaseMapper{
	List selectLikeName(@Param("name")String name);
	@SqlResource("aaa")
	List selectAAA();
}

该注解既可以加在类上,也可以是方法上。对应不同的sql模板。

你可能感兴趣的:(模板)