SmartSql漫談


最近在看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的優勢結合。



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM