ibatis.net之我的调整:Update语句的动态set字段
动态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字段的更多相关文章
- oracle中update语句修改多个字段
如需要修改下列数据:表名为student 一般会这样写: update student set sname = '李四', sage = 20, sbirthday = to_date('2010-0 ...
- sql update语句
如果要更新数据库表中的记录,我们就必须使用UPDATE语句. UPDATE语句的基本语法是: UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...; ...
- MySQL update 语句与标准SQL不同的地方
[SQL标准中有一个叫同时执行的概念] 同时执行指的是在同一个子句中的各个部分的执行时机是不区分先后的,如下面的SQL语句 ),); +---------+--------+ ) ) | +----- ...
- 独特的deadlock(仅update语句也能造成死锁)
最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: ...
- MySQL Execution Plan--IN子查询对UPDATE语句影响
问题描述 在系统中发现一条执行时间为为44652.060734秒(12.5小时)的慢SQL,SQL语句为: UPDATE ob_internal_task SET OPERATE_STATUS WHE ...
- Select For update语句浅析 (转)
Select … for update语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句 ...
- Oracle的update语句优化研究
最近研究sql优化,以下文章转自互联网: 1. 语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation s ...
- 使用ABP时报错“UPDATE 语句与 FOREIGN KEY SAME TABLE 约束"FK_dbo.AbpUsers_dbo.AbpUsers_LastModifierUserId"冲突”的解决办法
ABP理论学习总目录 一步一步使用ABP框架搭建正式项目系列教程 ABP之Module-Zero学习目录 本篇目录 问题 原因 解决办法 问题 问题的是在下面这种情况下出现的: 我在使用CodeFir ...
- Oracle Update 语句语法与性能分析 - 多表关联
Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...
随机推荐
- background 和渐变 总结
一,background-position:(图片定位) 三种写法: 1):按%比,左上角最小(0%,0%),右下角最大(100%,%100): 2):(x,y)左上角最小(0,0),右下角最大(ma ...
- PAT 1022 D进制的A+B (20)(20 分)
输入两个非负10进制整数A和B(<=2^30^-1),输出A+B的D (1 < D <= 10)进制数. 输入格式: 输入在一行中依次给出3个整数A.B和D. 输出格式: 输出A+B ...
- iOS.C
iOS开发中C语言的应用: 1. NS_ENUM & NS_OPTIONS http://nshipster.com/ns_enum-ns_options/
- https传输过程嗅探
C1->浏览器告知服务器自身的信息 length = 165 a5 16 03 01 00 A0 01 00 00 9C 03 03 5E 1C 37 CD 40 [ ^ 7 @] B6 4A ...
- dedecms首页搜索 添加仿百度下拉框
1:找到uploads/templets/default/head.htm 2: 找到 <input name="q" type="text" clas ...
- 【搜索】 Prime Path
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include& ...
- stm8 单线串口能收不能发
原因是把连接的TX和RX短接了,其实在TX和RX间要串一个电阻,然后让stm8的单线TX接到RX.
- syslog、日志服务器安装、卸载详解、如何安装和卸载EventLog Analyzer
- kbmmw 与extjs 通过JSON Base64 显示图片
delphi 官网上开始也来越多的介绍delphi与extjs 结合的例子,今天我就把官方的例子翻版一下. 官方使用C++builder 和webbroker 实现. 我使用kbmmw 来实现一下. ...
- Mysql 数据库修改datadir和调整默认引擎要注意的问题
数据库更改 datadir 默认位置: 首先前面的基础操作我就不多说了,无非是复制mysqldata目录,然后修改 my.conf 配置文件 datadir 的 路径地址.然后重启mysql.这里可能 ...