最近在看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的优势结合。