SmartSql漫谈

摘要:
{returnsession.Connection.ExecuteScalar<session.Transaction);}stringsqlStr=SqlBuilder.BuildSql(上下文);会话);returnresult;}catch(Exceptionex){投掷器;

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



免责声明:文章转载自《SmartSql漫谈》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IDEA及IDEA汉化包CDN调度器HAProxy、Nginx、Varnish下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Effective java -- 1

写博客我也不知道是不是一个好习惯,但是目前还不知道有什么其他更有效率的学习方法。现在的学习方法:看书,写博客。如果看明白一个东西,去写博客的话,这通常是一个浪费时间的行为,但是这个过程同样帮助自己二次记忆。并不知道写博客到底好不好。就先按照这个来吧。开始新的一本书,《Effective Java》 第一条:考虑用静态工厂方法代替构造器优点 静态工厂有名称...

Eclipse创建Maven多模块工程Module开发(图文教程)

自己研究了下Eclipse用Maven多模块工程Module开发,跟大家分享一下! 功能模块来分Module,跟java的package类似,一般是按照的功能模块分module,比如:sso/cas/portal/activity/system,具体可根据需要 例如下面一个某系统的module --module-test-common公共部分 --modu...

wpf简单进度条

UserControl x:Class="WpfApplication1.UserControl2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:...

pytest 1.简单介绍一,安装和如何运行

一、pytest是一个接口测试框架,试用版起来比较轻便灵活。首先来介绍他的安装: 直接使用命令 : pip install -U pytest 通过命令 :pytest --version  来查看版本信息 二、首先来创建第一个简单的demo,可以在pycharm里面创建,并且运行,运行只需要配置一下就可以 # content of test_1.py d...

如何禁止 iPhone Safari video标签视频自动全屏?

最近做一个移动端微信页面项目,在微信页面中有视频播放,但是需要禁止IOS的自动全屏播放(前提必须使用video标签)。如: <video id="post" autoplay loop preload="auto"> <source src="foo.mp4" type="video/mp4"> </video> 在...

uniapp将时间日期格式化的组件unidateformat的用法

uniapp开发时,我们需要将数据库里取到的时间戳格式化为某个格式的日期时间形式,uniapp官方插件市场的uni-dateformat组件即可解决。 uniapp官方插件地址及详细用法介绍:https://ext.dcloud.net.cn/plugin?id=3279 刚开始用时,显示日期时间为1970年,只要给数据库里的值乘以1000即可, 如,我们...