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.md")
public interface UserDao extends BaseMapper<User>{
List<User> selectLikeName(@Param("name")String name);
@SqlResource("aaa.md")
List<User> selectAAA();
}
該註解既可以加在類上,也可以是方法上。對應不同的sql模板。