scala封装自定义的持久层(demo)

1、基本方法封装,可以自行扩展

package utils

import java.sql.ResultSet

import dataSource._

/**
  * @author yule.zhang
  * @deprecated 抽取公共查询方法
  */
object BaseDaoFactory {

  
  /**
    * 根据数据源类的名称获取连接
    * @param connStr
    * @return
    */
  def getConn(connStr:String) = {
    val conn = connStr match {
      case  "FirstDBDataSource" => FirstDBDataSource.connectionPool.getConnection
      case  "SecondDBDataSource" => SecondDBDataSource.connectionPool.getConnection
      case _ => OtherDBDataSource.connectionPool.getConnection
    }
    conn
  }

    /**
    * 执行SQL获取结果  list
    * @param connStr
    * @param sql
    * @param fieldList
    * @return
    */
  def getFinalBaseListResult(connStr:String,sql:String,fieldList: List[String]) = {
    var publicList = List[Map[String,String]]()
    if(sql != "-1"){
      val conn = getConn(connStr)
      val stmt = conn.prepareStatement(sql)
      val resultSet = stmt.executeQuery()
      publicList = getBaseListResult(fieldList,resultSet)
      stmt.close()
      conn.close()
    }
    publicList
  }

  /**
    * 获取map{"写死key":"xxx"}
    * 或者 "xxx"
    * @param connStr
    * @param sql
    * @param key
    * @param filed
    * @return
    */
  def getFinalSingleResult(connStr:String,sql:String,key:String,filed:String) = {
    val res = key match {
      case null => getSingleFieldResult(connStr,sql,filed)
      case _ => getSingleMapResult(connStr,sql,key,filed)
    }
    res
  }

  /**
    * 获取 map{"写死key":"xxx"}
    * @param connStr
    * @param sql
    * @param key
    * @param filed
    * @return
    */
  def getSingleMapResult(connStr:String,sql:String,key:String,filed:String) = {
    var publicMap = Map[String,String]()
    if(sql != "-1"){
      val conn = getConn(connStr)
      val stmt = conn.prepareStatement(sql)
      val resultSet = stmt.executeQuery()
      publicMap = getSingleMap(key,filed,resultSet)
      stmt.close()
      conn.close()
    }
    publicMap
  }

  /**
    * 获取 "xxx"
    * @param connStr
    * @param sql
    * @param filed
    */
  def getSingleFieldResult(connStr:String,sql:String,filed:String) ={
    var public = ""
    if(sql != "-1"){
      val conn = getConn(connStr)
      val stmt = conn.prepareStatement(sql)
      val resultSet = stmt.executeQuery()
      public = getSingleField(filed,resultSet)
      stmt.close()
      conn.close()
    }
    public
  }


  def getFinalBaseListReplaceResult(connStr:String,sql:String,fieldList: List[String],replaceMap:Map[String,Map[String,String]]) = {
    var publicList = List[Map[String,String]]()
    if(sql != "-1"){
      val conn = getConn(connStr)
      val stmt = conn.prepareStatement(sql)
      val resultSet = stmt.executeQuery()
      publicList = getBaseListReplaceResult(fieldList,resultSet,replaceMap)
      stmt.close()
      conn.close()
    }
    publicList
  }


  /**
    * 获取集合数据
    * @param connStr
    * @param sql
    * @param field
    * @return
    */
  def getFinalBaseSetResult(connStr:String,sql:String,field: String) = {
    var publicSet = Set[String]()
    if(sql != "-1"){
      val conn = getConn(connStr)
      val stmt = conn.prepareStatement(sql)
      val resultSet = stmt.executeQuery()
      publicSet = getBaseSetResult(field,resultSet)
      stmt.close()
      conn.close()
    }
    publicSet
  }

  /**
    * 执行SQL 获取结果  map
    * @param connStr
    * @param sql
    * @param fieldList
    * @return
    */
  def getFinalBaseMapResult(connStr:String,sql:String,fieldList: List[String]) = {
    var publicMap = Map[String,String]()
    if(sql != "-1"){
      val conn = getConn(connStr)
      val stmt = conn.prepareStatement(sql)
      val resultSet = stmt.executeQuery()
      publicMap = getBaseMapResult(fieldList,resultSet)
      stmt.close()
      conn.close()
    }
    publicMap
  }

  /**
    * 获取基本List[{String -> String,String -> String},{String -> String,String -> String}]
    * @param fieldList
    * @param resultSet
    * @return
    */
  def getBaseListResult(fieldList: List[String],resultSet:ResultSet) = {
    var tempList = List[Map[String,String]]()
    while(resultSet.next()){
      var tempMap = Map[String,String]()
      val it = fieldList.toIterator
      while(it.hasNext){
        val k = it.next().toString
        val v = resultSet.getString(k)
        tempMap = tempMap ++ Map(k -> v)
      }
      tempList = tempList :+ tempMap
    }
    tempList
  }

