动态Update语句

如果Map中指定多个字段

    <update id="UpdateStaff">
update Staff set Name=#Name#,InDate=#InDate# where StaffId=#StaffId#
</update>

使用以下代码会有麻烦

第25行注释掉的话,你会发现InDate会被设置为null.而实际的工作我们并不希望一行数据所有字段都刷新一次,因为在大型系统里每次都这样做的话,风险太高。

如果只更新指定的字段的内容呢,已有人做出尝试,我觉得不错。
https://www.cnblogs.com/myitroad/p/5516963.html

但我觉得应调整原有的机制(改源代码),减少日常的开发工作。我准备使用“UpdateSetClip"代替Set部分

    <update id="UpdateStaff">
update Staff set [UpdateSetClip] where StaffId=#StaffId#
</update>

好了,修改好sqlMap,不断的跑代码,不断的调整程序,直到满意:)

这是调整的位置,使用了一个新增的方法CreateDync,意思为动态创建

以下是主要代码,源代码文件:IBatisNet.DataMapper.Commands.DefaultPreparedCommand.cs

public void CreateDync(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject)
{
request.IDbCommand = new DbCommandDecorator(session.CreateCommand(statement.CommandType), request);
//request.PreparedStatement.()
if (_logger.IsDebugEnabled)
{
_logger.Debug("Statement Id: [" + statement.Id + "] PreparedStatement : [" + request.IDbCommand.CommandText + "]");
} ApplyParameterMap(session, request.IDbCommand, request, statement, parameterObject);
//
string lastSql = applyParameterDyncSetClip(session, request.IDbCommand, request, statement, parameterObject);
request.IDbCommand.CommandText = lastSql;
}
/// <summary>
/// 应用动态字段set语句
/// </summary>
/// <param name="session"></param>
/// <param name="command"></param>
/// <param name="request"></param>
/// <param name="statement"></param>
/// <param name="parameterObject"></param>
private string applyParameterDyncSetClip(ISqlMapSession session, IDbCommand command,
RequestScope request, IStatement statement, object parameterObject)
{
Dictionary<string, object> dict = parameterObject as Dictionary<string, object>;//将参数转为字典
if (dict == null)
return request.PreparedStatement.PreparedSql; string _updateStr = "";//动态Set部分,以空格开始
int index = request.PreparedStatement.DbParametersName.Count;
foreach (var one in dict)//build command set DataParameter
{
if (request.PreparedStatement.DbParametersName.Contains(one.Key))
continue;
index++;
IDbDataParameter parameterCopy = request.IDbCommand.CreateParameter();
parameterCopy.ParameterName = string.Format("{0}param{1}", session.DataSource.DbProvider.ParameterPrefix, index);
parameterCopy.Value = one.Value;
request.IDbCommand.Parameters.Add(parameterCopy);
_updateStr += string.Format("{0} = {1},", one.Key, parameterCopy.ParameterName);
}
_updateStr = _updateStr.TrimEnd(',');
return request.PreparedStatement.PreparedSql.Replace("[UpdateSetClip]", _updateStr);
}

  细心的朋友会发现这个只支持字典,是的。字典(key/value)将是开源HIS中经常会见到。其实XML、Json都可以使用key/value来表示。所以自定义类似乎并不是必选项。当然实体类(属性对应表的字段)依然是推荐的技术手段。真正讨论开源HIS源码的时候再详谈。

ibatis.net之我的调整:Update语句的动态set字段的更多相关文章

  1. oracle中update语句修改多个字段

    如需要修改下列数据:表名为student 一般会这样写: update student set sname = '李四', sage = 20, sbirthday = to_date('2010-0 ...

  2. sql update语句

    如果要更新数据库表中的记录,我们就必须使用UPDATE语句. UPDATE语句的基本语法是: UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; ...

  3. MySQL update 语句与标准SQL不同的地方

    [SQL标准中有一个叫同时执行的概念] 同时执行指的是在同一个子句中的各个部分的执行时机是不区分先后的,如下面的SQL语句 ),); +---------+--------+ ) ) | +----- ...

  4. 独特的deadlock(仅update语句也能造成死锁)

    最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: ...

  5. MySQL Execution Plan--IN子查询对UPDATE语句影响

    问题描述 在系统中发现一条执行时间为为44652.060734秒(12.5小时)的慢SQL,SQL语句为: UPDATE ob_internal_task SET OPERATE_STATUS WHE ...

  6. Select For update语句浅析 (转)

    Select … for update语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句 ...

  7. Oracle的update语句优化研究

    最近研究sql优化,以下文章转自互联网: 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation s ...

  8. 使用ABP时报错“UPDATE 语句与 FOREIGN KEY SAME TABLE 约束"FK_dbo.AbpUsers_dbo.AbpUsers_LastModifierUserId"冲突”的解决办法

    ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 问题 原因 解决办法 问题 问题的是在下面这种情况下出现的: 我在使用CodeFir ...

  9. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

随机推荐

  1. Django日志系统

    在Django中使用的日志系统是基于Python中的loggin模块. 首先简单介绍下logging. 一 Loggin模块简介 loggin模块主要包含以下四个部分: Loggers        ...

  2. asp.net core mvc 统一过滤参数,防止注入漏洞攻击

    参考链接: http://www.lanhusoft.com/Article/132.html 在core下,多少有些改动,其中js部分被注释掉了,如下: public static string F ...

  3. 长时间没有操作putty就会断开连接是怎么回事?

    seconds between keepalives 设置为10就好了, 这个值有什么含义,服务器为了节省资源采取了一些措施,其中一条就是如果检测一个会话(session)几分钟或者几小时没有数据流入 ...

  4. Phong和Blinn-Phong光照模型

    Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.Phong模型 Phone模型计算中的一个关键步骤就是反射向量R的计算: 上图中的位于表面“下面”的向 ...

  5. PAT 1031 查验身份证(15)(C++&Python)

    1031 查验身份证(15)(15 分) 一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8, ...

  6. idea 高级调试技巧

    两年前写过一篇关于idea的高级用法,今天再来一篇关于调试方面的技巧讲解: 一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图,在断点的位置,右 ...

  7. Vsphere初试——架设Panabit行为管理

    Panabit是目前国内X86平台单板处理能力最高(双向40G).提供免费版本(软件形态),是以DPI为核心优势并发展起来的最专业.上线效果最好.性价比最高的新一代应用网关.Panabit流控引擎,基 ...

  8. Python的程序入口 __name__属性

    python中每个模块都有一个 '__name__' 属性,当其值为 '__main__' 时,表名该模块自身在运行,否则是被引入的. 当一个模块被当做一个整体调用的时候,模块名.__name__ 的 ...

  9. About the Cron Expression

    About the Cron Expression Cron is use in Linux for the time schedule Format Seconds Minutes Hours Da ...

  10. 2019,UI设计师必备神器

      2019年将会是你全新起航的一年,相信你已经制定了很多规划,正在开启第一步的推动. 作为对UI设计师更大程度的支持,今天特意为你分享一款释放你双手的设计神器.让你可以把时间和精力投入到设计本身,这 ...