zoukankan      html  css  js  c++  java
  • jdbctemplete 存在就更新不存在就插入的优化操作

    当我们用java,jdbc 或者 spring的jdbctemplate来操作数据时候,总有时候会碰到 存在就插入不存在就更新 这样的需求,我们一般都是用下面的方法解决

    public void save(){
    JdbcTemplate jdbc = getJdbc();
    String updateStatement="";
    String insertStatement="";
    int cout = jdbc.update(updateStatement);
    if(count<=0){
    //不存在需要被更新的数据,那就插入
    jdbc.update(insertStatement);
    }
    jdbc.close();
    }
    

    在这里仅仅只是一条数据,看着还行,但是如果是批量的数据呢?代码就会变成下面这样

    public void save(List<Param> list){
        JdbcTemplate jdbc = getJdbc();
        String updateStatement="";
        String insertStatement="";
        for(Param p:list){
            int cout = jdbc.update(updateStatement);
            if(count<=0){
                 //不存在需要被更新的数据,那就插入
                 jdbc.update(insertStatement);
             }
        }
        jdbc.close();
    }
    

      

    这样感觉就不怎么好看了,而且效率也不怎么样。


    优化方法如下:

    1. 可以在数据库中建立存储过程,逻辑为单条记录的 存在就更新不存在就插入;

    2. 在java中通过jdbc调用存储过程,如果是批量数据的话,跟批量插入差不多。

    实例代码:

    1. 存储过程(postgres数据库):
     

    CREATE OR REPLACE FUNCTION insert_exists_device(p_deviceid integer, p_eventtype integer, p_state integer, p_eventvalue character varying)
      RETURNS integer AS
    $BODY$
       BEGIN
          perform 1 FROM tablename WHERE deviceid=p_deviceid AND eventtype=p_eventtype; --判断是否有该条记录
          IF NOT found THEN
             insertStatement;
          ELSE
             updateStatement;
          END IF;
          RETURN 1; 
       END
    $BODY$
      LANGUAGE plpgsql;
    

      

    2. java中调用:

    public void save(List<Param> list){    
         return jdbc.execute("{call insert_exists_device_monitor(?,?,?,?)}", new CallableStatementCallback<Boolean>() {
     
    	@Override
    	public Boolean doInCallableStatement(CallableStatement cs)throws SQLException, DataAccessException {
    				
    		for (Param p: list) {
    			cs.setInt(1, deviceid);
    			cs.setInt(2, p.getEventType());
    			cs.setInt(3, p.getState());
    			cs.setString(4, p.getEventValue());
    			cs.addBatch();
    		}
    		s.executeBatch();
    	 }
    			
         });
    }
    

      


     

  • 相关阅读:
    通过python连接数据库以及操作
    切片
    文件的内容读写(二)
    文件的内容读写(一)
    python数据类型(四)之嵌套类型
    python数据类型(三)之字典类型
    python数据类型(二)之数组和数组函数
    Python的内存管理
    *args 和 **kwargs 的区别
    python的命名空间
  • 原文地址:https://www.cnblogs.com/huangsxj/p/10100368.html
Copyright © 2011-2022 走看看