欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

tk.mybatis擴(kuò)展通用接口使用詳解

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

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

這時(shí)候就需要我們封裝一些擴(kuò)展的通用Mapper接口。

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

例如 selectAll 方法。

首先定義接口:

@RegisterMapper
public interface SelectAllMapper<T> {
  /**
   * 查詢?nèi)拷Y(jié)果
   *
   * @return
   */
  @SelectProvider(type = MySelectProvider.class, method = "dynamicSQL")
  List<T> selectAll();
}

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

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);
  } 
  /**
   * 查詢?nèi)拷Y(jié)果
   *
   * @param ms
   * @return
   */
  public String selectAll(MappedStatement ms) {
    final Class<?> entityClass = getEntityClass(ms);
    //修改返回值類型為實(shí)體類型
    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 方法中,首先是獲取了當(dāng)前接口的實(shí)體類型:

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

因?yàn)榻涌诜祷刂殿愋蜑?List<T>,MyBatis 會(huì)認(rèn)為返回值類型為 List<Object>,這和我們想要的實(shí)體類型不一樣,所以下一行代碼就是設(shè)置返回值類型:

setResultType(ms, entityClass);

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

接下來(lái)就是純粹的拼接 XML 形式的 SQL 了。

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

當(dāng)你想要實(shí)現(xiàn)某種方法時(shí),可以從已有的例子中找一個(gè)最接近的方法,在此基礎(chǔ)上進(jìn)行修改

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

首先定義mapper

@RegisterMapper
public interface SelectByKeyAndNotDeletedMapper<T> {
  /**
   * 根據(jù)主鍵查詢沒(méi)有被邏輯刪除的實(shí)體
   *
   * @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);
    //將返回值修改為實(shí)體類型
    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);
    //當(dāng)某個(gè)列有主鍵策略時(shí),不需要考慮他的屬性是否為空,因?yàn)槿绻麨榭眨欢〞?huì)根據(jù)主鍵策略給他生成一個(gè)值
    for (EntityColumn column : columnSet) {
      sql.append(" AND " + column.getColumnEqualsHolder());
    }
    if (useVersion) {
      sql.append(whereVersion(entityClass));
    }
    //過(guò)濾被邏輯刪除的數(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實(shí)現(xiàn)邏輯刪除

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java基本教程之java線程等待與java喚醒線程 java多線程教程

    java基本教程之java線程等待與java喚醒線程 java多線程教程

    這篇文章主要介紹了對(duì)線程等待/喚醒方法,文中使用了多個(gè)示例,大家參考使用吧
    2014-01-01
  • java基礎(chǔ)知識(shí) super和this使用解析

    java基礎(chǔ)知識(shí) super和this使用解析

    這篇文章主要介紹了java基礎(chǔ)知識(shí) super和this使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • JVM常用指令速查表

    JVM常用指令速查表

    總結(jié)了一個(gè) JVM 常用指令速查表,今天分享給大家!,需要的朋友可以參考下
    2020-02-02
  • java繪制五子棋棋盤(pán)

    java繪制五子棋棋盤(pán)

    這篇文章主要為大家詳細(xì)介紹了java繪制五子棋棋盤(pán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • SpringBoot2.x 集成 Thymeleaf的詳細(xì)教程

    SpringBoot2.x 集成 Thymeleaf的詳細(xì)教程

    本文主要對(duì)SpringBoot2.x集成Thymeleaf及其常用語(yǔ)法進(jìn)行簡(jiǎn)單總結(jié),其中SpringBoot使用的2.4.5版本。對(duì)SpringBoot2.x 集成 Thymeleaf知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • java實(shí)現(xiàn)上傳文件類型檢測(cè)過(guò)程解析

    java實(shí)現(xiàn)上傳文件類型檢測(cè)過(guò)程解析

    這篇文章主要介紹了java實(shí)現(xiàn)上傳文件類型檢測(cè)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 解決SpringMVC攔截器path路徑的坑

    解決SpringMVC攔截器path路徑的坑

    這篇文章主要介紹了解決SpringMVC攔截器path路徑的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于Java編寫(xiě)第一個(gè)區(qū)塊鏈項(xiàng)目

    基于Java編寫(xiě)第一個(gè)區(qū)塊鏈項(xiàng)目

    區(qū)塊鏈?zhǔn)欠植际綌?shù)據(jù)存儲(chǔ)、點(diǎn)對(duì)點(diǎn)傳輸、共識(shí)機(jī)制、加密算法等計(jì)算機(jī)技術(shù)的新型應(yīng)用模式,下面這篇文章主要給大家介紹了基于Java實(shí)現(xiàn)區(qū)塊鏈的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法

    Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法

    這篇文章主要介紹了Java 根據(jù)網(wǎng)址查詢DNS/IP地址的方法,具體實(shí)現(xiàn)代碼,大家參考下本文
    2017-12-12
  • java教程之java注解annotation使用方法

    java教程之java注解annotation使用方法

    這篇文章主要介紹了java注解annotation使用方法,注解可以定義到方法上,類上,一個(gè)注解相當(dāng)與一個(gè)類,就相當(dāng)于實(shí)例了一個(gè)對(duì)象,加上了注解,就相當(dāng)于加了一個(gè)標(biāo)志
    2014-01-01

最新評(píng)論