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";

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql以下运算符的优先级顺序正确的是_MySQL 运算符

原文:http://www.jb51.net/article/25657.htm我一贯秉承着一点:通过自己的双手真实的操作一遍之后的信息是最可靠的,所以在您参考这个小文儿的时候请不要只是“看”,单纯的瞧一瞧是得不到真知滴~~~座右铭:纸上得来终觉…

sed用法

sed -i 2a\this is a test line test.conf 就是在test.conf中的第二行下边加上一行"this is a test line" 把一个文件的内容插入另一个文件: sed -i 2 r file1 file2 2代表插到第二行下边 替换文件中的 properties 为 property, 如果想直接修改源文件&…

java连接mysql2008_在Java中如何使用jdbc连接Sql2008数据库(转)

我们在javaEE的开发中,肯定是要用到数据库的,那么在javaEE的开发中,是如何使用代码实现和SQL2008的连接的呢?在这一篇文章中,我将讲解如何最简单的使用jdbc进行SQL2008的数据库的连接的。首先我们看下我们的数据库的一…

java搭建博客系统_Spring boot 搭建个人博客系统(一)——整体思路

Spring boot 搭建个人博客系统(一)——整体思路一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟悉这类项目开发的基本流程。0. 思路博客的基本作用就是博主写文…

postgresql(2)

mysql转换postgresql1)时间格式转换from_unixtime(timestamp,%Y-%m-%d ) 》SELECT to_char(to_timestamp(t.create_time / 1000), YYYY-MM-DD HH24:MI:SS)2)字段拼接GROUP_CONCAT(restaurantid,|,cityid) 》select array_to_string(ARRAY(SELECT unnes…

java system.load()_System.load()与System.loadLibrary()

Java load 和 loadlibrary方法的区别1. 相同点:两个方法都是用来装载dll文件,不论是JNI库文件还是非JNI库文件。本地方法在被调用时都需要通过这两发方法之一将其加载至内存。2. 不同点a. System.load(String filename) ,参数为dll文件的绝对路径&…

在SQL Server中为什么不建议使用Not In子查询

原文:在SQL Server中为什么不建议使用Not In子查询在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下 下面我们…

结组项目-四则运算3

团队成员:苗堃(http://www.cnblogs.com/brucekun/p/5294368.html)、罗毅(http://www.cnblogs.com/ly199553/p/5294779.html) PSP总结http://www.cnblogs.com/ly199553/p/5295545.html 本次软件工程老师提出了新任务&a…

java 的io流需要学吗_Java Io流怎么学习呢?

滕泰科技之 io 流流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。根据处理数据…

mysql5.5.20安装_mysql5.5.20安装文档

1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具。因此,我们首先要在系统中源码编译安装cmake工具。# wget http://www.doczj.com/doc/e83fe02b7375a417866f8f0a.html/files/v2.8/cmake-2.8…

心里装着你,思念就很美(我要做一个文艺范儿的程序员)

每一个静静的夜里, 都会枕着你的名字悄然入睡。 睡梦里轻轻的将你想起, 深深的把你惦起! 美丽的邂逅在梦里重现, 你我相遇在花开如诗的季节, 春花乱舞迷了你的眼, 你如花般的笑颜却迷了我的心坎。 记忆清晰…

java8新特性以及原因_JAVA8 十大新特性详解

二、Lambda 表达式首先看看在老版本的Java中是如何排列字符串的:List names Arrays.asList("peter", "anna", "mike", "xenia");Collections.sort(names, new Comparator() { Override public int compare(String a…

jsp 嵌入java_关于JSP里的Java语句嵌入问题

是这样的,我用的是Intellij 导入了一个MyEclipse的包(该包已部署在服务器上,所以是没有大错误的)。然后在一个jsp文件出现了个问题:莫名奇妙地println变成了红色,执行的时候就直接抛出异常了。今天刚接触JavaWeb不太懂,到底是怎么…

ecshop 快速添加会员

/*------------------------------------------------------ */ //-- 快速添加会员 /*------------------------------------------------------ */ elseif ($_REQUEST[act] quick_insert) {/* 检查权限 */admin_priv(users_manage);$str1_arr array(0,1,2,3,4,5,6,7,8,9);$s…

python循环计算函数_Python位操作、判断、循环,运算

位运算1、原码、反码和补码计算机内部使用补码来表示2、按位运算实现快速计算(1) 通过^(异或)快速交换两个整数。a^bb^aa^b(2) 通过a&(-a)快速获取a的最后为1 位置的整数。00 00 01 01 -> 5&11 11 10 11 -> -5- - -00 00 00 01-> 14、利用位运算实现整数集合一…

【three.js】库

2019独角兽企业重金招聘Python工程师标准>>> three.js 一个轻量级的webgl库,但是十分强大。 下载地址https://github.com/mrdoob/three.js OrbitControls.js 控制视口的平移、缩放、旋转。 GridHelper.js 生成视口的网格。 转载于:https://my.oschina.…

java split空字符_java split函数结尾空字符串被丢弃的问题

java中的split函数用于将字符串分割为字符数组是很方便的,但由于不是很熟悉,犯了错误如下:String strtest “1,2,”;String arry[] strtest.split(“,”);这样得到的数组元素个数只是2两个,为什么呢,最后一个”,”后…

域名发散--前端优化(三)

话说天下大势,分久必合,合久必分其实域名也是一样,分分合合, 不管是域名收敛还是域名发散,都有着自己独特的应用场景。目前, 在webs top 30,000 URLS 里面, 平均每个域名承担了50个资源的请求,所…

java就_GitHub - IammyselfYBX/This_is_how_Java_should_be_learned: 《Java就应该这样学》

Java就该这么学说明这里使用 centos7 的openjdk,不是Oracle的JDKyum search java|grep jdkyum install java-1.8.0-openjdk#set Java environmentexport JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64export CALSSPATH.:$JAVA_HOME/jre/l…

HttpHandler与HttpModule的用处与区别

HttpHandler与HttpModule的用处与区别   问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用HttpModule? 答案1:HttpHandler,Htt…