Mybatis - 自定義BaseMapper SQLProvider篇
SQL Provider
- @InsertProvider
- @UpdateProvider
- @DeleteProvider
- @SelectProvider
這些可選的SQL註解允許你指定一個類名和一個方法,在執行時來返回動態的SQL。
@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")
List<User> getUsersByName(String name);
class UserSqlBuilder {
public String buildGetUsersByName(final String name) {
return new SQL(){{
SELECT("*");
FROM("users");
if (name != null) {
WHERE("name like #{value} || '%'");
}
ORDER_BY("id");
}}.toString();
}
}
BaseMapper
我們可以使用 SQLProvider
構建屬於自己的BaseMapper。
public interface BaseMapper<T, K> {
@InsertProvider(type = SqlSourceBuilder.class, method = "build")
public Long insert(T model);
@UpdateProvider(type = SqlSourceBuilder.class, method = "build")
public Long updateById(T model);
@DeleteProvider(type = SqlSourceBuilder.class, method = "build")
public Long deleteById(@Param("id") K id);
@SelectProvider(type = SqlSourceBuilder.class, method = "build")
public T getById(@Param("id") K id);
@SelectProvider(type = SqlSourceBuilder.class, method = "build")
public Boolean existById(@Param("id") K id);
}
SqlSourceBuilder
把用SQLProvider生成的ProviderSqlSource替換成DynamicSqlSource
public class SqlSourceBuilder {
public static String build(Configuration configuration) {
for (MappedStatement mappedStatement : configuration.getMappedStatements()) {
if (mappedStatement.getSqlSource() instanceof ProviderSqlSource) {
Class<?> providerClass = getProviderClass(mappedStatement);
if (providerClass != SqlSourceBuilder.class)
continue;
Class<?> mapperClass = getMapperClass(mappedStatement);
Class<?>[] generics = getMapperGenerics(mapperClass);
Class<?> modelClass = generics[0];
Class<?> primaryFieldClass = generics[1];
ResultMap resultMap = getResultMap(mappedStatement, modelClass);
String sqlScript = getSqlScript(mappedStatement, mapperClass, modelClass, primaryFieldClass, resultMap);
SqlSource sqlSource = createSqlSource(mappedStatement, sqlScript);
setSqlSource(mappedStatement, sqlSource);
}
}
return "sql";
}
...
}
MapperTest 測試
public class MapperTest {
@Test
public void test() throws Exception {
SqlSessionFactory sessionFactory = MybatisConfig.getSessionFactory();
SqlSession session = sessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = null;
// 新增測試
System.out.println("------------ 新增測試 ------------");
user = new User();
user.setId(1L);
user.setAccount("conanli");
user.setPassword("123456");
System.out.println("insert: " + userMapper.insert(user));
// 更新測試
System.out.println("------------ 更新測試 ------------");
user = new User();
user.setId(1L);
user.setPassword("111111");
System.out.println("update: " + userMapper.updateById(user));
// 獲取測試
System.out.println("------------ 獲取測試 ------------");
System.out.println("user: " + userMapper.getById(1L));
// 刪除測試
System.out.println("------------ 刪除測試 ------------");
System.out.println("delete: " + userMapper.deleteById(1L));
// 存在測試
System.out.println("------------ 存在測試 ------------");
System.out.println("exist: " + userMapper.existById(1L));
session.commit();
session.close();
}
}
完整示例:GitHub
PS:本文使用的是mybatis-3.4.4
相關文章
- mybatis 自定義外掛MyBatis
- mybatis-自定義TypeHandler 的坑MyBatis
- MyBatis-Plus Generator自定義模板MyBatis
- 自定義View事件篇進階篇(二)-自定義NestedScrolling實戰View事件
- 工作學習筆記(十九)MyBatis—Plus中的BaseMapper筆記MyBatisAPP
- mybatis自定義List集合解析器MyBatis
- Mybatis使用小技巧-自定義結果集MyBatis
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- Mybatis-plus核心功能-自定義SQLMyBatisSQL
- 自定義View事件之進階篇(四)-自定義Behavior實戰View事件
- Mybatis-plus排除自定義欄位不查詢MyBatis
- 自定義Mybatis自動生成程式碼規則MyBatis
- Android 自定義 View 之入門篇AndroidView
- SpringBoot應用篇(一):自定義starterSpring Boot
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- 疑問:mybatis如何自定義SQL執行時長MyBatisSQL
- 自定義View事件篇進階篇(三)-CoordinatorLayout與BehaviorView事件
- 程式碼演示Mybatis-Generator 擴充套件自定義生成MyBatis套件
- Mybatis-Plus如何自定義SQL隱碼攻擊器?MyBatisSQL
- angular自定義元件-UI元件篇-switch元件Angular元件UI
- 小書MybatisPlus第3篇-自定義SQLMyBatisSQL
- 【朝花夕拾】Android自定義View篇之(四)自定義View的三種實現方式及自定義屬性詳解AndroidView
- 淺析MyBatis(三):聊一聊MyBatis的實用外掛與自定義外掛MyBatis
- 自定義Mybatis-plus外掛(限制最大查詢數量)MyBatis
- 【Android自定義View】繪圖之文字篇(三)AndroidView繪圖
- 【Android自定義View】繪圖之Path篇(二)AndroidView繪圖
- ViewGroup篇:玩一下自定義ViewGroupView
- Springboot快速上手- 第四篇 自定義配置Spring Boot
- Mybatis原始碼分析(七)自定義快取、分頁的實現MyBatis原始碼快取
- Jaskson精講第6篇-自定義JsonSerialize與DeserJSON
- 【朝花夕拾】Android自定義View篇之(十一)View的滑動,彈性滑動與自定義PagerViewAndroidView
- .net自定義錯誤頁面實現升級篇
- PHP DIY 系列------框架篇:5. 自定義配置和路由PHP框架路由
- 全網最詳bpmn.js教材-自定義contextPad篇JSContext
- 【朝花夕拾】Android自定義View篇之(十)TouchSlop及VelocityTrackerAndroidView
- Android View篇之自定義驗證碼輸入框AndroidView
- Unsatisfied dependency expressed through field ‘baseMapper‘ 原因ExpressAPP
- android自定義view(自定義數字鍵盤)AndroidView
- netty自定義Decoder用於自定義協議Netty協議