博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scala数据库工具类
阅读量:6540 次
发布时间:2019-06-24

本文共 6613 字,大约阅读时间需要 22 分钟。

scala的数据库连接池,基于mysql

import java.util.concurrent.ConcurrentHashMapimport com.jolbox.bonecp.{ BoneCPConfig, BoneCP }import java.util.ResourceBundleimport java.util.LinkedListimport java.sql.DriverManagerimport java.sql.Connection/** * 数据库连接池工具类 * 语言:scala * 时间:2016-07-09 */object DBConnectionPool {  private val reader = ResourceBundle.getBundle("connection")  private val max_connection = reader.getString("jeecg.max_connection") //连接池总数  private val connection_num = reader.getString("jeecg.connection_num") //产生连接数  private var current_num = 0 //当前连接池已产生的连接数  private val pools = new LinkedList[Connection]() //连接池  private val driver = reader.getString("jeecg.driver")  private val url = reader.getString("jeecg.url")  private val username = reader.getString("jeecg.username")  private val password = reader.getString("jeecg.password") /**  * 加载驱动  */  private def before() {    if (current_num > max_connection.toInt && pools.isEmpty()) {      print("busyness")      Thread.sleep(2000)      before()    } else {      Class.forName(driver)    }  }  /**   * 获得连接   */  private def initConn(): Connection = {    val conn = DriverManager.getConnection(url, username, password)    conn  }  /**   * 初始化连接池   */  private def initConnectionPool(): LinkedList[Connection] = {    AnyRef.synchronized({      if (pools.isEmpty()) {        before()        for (i <- 1 to connection_num.toInt) {          pools.push(initConn())          current_num += 1        }      }      pools    })  }  /**   * 获得连接   */  def getConn():Connection={     initConnectionPool()     pools.poll()  }  /**   * 释放连接   */  def releaseCon(con:Connection){    pools.push(con)  }  }

配置文件

#数据库连接池配置文件jeecg.driver=org.gjt.mm.mysql.Driverjeecg.url=jdbc\:mysql\://0.0.0.0\:3306/jeecg?useUnicode=true&characterEncoding=utf-8jeecg.username=rootjeecg.password=****jeecg.max_connection=8jeecg.connection_num=10

dao类

import java.sql.ResultSetimport java.sql.PreparedStatementimport java.sql.Connectionimport java.sql.Statement/** * 数据操作工具类 * 语言:scala * 时间:2016-07-09 */private[org] abstract class BaseDao[T](conn: Connection) {  /**   * 插入数据   * @param sql SQL语句   * @param params 参数列表   * @param convert 主键转换方法   * @return 转换结果   */  protected def insert[T](sql: String, params: Array[Any])(convert: ResultSet => T) = {    val pstmt = conn prepareStatement (sql, Statement.RETURN_GENERATED_KEYS)    setParameters(pstmt, params)    pstmt.executeUpdate    val rs = pstmt.getGeneratedKeys    rs.next    convert(rs)  }  /**   * 更新数据   * @param sql SQL语句   * @param params 参数列表   * @return 影响行数   */  protected def update(sql: String, params: Array[Any]) = createStatement(sql, params).executeUpdate  /**   * 查询对象   * @param sql SQL语句   * @param params 参数列表   * @param convert 结果集转换方法   * @return 泛型对象   */  protected def queryForObject[T](sql: String, params: Array[Any])(convert: ResultSet => T) = {    val rs = query(sql, params)    if (rs.next) {      val result = convert(rs)      if (rs.next) {        val ex = new ResultsTooManyException        throw ex      } else Some(result)    } else None  }  /**   * 查询对象列表   * @param sql SQL语句   * @param params 参数列表   * @param convert 结果集转换方法   * @return 泛型对象列表   */  protected def queryForList[T](sql: String, params: Array[Any])(convert: ResultSet => T) = {    val rs = query(sql, params)    var results = List[T]()    while (rs.next) { results = results :+ convert(rs) }    results  }  /**   * 查询对象映射   * @param sql SQL语句   * @param params 参数列表   * @param convert 结果集转换方法   * @return 泛型对象映射   */  protected def queryForMap[K, V](sql: String, params: Array[Any])(convert: ResultSet => (K, V)) = {    val rs = query(sql, params)    var results = Map[K, V]()    while (rs.next) { results += convert(rs) }    results  }  /**   * 查询   * @param sql SQL语句   * @param params 参数列表   */  private def query(sql: String, params: Array[Any]) = createStatement(sql, params).executeQuery  /**   * 创建声明   * @param sql SQL语句   * @param params 参数列表   */  private def createStatement(sql: String, params: Array[Any]) = {    val pstmt = conn prepareStatement sql    setParameters(pstmt, params)    pstmt  }  /**   * 插入参数   * @param pstmt 预编译声明   * @param params 参数列表   */  private def setParameters(pstmt: PreparedStatement, params: Array[Any]) {    for (i <- 1 to params.length) { pstmt setObject (i, params(i - 1)) }  }}/** * 结果值读取器 */object ResultValueGetter {  /**   * 查询结果值   * @param rs 结果集   * @param getResult 获得单个值结果的方法   * @return 值   */  def getResultValue[T](rs: ResultSet)(getResult: ResultSet => T) = {    val result = getResult(rs)    if (rs.wasNull) None else Some(result)  }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colNum 列号   */  def getStringValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getString colNum }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colNum 列号   */  def getIntValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getInt colNum }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colNum 列号   */  def getLongValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getLong colNum }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colNum 列号   */  def getDoubleValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getDouble colNum }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colNum 列号   */  def getBooleanValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getBoolean colNum }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colNum 列号   */  def getTimestampValue(rs: ResultSet, colNum: Int) = getResultValue(rs) { _ getTimestamp colNum }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colName 列名   */  def getStringValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getString colName }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colName 列名   */  def getIntValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getInt colName }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colName 列名   */  def getLongValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getLong colName }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colName 列名   */  def getDoubleValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getDouble colName }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colName 列名   */  def getBooleanValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getBoolean colName }  /**   * 获得字符串结果的值   * @param rs 结果集   * @param colName 列名   */  def getTimestampValue(rs: ResultSet, colName: String) = getResultValue(rs) { _ getTimestamp colName }}/** * 结果太多异常 */class ResultsTooManyException extends Exception("Returned too many results.") {}

转载于:https://www.cnblogs.com/gnool/p/5655575.html

你可能感兴趣的文章
mongodb group
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>
Windows2008 R2 GAC权限问题
查看>>
洛谷——P1469 找筷子
查看>>
springboot项目自定义注解实现的多数据源切换
查看>>
特此说明
查看>>
使用flume替代原有的scribe服务
查看>>
Hyper-V 2016 系列教程41 Windows 10 Hyper-V 系统要求
查看>>
Windows Server 2008 启用公共文件夹共享
查看>>
Apple Watch的非“智能手表”卖点
查看>>
函数指针和指针函数
查看>>
Python的函数参数传递:传值?引用?
查看>>
[转]分享2011年8个最新的jQuery Mobile在线教程
查看>>
android call require api level
查看>>
SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第一篇)
查看>>