zoukankan      html  css  js  c++  java
  • 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的优势结合。



  • 相关阅读:
    解决在Pycharm中无法显示代码提示的问题
    解决在使用pip list时出现DEPRECATION
    Pycharm 有些库(函数)没有代码提示
    Oracle 11.2.0.4 For Windows 64bit+32bit 数据库
    Windows系统下oracle数据库每天定时备份
    PowerDesigner表创建脚本双引号问题
    Oracle11g 创建数据库中问题处理(必须运行Netca以配置监听程序)
    名人名言
    项目管理
    项目管理心得:一个项目经理的个人体会、经验总结(zz)
  • 原文地址:https://www.cnblogs.com/alwaysfly/p/SmartSql_Run.html
Copyright © 2011-2022 走看看