大数据

postgres数据库实现存在则更新,不存在则插入的方法

2019-12-23  本文已影响0人  喵感数据

实现记录存在时,count字段自动累计1。

INSERT INTO t_sjwh_spark_jj
VALUES
    ('pgKey', 0, jjpl) ON conflict ( pgmxid ) DO
UPDATE 
    SET "count" = t_sjwh_spark_jj."count" + 1

实现记录存在时,count字段更新。

INSERT INTO t_sjwh_spark_jj
VALUES
    ('pgKey', 0, jjpl) ON conflict ( pgmxid ) DO
UPDATE 
    SET "count" = '5'

注意:conflict后面的主键字段一定要保持其唯一性(unique)。

完整代码如下,动态匹配id进行数据库的更新插入操作:

object GatherPostgres extends Serializable {

    lazy private val sdf = new SimpleDateFormat("yyyy-MM-dd")
    lazy private val todayDate = sdf.format(new Date)//系统当前时间

    def insertIntoPg(mxid:String,jjpl:Int): Unit ={
      //拼装id
      val pgKey = mxid + "\001" + todayDate

      //如果存在则count加1,如果不存在则插入数据库
      val insertPgSql =
        s"""
          |INSERT INTO t_sjwh_spark_jj
          |VALUES
          | ('${ pgKey}', 0, ${ jjpl} ) ON conflict ( pgmxid ) DO
          |UPDATE
          | SET "count" = t_sjwh_spark_jj."count" + 1
        """.stripMargin

      //获得连接池资源
      val conn = DruidTool.getConnection.orNull
      if (conn != null) {
        //把数据存入PG库
        val insertpst: PreparedStatement = conn.prepareStatement(insertPgSql)
        try {
          //设置批量提交
          conn.setAutoCommit(false)
          insertpst.addBatch()
          insertpst.executeBatch()
          conn.commit()
        } catch {
          case ex: Exception => println(ex.getMessage)
        } finally {
          insertpst.close()
          DruidTool.closeConnection(conn)
        }
      }
    }
}
/**
 * 数据库连接池工具类
 */
object DruidTool extends Serializable {
 
    //连接池配置
  
    private val LOG = Logger.getLogger(DruidTool.getClass.getName)
    
    private val dataSource: Option[DataSource] = {
      
      try{
        val druidProps = new Properties() 
        //获取Druid连接池配置文件
        val druidConfig = getClass.getResourceAsStream("/druid.properties")   
        druidProps.load(druidConfig)
        Some(DruidDataSourceFactory.createDataSource(druidProps))
      }catch{
        case exception:Exception =>
          LOG.error("Create Connection Error: \n",exception)
          None
      } 
    }   
    
      //获取连接池连接
     def getConnection : Option[Connection] = {
          dataSource match{
            case Some(pool) => Some(pool.getConnection)
            case None =>None
          }    
      }
      
     //关闭数据库连接
     def closeConnection (connection:Connection):Unit={
        if (!connection.isClosed){
          connection.close()
        }
      }
}

druid.properties配置信息

driverClassName =org.postgresql.Driver
url =jdbc:postgresql://192.1111.111.111:5432/database?currentSchema=table
username =postgres
password =postgres
initialSzie =5
maxActive =10
maxWait =60000
maxldle =6
minldle =3
上一篇下一篇

猜你喜欢

热点阅读