最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

tk.mybatis擴展通用接口使用詳解

 更新時間:2019年08月21日 09:18:50   作者:夢飛翔up  
這篇文章主要介紹了tk.mybatis擴展通用接口使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

 一.tk.mybatis已經(jīng)為我們封裝好了許多拆箱即用的通用mapper,但在實際的項目開發(fā)中想必不少小伙伴在數(shù)據(jù)庫設計中都會采用邏輯刪除這種方案,再去使用通用的mapper接口就不行了。

這時候就需要我們封裝一些擴展的通用Mapper接口。

二.項目中提供了大量現(xiàn)成的方法,這些方法可以作為擴展時的參考。

例如 selectAll 方法。

首先定義接口:

@RegisterMapper
public interface SelectAllMapper<T> {
  /**
   * 查詢全部結果
   *
   * @return
   */
  @SelectProvider(type = MySelectProvider.class, method = "dynamicSQL")
  List<T> selectAll();
}

其中 MySelectProvider 是你要實現(xiàn)的一個類,該類需要繼承 MapperTemplate。@RegisterMapper 注解可以避免 mappers 參數(shù)配置,通用 Mapper 檢測到該接口被繼承時,會自動注冊。

import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
public class MySelectProvider extends MapperTemplate {
  public BaseSelectProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
    super(mapperClass, mapperHelper);
  } 
  /**
   * 查詢全部結果
   *
   * @param ms
   * @return
   */
  public String selectAll(MappedStatement ms) {
    final Class<?> entityClass = getEntityClass(ms);
    //修改返回值類型為實體類型
    setResultType(ms, entityClass);
    StringBuilder sql = new StringBuilder();
    sql.append(SqlHelper.selectAllColumns(entityClass));
    sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
    sql.append(SqlHelper.orderByDefault(entityClass));
    return sql.toString();
  }
}

其中 selectAll 方法名要和接口中定義的方法名一致。其次就是該方法的參數(shù)為 MappedStatement類型。

在 selectAll 方法中,首先是獲取了當前接口的實體類型:

final Class<?> entityClass = getEntityClass(ms);

因為接口返回值類型為 List<T>,MyBatis 會認為返回值類型為 List<Object>,這和我們想要的實體類型不一樣,所以下一行代碼就是設置返回值類型:

setResultType(ms, entityClass);

注意,只有返回 T 或者 List 時需要設置,返回 int 類型時不需要設置。

接下來就是純粹的拼接 XML 形式的 SQL 了。

/select col1,col2...
sql.append(SqlHelper.selectAllColumns(entityClass));
//from tablename - 支持動態(tài)表名
sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
//order by xxx
sql.append(SqlHelper.orderByDefault(entityClass));

當你想要實現(xiàn)某種方法時,可以從已有的例子中找一個最接近的方法,在此基礎上進行修改

三.例:根據(jù)主鍵查詢單個實體對象(過濾掉邏輯刪除的實體,注:我的數(shù)據(jù)表邏輯刪除字段定義為enabled_status)

首先定義mapper

@RegisterMapper
public interface SelectByKeyAndNotDeletedMapper<T> {
  /**
   * 根據(jù)主鍵查詢沒有被邏輯刪除的實體
   *
   * @return
   */
  @SelectProvider(type = SelectByKeyNotDeletedProvider.class, method = "dynamicSQL")
  T selectByKeyNotDeleted(Object key);
}

其次定義SelectByKeyNotDeletedProvider

public class SelectByKeyNotDeletedProvider extends MapperTemplate {
  public SelectByKeyNotDeletedProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
    super(mapperClass, mapperHelper);
  }

  public String selectByKeyNotDeleted(MappedStatement ms) {
    final Class<?> entityClass = getEntityClass(ms);
    //將返回值修改為實體類型
    setResultType(ms, entityClass);
    StringBuilder sql = new StringBuilder();
    sql.append(SqlHelper.selectAllColumns(entityClass));
    sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
    sql.append(wherePKColumns(entityClass, false));
    return sql.toString();
  }
  private String wherePKColumns(Class<?> entityClass, boolean useVersion) {
    StringBuilder sql = new StringBuilder();
    sql.append("<where>");
    //獲取全部列
    Set<EntityColumn> columnSet = EntityHelper.getPKColumns(entityClass);
    //當某個列有主鍵策略時,不需要考慮他的屬性是否為空,因為如果為空,一定會根據(jù)主鍵策略給他生成一個值
    for (EntityColumn column : columnSet) {
      sql.append(" AND " + column.getColumnEqualsHolder());
    }
    if (useVersion) {
      sql.append(whereVersion(entityClass));
    }
    //過濾被邏輯刪除的數(shù)據(jù)
    sql.append(" AND enabled_status = 1 ");
    sql.append("</where>");
    return sql.toString();
  }
}

