最近在看smartSql源碼,兄弟寫的。寫的很不錯取取經。 記錄下一些學習的東西,剛開始我先不系統的寫了,隨意一點哈,我看的差不多再給大家一個模塊一個模塊系統的寫。 Run方法 sqlRunner第三個參數重點強調下,傳入的是一個委托,返回的是一個泛型T 委托了一個方法傳入,很多人會疑惑這兩個參數我 ...
最近在看smartSql源碼,兄弟寫的。寫的很不錯取取經。
記錄下一些學習的東西,剛開始我先不系統的寫了,隨意一點哈,我看的差不多再給大家一個模塊一個模塊系統的寫。
public T ExecuteScalar<T>(RequestContext context) { T result = _sqlRuner.Run<T>(context, DataSourceChoice.Write, (sqlStr, session) => { return session.Connection.ExecuteScalar<T>(sqlStr, context.Request, session.Transaction); }); CacheManager.TriggerFlush(context); return result; }
Run方法
public T Run<T>(RequestContext context, DataSourceChoice sourceChoice, Func<String, IDbConnectionSession, T> runSql) { IDbConnectionSession session = SmartSqlMapper.SessionStore.LocalSession; if (session == null) { session = SmartSqlMapper.CreateDbSession(sourceChoice); } string sqlStr = SqlBuilder.BuildSql(context); try { T result = runSql(sqlStr, session); return result; } catch (Exception ex) { throw ex; } finally { if (session.LifeCycle == DbSessionLifeCycle.Transient) { session.CloseConnection(); } } }
sqlRunner第三個參數重點強調下,傳入的是一個委托,返回的是一個泛型T
委托了一個方法傳入,很多人會疑惑這兩個參數我並沒有哪裡申明或實例化啥的為啥這邊能使用?
其實這邊委托主要起到了一個描述方法的作用,就是說Run中執行這個委托具體會用哪幾個參數類型,並沒有實際使用意義
T result = runSql(sqlStr, session);
這句話裡面的sqlStr和session分別是通過
SqlBuilder.BuildSql(context)
SmartSqlMapper.SessionStore.LocalSession;獲得。所以runSql就能執行
return session.Connection.ExecuteScalar<T>(sqlStr, context.Request, session.Transaction);
返回T.
這裡其實用的是Dapper的方法,並且自動綁定請求模型和映射返回數據的模型。
至於為啥不直接用dapper去查詢,主要是為了將Sql語句和調用解耦,並且支持熱更新。是對Mybatis和dapper的優勢結合。