继承AbstractXmlElementGenerator类,覆盖addElements方法:public class SaveOrUpdate extends AbstractXmlElementGenerator {

public SaveOrUpdate() {

super();

}

@Override

public void addElements(XmlElement parentElement) {

XmlElement answer = new XmlElement("insert"); //$NON-NLS-1$

answer.addAttribute(new Attribute("id", "saveOrUpdate")); //$NON-NLS-1$

FullyQualifiedJavaType parameterType = introspectedTable.getRules().calculateAllFieldsClass();

answer.addAttribute(new Attribute("parameterType", //$NON-NLS-1$

parameterType.getFullyQualifiedName()));

context.getCommentGenerator().addComment(answer);

GeneratedKey gk = introspectedTable.getGeneratedKey();

if (gk != null) {

IntrospectedColumn introspectedColumn = introspectedTable.getColumn(gk.getColumn());

// if the column is null, then it's a configuration error. The

// warning has already been reported

if (introspectedColumn != null) {

if (gk.isJdbcStandard()) {

answer.addAttribute(new Attribute("useGeneratedKeys", "true")); //$NON-NLS-1$ //$NON-NLS-2$

answer.addAttribute(new Attribute("keyProperty", introspectedColumn.getJavaProperty())); //$NON-NLS-1$

answer.addAttribute(new Attribute("keyColumn", introspectedColumn.getActualColumnName())); //$NON-NLS-1$

} else {

answer.addElement(getSelectKey(introspectedColumn, gk));

}

}

}

StringBuilder sb = new StringBuilder();

sb.append("insert into "); //$NON-NLS-1$

sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());

answer.addElement(new TextElement(sb.toString()));

XmlElement insertTrimElement = new XmlElement("trim"); //$NON-NLS-1$

insertTrimElement.addAttribute(new Attribute("prefix", "(")); //$NON-NLS-1$ //$NON-NLS-2$

insertTrimElement.addAttribute(new Attribute("suffix", ")")); //$NON-NLS-1$ //$NON-NLS-2$

insertTrimElement.addAttribute(new Attribute("suffixOverrides", ",")); //$NON-NLS-1$ //$NON-NLS-2$

answer.addElement(insertTrimElement);

XmlElement valuesTrimElement = new XmlElement("trim"); //$NON-NLS-1$

valuesTrimElement.addAttribute(new Attribute("prefix", "values (")); //$NON-NLS-1$ //$NON-NLS-2$

valuesTrimElement.addAttribute(new Attribute("suffix", ")")); //$NON-NLS-1$ //$NON-NLS-2$

valuesTrimElement.addAttribute(new Attribute("suffixOverrides", ",")); //$NON-NLS-1$ //$NON-NLS-2$

answer.addElement(valuesTrimElement);

TextElement updateElement = new TextElement("ON DUPLICATE KEY UPDATE");

answer.addElement(updateElement);

for (IntrospectedColumn introspectedColumn : ListUtilities

.removeIdentityAndGeneratedAlwaysColumns(introspectedTable.getAllColumns())) {

if (introspectedColumn.isSequenceColumn() || introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {

// if it is a sequence column, it is not optional

// This is required for MyBatis3 because MyBatis3 parses

// and calculates the SQL before executing the selectKey

// if it is primitive, we cannot do a null check

sb.setLength(0);

sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));

sb.append(',');

insertTrimElement.addElement(new TextElement(sb.toString()));

sb.setLength(0);

sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));

sb.append(',');

valuesTrimElement.addElement(new TextElement(sb.toString()));

continue;

}

sb.setLength(0);

sb.append(introspectedColumn.getJavaProperty());

sb.append(" != null"); //$NON-NLS-1$

XmlElement insertNotNullElement = new XmlElement("if"); //$NON-NLS-1$

insertNotNullElement.addAttribute(new Attribute("test", sb.toString())); //$NON-NLS-1$

sb.setLength(0);

sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));

sb.append(',');

insertNotNullElement.addElement(new TextElement(sb.toString()));

insertTrimElement.addElement(insertNotNullElement);

sb.setLength(0);

sb.append(introspectedColumn.getJavaProperty());

sb.append(" != null"); //$NON-NLS-1$

XmlElement valuesNotNullElement = new XmlElement("if"); //$NON-NLS-1$

valuesNotNullElement.addAttribute(new Attribute("test", sb.toString())); //$NON-NLS-1$

sb.setLength(0);

sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));

sb.append(',');

valuesNotNullElement.addElement(new TextElement(sb.toString()));

valuesTrimElement.addElement(valuesNotNullElement);

}

XmlElement dynamicElement = new XmlElement("set"); //$NON-NLS-1$

answer.addElement(dynamicElement);

for (IntrospectedColumn introspectedColumn : ListUtilities

.removeGeneratedAlwaysColumns(introspectedTable.getAllColumns())) {

sb.setLength(0);

sb.append(introspectedColumn.getJavaProperty("record.")); //$NON-NLS-1$

sb.append(" != null"); //$NON-NLS-1$

XmlElement isNotNullElement = new XmlElement("if"); //$NON-NLS-1$

isNotNullElement.addAttribute(new Attribute("test", sb.toString())); //$NON-NLS-1$

dynamicElement.addElement(isNotNullElement);

sb.setLength(0);

sb.append(MyBatis3FormattingUtilities.getAliasedEscapedColumnName(introspectedColumn));

sb.append(" = "); //$NON-NLS-1$

sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, "record.")); //$NON-NLS-1$

