beetlsql如果碰到特殊的sql语句怎么办?
那就需要自己动手实现sql语句了。
我们在classpath下新建一个叫sql的文件夹,里面新建个user.md或者user.sql
selectLikeName
===
select * from user
where 1 =1
@if(!isEmpty(name)){
and name like #name#
@}
然后执行:
Map<String, String> map = new HashMap<>();
map.put("name", "%tom%");
List<User> 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<User>{
List<User> selectLikeName(@Param("name")String name);
}
那么再试一下:
List<User> list2 = sqlManager.getMapper(UserDao.class).selectLikeName("%tom%");
发现也是可以执行并且成功的 。
这个就不必硬编码了。
而且你还可以使用Basemapper里的一大堆单表操作方法,它里面的方法很多都和SqlManager里面的一样。
那么你需要注意的一点是,命名。
UserDao 对应的就user.md或者user.sql
如果瞎起名,是找不到sql模板的然后调用对应的方法的。
那么如果真的想瞎起名怎么办呢?
beetlsql提供了一个注解@SqlResource
@SqlResource("user")
public interface UserDao extends BaseMapper<User>{
List<User> selectLikeName(@Param("name")String name);
@SqlResource("aaa")
List<User> selectAAA();
}
该注解既可以加在类上,也可以是方法上。对应不同的sql模板。