TKmybatis的框架介紹和原理解析
一、TkMybatis
Tkmybatis 是基于 Mybatis 框架開發(fā)的一個工具,通過調(diào)用它提供的方法實(shí)現(xiàn)對單表的數(shù)據(jù)操作,不需要寫任何 sql 語句,這極大地提高了項(xiàng)目開發(fā)效率。
二、怎么用?
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;
}
映射數(shù)據(jù)庫表和實(shí)體對象,類似的注解還有 @Column、@ColumnType、@Transient 等等。
3. Mapper 數(shù)據(jù)庫操作接口
public interface BaseDao<T> extends BaseMapper<T>, MySqlMapper<T>, IdsMapper<T>, ConditionMapper<T>, ExampleMapper<T> {
}
Dao 對象繼承的這些接口幫你封裝了一系列單表的操作,使你不用再為每個單表編寫繁雜重復(fù)的 sql 語句。
當(dāng)你使用 Dao 對象操作數(shù)據(jù)庫的時候,只需要調(diào)用這些接口中封裝好的方法,就能完成一系列對單表的 CURD 操作,比如下面的 selectAll 方法,鑒于篇幅,更多的 CURD 方法,大家可以打開 Mapper 接口自行查看,一目了然。
@RegisterMapper
public interface SelectAllMapper<T> {
/**
* 查詢?nèi)拷Y(jié)果
*
* @return
*/
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
List<T> selectAll();
}
當(dāng)然,對于復(fù)雜的 SQL 語句,比如 JOIN 操作等等,仍然需要自行編寫 xml 文件和 SQL 語句。
三、底層原理
TkMybatis 的封裝依賴一個 @SelectProvider 注解來完成,如果你使用過 @Select 注解,那么 @SelectProvider 與它沒有質(zhì)的區(qū)別,只是在定義注解的方式上有所不同, 一個是直接定義 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 實(shí)現(xiàn)類,就是依賴反射、注解等手段拼接 SQL 語句的過程。
/**
* 查詢?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("<where>");
sql.append(SqlHelper.whereLogicDelete(entityClass, false));
sql.append("</where>");
sql.append(SqlHelper.orderByDefault(entityClass));
return sql.toString();
}
四、結(jié)語
當(dāng)初從 Hibernate 換到 Mybatis,把 HQL、QBC 語句的成本換成簡單的 SQL 語句,這?現(xiàn)在又兜兜轉(zhuǎn)轉(zhuǎn)回去了?
Tkmybatis 減少了一系列對單表的單調(diào)接口和繁雜的 SQL 語句,但也降低了代碼的可讀性,另外這種廣而全的數(shù)據(jù)庫操作,必然會犧牲一部分的查詢性能。
可以在一些并發(fā)量不大、對性能要求不高的項(xiàng)目中嘗試下 Tkmybatis ,對一些比較大的項(xiàng)目來說,還是希望自己對 SQL 的控制更強(qiáng)一點(diǎn)。
相關(guān)鏈接:1. mybatis @SelectProvider 注解, 打賭你沒有用過
相關(guān)文章
MyBatis批量插入/修改/刪除MySql數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于MyBatis批量插入/修改/刪除MySql數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
springboot使用logback文件查看錯誤日志過程詳解
這篇文章主要介紹了springboot使用logback文件查看錯誤日志過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
Java 采用反射獲取class屬性值的實(shí)現(xiàn)代碼
以下是對在Java中采用反射獲取class屬性值的實(shí)現(xiàn)代碼進(jìn)行了分析介紹,需要的朋友可以過來參考下2013-08-08
Java微信公眾平臺開發(fā)(8) 多媒體消息回復(fù)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第八步,微信多媒體消息回復(fù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
java實(shí)現(xiàn)商品信息管理系統(tǒng)

