我是靠谱客的博主 年轻羽毛,最近开发中收集的这篇文章主要介绍mysql实现saveorupdate,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

转载自 点击打开链接
写ibatis要实现saveorupdate两种方式

一、都是在业务上进行控制,

二、mysql 的replace into 语句支持类似的功.

原理是根据唯一索引去判断新插入数据合法性,合法(不存在)则插入,存在则删除.

这在自增主键情况下会使autoincrement +2, 并且原来的数据全部清空存在数据不安全的隐患.

三、mysql 的ON DUPLICATE KEY 

INSERT INTO TABLE (a,b,c) VALUES 
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b);

是根据唯一索引去判断,存在冲突则执行update


有这两个mysql的语法,实现saveorupdate可以更方便安全一些

配置如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  
  3. "http://ibatis.apache.org/dtd/sql-map-2.dtd">  
  4.   
  5. <sqlMap namespace="vcenterviewmodel">  
  6.     <typeAlias alias="VCenterViewModel"  
  7.         type="com.upyoo.vmware.viewandmodel.VCenterViewModel" />  
  8.   
  9.   
  10.   
  11.     <statement id="insertvcenterviewmodel">  
  12.         insert into  
  13.         vctener(id, description_name, cluster_count,host_count,  
  14.         vm_count,  
  15.         cpu_core_count, vcpu_core_count, cpu_used_scale,  
  16.         cpu_portion_scale,  
  17.         memory_cap, vmemory_cap,  
  18.         memory_used_cap, memory_used_scale,  
  19.         memory_portion_scale, store_cap, vstroe_cap,  
  20.         store_sas_cap,  
  21.         store_sas_used_cap, store_sas_used_scale,  
  22.         store_sata_cap,  
  23.         store_sata_used_cap,  
  24.         store_sata_used_scale, vstore_cap,  
  25.         store_portion_scale  
  26.   
  27.   
  28.         ) values(#id#,  
  29.         #description_name#,#cluster_count#,#host_count#,  
  30.         #vm_count#,  
  31.         #cpu_core_count#, #vcpu_core_count#, #cpu_used_scale#,  
  32.         #cpu_portion_scale#, #memory_cap#, #vmemory_cap#,  
  33.         #memory_used_cap#,  
  34.         #memory_used_scale#,  
  35.         #memory_portion_scale#, #store_cap#, #vstroe_cap#,  
  36.         #store_sas_cap#, #store_sas_used_cap#, #store_sas_used_scale#,  
  37.         #store_sata_cap#, #store_sata_used_cap#,  
  38.         #store_sata_used_scale#,  
  39.         #vstore_cap#, #store_portion_scale#  
  40.   
  41.         )  
  42.     </statement>  
  43.   
  44.     <statement id="insertvcenterviewmodel1">  
  45.         insert into  
  46.         vctener(id, description_name, cluster_count  
  47.   
  48.         ) values(#id#,  
  49.         #description_name#,#cluster_count#  
  50.         )  
  51.         ON DUPLICATE KEY UPDATE  
  52.         cluster_count=#cluster_count#,description_name=#description_name#  
  53.           
  54.     </statement>  
  55.   
  56.     <statement id="checkFromVCenterViewModel" resultClass="VCenterViewModel">  
  57.         select * from vctener where 1=1  
  58.     </statement>  
  59.   
  60.   
  61. </sqlMap>  