然后定義BasicMapper,讓其繼承通用Mapper接口以及上面自定義的SelectByKeyAndNotDeletedMapper接口。

@tk.mybatis.mapper.annotation.RegisterMapper public interface BasicMapper<T> extends Mapper<T>, SelectByKeyAndNotDeletedMapper<T> { }

最后在通用service中引入,

@Autowired private BasicMapper<T> mapper;

自定義*.Mapper都去繼承BasicMapper<T>即可

public interface UserPOMapper extends BasicMapper<UserPO> {}

注意:最新版本的tk已經(jīng)支持根據(jù)注解@LogicDelete實現(xiàn)邏輯刪除

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Druid之連接創(chuàng)建及銷毀示例詳解

    Druid之連接創(chuàng)建及銷毀示例詳解

    這篇文章主要為大家介紹了Druid之連接創(chuàng)建及銷毀示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java利用trueLicense實現(xiàn)項目離線證書授權操作步驟

    Java利用trueLicense實現(xiàn)項目離線證書授權操作步驟

    文章介紹了如何使用trueLicense實現(xiàn)離線授權控制,包括生成公私鑰、創(chuàng)建證書校驗模塊、生成證書模塊和測試模塊,通過這種方式,可以控制用戶使用的項目模塊、授權周期、使用的設備和服務器,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java.lang.NoClassDefFoundError錯誤的原因及解決方法

    java.lang.NoClassDefFoundError錯誤的原因及解決方法

    這篇文章主要給大家介紹了關于java.lang.NoClassDefFoundError錯誤的原因及解決的相關資料,java.lang.NoClassDefFoundError是Java虛擬機在運行時無法找到特定類的錯誤,需要的朋友可以參考下
    2023-10-10
  • MAC下基于maven使用IDEA走讀TestNG源碼解析

    MAC下基于maven使用IDEA走讀TestNG源碼解析

    這篇文章主要介紹了MAC下基于maven使用IDEA走讀TestNG源碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-06-06
  • Java?方法的重載與參數(shù)傳遞詳解

    Java?方法的重載與參數(shù)傳遞詳解

    在java中,方法就是用來完成解決某件事情或實現(xiàn)某個功能的辦法。方法實現(xiàn)的過程中,會包含很多條語句用于完成某些有意義的功能——通常是處理文本,控制輸入或計算數(shù)值,這篇文章我們來探究一下方法的重載與傳參
    2022-04-04
  • java加解密RSA使用方法代碼示例

    java加解密RSA使用方法代碼示例

    這篇文章主要介紹了java加解密RSA使用方法代碼示例,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • SpringBoot定時調度之Timer與Quartz詳解

    SpringBoot定時調度之Timer與Quartz詳解

    Java?中常用的定時調度框架有以下幾種:Timer、ScheduledExecutorService、Spring?Task和Quartz,本文主要來和大家講講他們的具體使用,需要的可以參考一下
    2023-06-06
  • Java?將list集合數(shù)據(jù)按照時間字段排序的方法

    Java?將list集合數(shù)據(jù)按照時間字段排序的方法

    這篇文章主要介紹了Java?將list集合數(shù)據(jù)按照時間字段排序,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Spring如何基于xml實現(xiàn)聲明式事務控制

    Spring如何基于xml實現(xiàn)聲明式事務控制

    這篇文章主要介紹了Spring如何基于xml實現(xiàn)聲明式事務控制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Maven pom.xml文件中build,plugin標簽的使用小結

    Maven pom.xml文件中build,plugin標簽的使用小結

    本文主要介紹了Maven pom.xml文件中build,plugin標簽的使用小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03

最新評論

历史| 寻甸| 海林市| 建瓯市| 宜兰县| 五指山市| 泾川县| 荔浦县| 黄山市| 栾城县| 红原县| 延庆县| 宽城| 成武县| 扎兰屯市| 拉萨市| 福州市| 织金县| 托克托县| 普格县| 奈曼旗| 盐边县| 哈巴河县| 钟祥市| 乐至县| 嘉荫县| 闽侯县| 廉江市| 彰武县| 漳浦县| 会昌县| 沾化县| 林州市| 安丘市| 张家港市| 宁都县| 长垣县| 龙南县| 绍兴市| 金沙县| 广宁县|