动态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. js实现各种复制到剪贴板的方法

    一.实现点击按钮,复制文本框中的的内容 <script type="text/javascript"> function copyUrl2() { var Url2=d ...

  2. xml转化为Dictionary

    代码 public SortedDictionary<string, object> FromXml(string xml) { SortedDictionary<string, o ...

  3. Java中的forin语句

    forin的原理 forin语句是JDK5版本的新特性,在此之前,遍历数组或集合的方法有两种:通过下标遍历和通过迭代器遍历.先举个例子: @Test public void demo() { Stri ...

  4. slam14讲证明构成李代数

  5. Selenium+PhantomJS

    Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...

  6. python httplib2应用get post

    import httplib2,time #装饰器方法,用于记录方法消耗时间 #推荐将print 改成log def timer(func):     def _warpper(self,*argv) ...

  7. Scrapy shell调试返回403错误

    一.问题描述 有时候用scrapy shell来调试很方便,但是有些网站有防爬虫机制,所以使用scrapy shell会返回403,比如下面 C:\Users\fendo>scrapy shel ...

  8. Linux 开启定时计划任务

    1.crontab 编辑“crontab -e # m h dom mon dow command30 18 * * * lynx -dump http://admin.koala.xxx 30 18 ...

  9. java 多态的深入理解

    简单来说 : 多态 能够很好的解决代码耦合性的问题 考虑这样一个场景 有个人 买了辆捷达汽车 .这个系统应该如何设计呢? public class JettaCar { public void run ...

  10. Tomcat优化详细1

    在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整.由于Tomcat的运行依赖于J ...