代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.upyoo.test;  
  2. import java.io.IOException;  
  3. import java.io.Reader;  
  4. import java.sql.SQLException;  
  5. import java.util.List;  
  6.   
  7. import com.ibatis.common.resources.Resources;  
  8. import com.ibatis.sqlmap.client.SqlMapClient;  
  9. import com.ibatis.sqlmap.client.SqlMapClientBuilder;  
  10. import com.upyoo.util.Generate;  
  11. import com.upyoo.vmware.viewandmodel.ClusterViewModel;  
  12. import com.upyoo.vmware.viewandmodel.VCenterViewModel;  
  13. import com.vmware.vim25.GeneralEvent;  
  14. public class IBatisDemo {  
  15.     public static void main(String[] args) throws IOException{  
  16.           
  17.         String config = "sqlMapConfig.xml";  
  18.           
  19.         Reader reader = Resources.getResourceAsReader(config);  
  20.         SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);  
  21. //      ClusterViewModel cViewModel = new ClusterViewModel();  
  22. //      cViewModel.setId(Generate.getRpid());  
  23. //      sqlMap.insert("insertClusterViewModel", cViewModel);  
  24.           
  25.         VCenterViewModel center = new VCenterViewModel();  
  26.         center.setId("fortest1");  
  27.         center.setCluster_count(18);  
  28.         center.setDescription_name("tes1t");  
  29.         try {  
  30.             sqlMap.insert("insertvcenterviewmodel1", center);  
  31.         } catch (SQLException e) {  
  32.             // TODO Auto-generated catch block  
  33.             System.out.println(e.getMessage());  
  34.         }  
  35.         List<VCenterViewModel> list;  
  36.         try {  
  37.             list = sqlMap.queryForList("checkFromVCenterViewModel");  
  38.             for (VCenterViewModel vCenterViewModel : list) {  
  39.                 System.out.println(vCenterViewModel);  
  40.             }  
  41.         } catch (SQLException e) {  
  42.             // TODO Auto-generated catch block  
  43.             e.printStackTrace();  
  44.         }  
  45.           
  46.           
  47.     }  
  48. }  

运行如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. VCenterViewModel [id=fortest, description_name=null, cluster_count=null, host_count=null, vm_count=null, cpu_core_count=null, vcpu_core_count=null, cpu_usage=null, cpu_portion_scale=null, memory_cap=null, vmemory_cap=null, memory_used_cap=null, memory_used_scale=null, memory_portion_scale=null, store_cap=null, vstroe_cap=null, store_sas_cap=null, store_sas_used_cap=null, store_sas_used_scale=null, store_sata_cap=null, store_sata_used_cap=null, store_sata_used_scale=null, vstore_cap=null, store_portion_scale=null]  
  2. VCenterViewModel [id=fortest1, description_name=tes1t, cluster_count=18, host_count=null, vm_count=null, cpu_core_count=null, vcpu_core_count=null, cpu_usage=null, cpu_portion_scale=null, memory_cap=null, vmemory_cap=null, memory_used_cap=null, memory_used_scale=null, memory_portion_scale=null, store_cap=null, vstroe_cap=null, store_sas_cap=null, store_sas_used_cap=null, store_sas_used_scale=null, store_sata_cap=null, store_sata_used_cap=null, store_sata_used_scale=null, vstore_cap=null, store_portion_scale=null]  
  3. VCenterViewModel [id=SHANGHAICLOUD, description_name=VMware vCenter Server 5.1.0 build-947673, cluster_count=null, host_count=90, vm_count=7561, cpu_core_count=2624, vcpu_core_count=12042, cpu_usage=null, cpu_portion_scale=null, memory_cap=null, vmemory_cap=null, memory_used_cap=null, memory_used_scale=null, memory_portion_scale=null, store_cap=null, vstroe_cap=null, store_sas_cap=null, store_sas_used_cap=null, store_sas_used_scale=null, store_sata_cap=null, store_sata_used_cap=null, store_sata_used_scale=null, vstore_cap=null, store_portion_scale=null]  

主要观察

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. center.setId("fortest1");  
  2.         center.setCluster_count(18);  
  3.         center.setDescription_name("tes1t");  
  4.         try {  
  5.             sqlMap.insert("insertvcenterviewmodel1", center);  

在配置中对应的是:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. insertvcenterviewmodel1  
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <statement id="insertvcenterviewmodel1">  
  2.         insert into  
  3.         vctener(id, description_name, cluster_count  
  4.   
  5.         ) values(#id#,  
  6.         #description_name#,#cluster_count#  
  7.         )  
  8.         ON DUPLICATE KEY UPDATE  
  9.         cluster_count=#cluster_count#,description_name=#description_name#  
  10.           
  11.     </statement>  

参考:

mysql 忽略主键冲突、避免重复插入的几种方式 - leejun_2005的个人页面 - 开源中国社区http://my.oschina.net/leejun2005/blog/150510

最后

以上就是年轻羽毛为你收集整理的mysql实现saveorupdate的全部内容,希望文章能够帮你解决mysql实现saveorupdate所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部