真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計、網(wǎng)站制作和簡陽服務(wù)器托管的網(wǎng)絡(luò)公司,有著豐富的建站經(jīng)驗和案例。

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

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

例如 selectAll 方法。

首先定義接口:

@RegisterMapper
public interface SelectAllMapper {
  /**
   * 查詢?nèi)拷Y(jié)果
   *
   * @return
   */
  @SelectProvider(type = MySelectProvider.class, method = "dynamicSQL")
  List 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);
  } 
  /**
   * 查詢?nèi)拷Y(jié)果
   *
   * @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 方法中,首先是獲取了當(dāng)前接口的實體類型:

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

因為接口返回值類型為 List,MyBatis 會認(rèn)為返回值類型為 List,這和我們想要的實體類型不一樣,所以下一行代碼就是設(shè)置返回值類型:

setResultType(ms, entityClass);

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

接下來就是純粹的拼接 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));

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

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

首先定義mapper

@RegisterMapper
public interface SelectByKeyAndNotDeletedMapper {
  /**
   * 根據(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("");
    //獲取全部列
    Set columnSet = EntityHelper.getPKColumns(entityClass);
    //當(dāng)某個列有主鍵策略時,不需要考慮他的屬性是否為空,因為如果為空,一定會根據(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("");
    return sql.toString();
  }
}

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

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

最后在通用service中引入,

@Autowired private BasicMapper mapper;

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

public interface UserPOMapper extends BasicMapper {}

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)頁題目:tk.mybatis擴展通用接口使用詳解
網(wǎng)址分享:http://weahome.cn/article/ippedg.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部