mysql saveorupdate_Mybatis SaveOrUpdate插件
继承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插件相关推荐
- SpringBoot、mysql配置PageHelper插件
一:https://blog.csdn.net/h985161183/article/details/79800737 主要异常:org.springframework.beans.factory.B ...
- MySQL的 validate_password插件 和 validate_password组件
validate_password插件 和 validate_password组件 MySQL8.0官方参考手册-密码验证组件-6.4.3 The Password Validation Compon ...
- MySQL审计之插件
通过审计插件可以记录服务器活动,记录谁连接到服务器,运行了什么查询,访问了哪些表,能存储到日志文件或发送到本地syslogd守护进程.目前可用的插件有mariaDB的插件.percona的插件.和ma ...
- 如何安装Mysql的审计插件
背景 最近项目要验收了,数据库的一个验收标准就是要有数据库审计,所以参照资料安装了Mysql的审计插件. 正文 一.下载插件 下载地址:https://bintray.com/mcafee/mysql ...
- [转]Mysql的HandlerSocket插件
================================================================= 转自:http://blog.csdn.net/heiyeshuwu ...
- mysql全文搜索插件_MySQL 全文检索 ngram插件
InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文和韩文来说,没有这样的分隔符.一个词可以由多个字来组成,所以我们需要用不同的方式来处理. ...
- yum安装Apache、PHP、Mysql及扩展插件
yum安装Apache.PHP.Mysql及扩展插件环境:CentOS 6.3 最小化安装 参考 https://www.cnblogs.com/ylnic/archive/2011/03/27/19 ...
- mysql 中文搜索插件_支持中文的MySQL 5.1+ 全文检索分词插件
经过不停的尝试和努力,以最新的 mysql 5.1.11-beta 为基础,制作的分词插件已经测试成功,现在发布如下. 由于 mysql 5.1.x 本身的架构作了修改,所以增加分词直接以插件形式方式 ...
- 开发检测MySQL主从同步插件
Nagios的状态码 OK 退出码0,表示正常工作 WARNING 退出码1,表示处于警告阶段 CRITICAL 退出码2,表示处于紧急状态,严重状态 UNKOEN 退出码3,表示无法获取 ...
最新文章
- abaqus高性能服务器怎么用,高性能计算平台ABAQUS任务调度使用说明作者陈林E-Mailchenlin.PDF...
- Xamarin XAML语言教程对象元素的声明方式
- zh-cn 与 zh-hans 是什么关系、有什么区别
- html text报错,AFNetWorking 请求报错 text/html
- 谁是最好的WebRTC SFU?
- Java -- 网络编程(一):Client与Server之间的数据传送
- jquery 给iframe里的元素添加事件
- 给Win32 GUI程序增加控制台窗口的方法
- es system call filters failed to install; check the logs and fix your configuration or disable syste
- python就业方向-目前Python这么火,Python有哪些就业方向?
- Java之dead code——无用代码
- matlab如何制作莫兰散点图,求大神指点绘制空间内散点图的包络面,,,散点程序如下...
- java:linux上找出最耗资源的线程方法
- 年轻人的第一个自定义Springboot starter
- 基于OCR图像识别技术的发票采集管理系统及方法
- 区块链ppt资料准备
- echarts横向柱状图
- 计算机小写换大写函数,Excel函数公式应用:小写数字转换成人民币大写9种方法-excel技巧-电脑技巧收藏家...
- nginx反向代理加gitlab认证
- python爬取微博数据词云_用Python爬取微博数据生成词云图片
热门文章
- 量子计算机怎么编程,量子计算机编程(一)——QPU编程
- 容大打印机ip修改工具_M1芯片版Mac无法连接打印机怎么办?
- erp 维护费 要交吗_ERP系统维护费
- mysql ddl 锁_MySQL Online DDL导致全局锁表案例分析
- c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源
- python 读取 Excel 文件的方法 csv.reader
- MySQL 数据库误删除后的数据恢复操作说明
- 日常问题———Attempting to operate on hdfs namenode as root
- Redis详解(三)
- 委托BegionInvoke和窗体BegionInvoke