  /**
    * 前提是数据只有一条
    * 获取map {"写死key":"xxx"}
    * @param k
    * @param filed
    * @param resultSet
    * @return
    */
  def getSingleMap(k:String,filed:String,resultSet:ResultSet) = {
    var tempMap = Map[String,String]()
    while(resultSet.next()){
      val v = resultSet.getString(filed)
      tempMap = tempMap ++ Map(k -> v)
    }
    tempMap
  }

  /**
    * 前提是数据只有一条
    * 获取 "xxx"
    * @param filed
    * @param resultSet
    * @return
    */
  def getSingleField(filed:String,resultSet:ResultSet) = {
    var temp = ""
    while(resultSet.next()){
      temp = resultSet.getString(filed)
    }
    temp
  }


  /**
    * 获取替换值的结果
    * @param fieldList
    * @param resultSet
    * @param replaceMap
    * @return
    */
  def getBaseListReplaceResult(fieldList: List[String],resultSet:ResultSet,replaceMap:Map[String,Map[String,String]]) = {
    var tempList = List[Map[String,String]]()
    while(resultSet.next()){
      var tempMap = Map[String,String]()
      val it = fieldList.toIterator
      while(it.hasNext){
        val k = it.next().toString
        var v = ""
        if(replaceMap.contains(k)){
          val tempV = resultSet.getString(k)
          v = replaceMap.getOrElse(k,Map[String,String]()).getOrElse(tempV,"")
        }else{
          v = resultSet.getString(k)
        }
        tempMap = tempMap ++ Map(k -> v)
      }
      tempList = tempList :+ tempMap
    }
    tempList
  }


  /**
    * 获取基本Map[String,String]格式数据
    * @param fieldList
    * @param resultSet
    * @return
    */
  def getBaseMapResult(fieldList: List[String],resultSet:ResultSet) = {
    var tempMap = Map[String,String]()
    while(resultSet.next()){
      val it = fieldList.toIterator
      while(it.hasNext){
        val kField = it.next().toString
        val k = resultSet.getString(kField)
        val vField = it.next().toString
        val v = resultSet.getString(vField)
        tempMap = tempMap ++ Map(k -> v)
      }
    }
    tempMap
  }

  /**
    * 获取不重复的集合
    * @param field
    * @param resultSet
    * @return
    */
  def getBaseSetResult(field: String,resultSet:ResultSet) = {
    var tempList = Set[String]()
    while(resultSet.next()){
      val k = field.toString
      val v = resultSet.getString(k)
      tempList = tempList + v
    }
    tempList
  }


}

2、数据源(只展示一个作为示例,第二个或者有更多实例都是一样的写法,只是数据库连接地址不一样)

package dataSource

import com.alibaba.druid.pool.DruidDataSource
import org.apache.commons.dbcp2.BasicDataSource


object FirstDataSource {

  val driver = "com.mysql.jdbc.Driver"
  val url = "jdbc:mysql://127.0.0.1:3306/first"//填写自己的数据库连接
  val username = "root"
  val password = "root"
  
  //use druid
  val connectionPool =  new DruidDataSource()
  connectionPool.setUsername(username)
  connectionPool.setPassword(password)
  connectionPool.setDriverClassName(driver)
  connectionPool.setUrl(url)
  connectionPool.setValidationQuery("select 1")
  connectionPool.setInitialSize(15)
  connectionPool.setMinIdle(10)
  connectionPool.setMaxActive(100)
  connectionPool.setRemoveAbandoned(true)
  connectionPool.setRemoveAbandonedTimeoutMillis(180000000)
  connectionPool.setMaxWait(5000)
  connectionPool.setTestOnBorrow(false)
  connectionPool.setTestOnReturn(false)

}

3、调用,获得数据

//1、获得集合list = [{"id":"0","name":"张乐","age":"18"},{"id":"1","name":"罗奎","age":"18"}]
val sql = """ select id,name,age from user; """
val fieldList = List("id","name","age ")
val resList = BaseDaoFactory.getFinalBaseListResult("FirstDataSource",sql,fieldList)


//2、获得map =  {"0":"张乐","1":"罗奎","2":"xx",...}  以id为key,姓名为value的map
val mapFieldList = List("id","name")
val resMap = BaseDaoFactory.getFinalBaseMapResult("FirstDataSource",sql,mapFieldList)


//如果不想执行两遍查询,耗费性能,可以直接在list中获取map
val equalMap = resList.map(ele => Map(ele.getOrElse("id","0") -> ele.getOrElse("name","-")))

推荐一个公众号

号主为一线大厂架构师,CSDN博客专家,博客访问量突破一千万。主要分享Java、golang架构,源码,分布式,高并发等技术,用大厂程序员的视角来探讨技术进阶、面试指南、职业规划等。15W技术人的选择!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张音乐

请我喝杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值