package com.example.utils import com.example.spark.{TopGenresByAverageRating, TopTenAvgRatings, MovieRatingCount} import com.zaxxer.hikari.{HikariConfig, HikariDataSource} import org.apache.commons.dbutils.QueryRunner object JDBCUtil { // ==================== HikariCP 配置 ==================== private val config = new HikariConfig() private val user = "root" private val password = "root123456" private val url = "jdbc:mysql://192.168.48.10:3306/test" config.setJdbcUrl(url) config.setUsername(user) config.setPassword(password) config.setDriverClassName("com.mysql.cj.jdbc.Driver") config.setMaximumPoolSize(10) config.setMinimumIdle(5) config.setIdleTimeout(30000) config.setConnectionTimeout(30000) config.setAutoCommit(true) // 数据源 private val dataSource = new HikariDataSource(config) // ==================== 获取 QueryRunner ==================== def getQueryRunner: Option[QueryRunner] = try { Some(new QueryRunner(dataSource)) } catch { case e: Exception => e.printStackTrace() None } // ==================== 写入 MySQL ==================== def insert2Mysql(res: Any): Unit = getQueryRunner match { case Some(queryRunner) => upsert(res, queryRunner) case None => println("Mysql 连接失败") System.exit(-1) } // ==================== 根据类型执行不同 SQL ==================== private def upsert(res: Any, queryRunner: QueryRunner): Unit = { res match { case data: TopTenAvgRatings => val sql = """ |REPLACE INTO top_ten_avg_ratings ( | movie_id, | title, | avg_rating |) VALUES (?, ?, ?) """.stripMargin queryRunner.update( sql, data.movieId, data.title, data.avgRating ) case data: TopGenresByAverageRating => val sql = """ |REPLACE INTO genres_average_rating ( | genres, | avg_rating |) VALUES (?, ?) """.stripMargin queryRunner.update( sql, data.genres, data.avgRating ) case data: MovieRatingCount => val sql = """ |REPLACE INTO movie_rating_count ( |movie_id, |title, |ratingCount |) VALUES (?, ?, ?) """.stripMargin queryRunner.update( sql, Int.box(data.movieId), data.title, Long.box(data.ratingCount) ) case _ => println(s"不支持的数据类型:${res.getClass.getName}") } } }