TkMybatis 是什麼?

一、TkMybatis

Tkmybatis 是基於 Mybatis 框架開發的一個工具,通過調用它提供的方法實現對單表的數據操作,不需要寫任何 sql 語句,這極大地提高了項目開發效率。

二、怎麼用?

1. 引用

在 pom.xml 中引入 tk.mybatis 的引用。

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>

2. DO 對象

@Table(name = "t_plan")
public class PopMerchantPlanDO{

	/**
	 * id
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	/**
	 * 編號
	 */
	private String code;
}

映射數據庫表和實體對象,類似的註解還有 @Column、@ColumnType、@Transient 等等。

3. Mapper 數據庫操作接口

public interface BaseDao<T> extends BaseMapper<T>, MySqlMapper<T>, IdsMapper<T>, ConditionMapper<T>, ExampleMapper<T> {
}

Dao 對象繼承的這些接口幫你封裝了一系列單表的操作,使你不用再爲每個單表編寫繁雜重複的 sql 語句。

當你使用 Dao 對象操作數據庫的時候,只需要調用這些接口中封裝好的方法,就能完成一系列對單表的 CURD 操作,比如下面的 selectAll 方法,鑑於篇幅,更多的 CURD 方法,大家可以打開 Mapper 接口自行查看,一目瞭然。

@RegisterMapper
public interface SelectAllMapper<T> {

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

當然,對於複雜的 SQL 語句,比如 JOIN 操作等等,仍然需要自行編寫 xml 文件和 SQL 語句。

三、底層原理

TkMybatis 的封裝依賴一個 @SelectProvider 註解來完成,如果你使用過 @Select 註解,那麼 @SelectProvider 與它沒有質的區別,只是在定義註解的方式上有所不同, 一個是直接定義 sql, 一個是在外部定義好 sql 直接引用。

public interface Mapper {

    @Select("select uuid,full_name as name from t_system_company ")
    List<Map<String, String>> getCompanyInfo();
}
@RegisterMapper
public interface SelectAllMapper<T> {

    @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
    List<T> selectAll();
}

@SelectProvider 引用的各種 *Provider.class 實現類,就是依賴反射、註解等手段拼接 SQL 語句的過程。

    /**
     * 查詢全部結果
     *
     * @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("<where>");
        sql.append(SqlHelper.whereLogicDelete(entityClass, false));
        sql.append("</where>");

        sql.append(SqlHelper.orderByDefault(entityClass));
        return sql.toString();
    }

四、結語

當初從 Hibernate 換到 Mybatis,把 HQL、QBC 語句的成本換成簡單的 SQL 語句,這?現在又兜兜轉轉回去了?

Tkmybatis 減少了一系列對單表的單調接口和繁雜的 SQL 語句,但也降低了代碼的可讀性,另外這種廣而全的數據庫操作,必然會犧牲一部分的查詢性能。

可以在一些併發量不大、對性能要求不高的項目中嘗試下 Tkmybatis ,對一些比較大的項目來說,還是希望自己對 SQL 的控制更強一點。



相關鏈接:1. mybatis @SelectProvider 註解, 打賭你沒有用過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章