sb.append(',');

isNotNullElement.addElement(new TextElement(sb.toString()));

}

// answer.addElement(getUpdateByExampleIncludeElement());

if (context.getPlugins().sqlMapInsertSelectiveElementGenerated(answer, introspectedTable)) {

parentElement.addElement(answer);

}

}

}

对应的SQL示例:INSERT INTO `demo`

(`id`,`name`,`age`,`val`)

VALUES(1,"name",25,"abc")

ON DUPLICATE KEY UPDATE

`id`=1,`name` ="tom",`age` = 26,`val`="abc";

mysql saveorupdate_Mybatis SaveOrUpdate插件相关推荐

  1. SpringBoot、mysql配置PageHelper插件

    一:https://blog.csdn.net/h985161183/article/details/79800737 主要异常:org.springframework.beans.factory.B ...

  2. MySQL的 validate_password插件 和 validate_password组件

    validate_password插件 和 validate_password组件 MySQL8.0官方参考手册-密码验证组件-6.4.3 The Password Validation Compon ...

  3. MySQL审计之插件

    通过审计插件可以记录服务器活动,记录谁连接到服务器,运行了什么查询,访问了哪些表,能存储到日志文件或发送到本地syslogd守护进程.目前可用的插件有mariaDB的插件.percona的插件.和ma ...

  4. 如何安装Mysql的审计插件

    背景 最近项目要验收了,数据库的一个验收标准就是要有数据库审计,所以参照资料安装了Mysql的审计插件. 正文 一.下载插件 下载地址:https://bintray.com/mcafee/mysql ...

  5. [转]Mysql的HandlerSocket插件

    ================================================================= 转自:http://blog.csdn.net/heiyeshuwu ...

  6. mysql全文搜索插件_MySQL 全文检索 ngram插件

    InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文和韩文来说,没有这样的分隔符.一个词可以由多个字来组成,所以我们需要用不同的方式来处理. ...

  7. yum安装Apache、PHP、Mysql及扩展插件

    yum安装Apache.PHP.Mysql及扩展插件环境:CentOS 6.3 最小化安装 参考 https://www.cnblogs.com/ylnic/archive/2011/03/27/19 ...

  8. mysql 中文搜索插件_支持中文的MySQL 5.1+ 全文检索分词插件

    经过不停的尝试和努力,以最新的 mysql 5.1.11-beta 为基础,制作的分词插件已经测试成功,现在发布如下. 由于 mysql 5.1.x 本身的架构作了修改,所以增加分词直接以插件形式方式 ...

  9. 开发检测MySQL主从同步插件

    Nagios的状态码 OK 退出码0,表示正常工作 WARNING  退出码1,表示处于警告阶段 CRITICAL    退出码2,表示处于紧急状态,严重状态 UNKOEN   退出码3,表示无法获取 ...

最新文章

  1. abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
  2. Xamarin XAML语言教程对象元素的声明方式
  3. zh-cn 与 zh-hans 是什么关系、有什么区别
  4. html text报错,AFNetWorking 请求报错 text/html
  5. 谁是最好的WebRTC SFU?
  6. Java -- 网络编程(一):Client与Server之间的数据传送
  7. jquery 给iframe里的元素添加事件
  8. 给Win32 GUI程序增加控制台窗口的方法
  9. es system call filters failed to install; check the logs and fix your configuration or disable syste
  10. python就业方向-目前Python这么火,Python有哪些就业方向?
  11. Java之dead code——无用代码
  12. matlab如何制作莫兰散点图,求大神指点绘制空间内散点图的包络面,,,散点程序如下...
  13. java:linux上找出最耗资源的线程方法
  14. 年轻人的第一个自定义Springboot starter
  15. 基于OCR图像识别技术的发票采集管理系统及方法
  16. 区块链ppt资料准备
  17. echarts横向柱状图
  18. 计算机小写换大写函数,Excel函数公式应用:小写数字转换成人民币大写9种方法-excel技巧-电脑技巧收藏家...
  19. nginx反向代理加gitlab认证
  20. python爬取微博数据词云_用Python爬取微博数据生成词云图片

热门文章

  1. 量子计算机怎么编程,量子计算机编程(一)——QPU编程
  2. 容大打印机ip修改工具_M1芯片版Mac无法连接打印机怎么办?
  3. erp 维护费 要交吗_ERP系统维护费
  4. mysql ddl 锁_MySQL Online DDL导致全局锁表案例分析
  5. c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源
  6. python 读取 Excel 文件的方法 csv.reader
  7. MySQL 数据库误删除后的数据恢复操作说明
  8. 日常问题———Attempting to operate on hdfs namenode as root
  9. Redis详解(三)
  10. 委托BegionInvoke和窗体BegionInvoke