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 註解,打賭你沒有用過