1. 程式人生 > >校驗Select和Insert的方法

校驗Select和Insert的方法

問題簡介:在工作中,表字段多到一定程度,Select 中的欄位和結果集中的欄位對比很麻煩,還容易出錯。於是寫了一個檢查Select和Insert的方法。(使用的是Scala語言)

  1.先判斷語句是select語句還是insert語句

def sqlTest(str: String): Unit = {
    //檢測是select語句還是insert語句
    if ( str.contains("select") ) {
      selectTest(str)
    } else {
      insertTest(str)
    }
  }

  2.如果是select語句,使用如下方法

 

def selectTest(selectStr: String): Unit = {
    var selectLists: List[String] = List()
    //1.將select與from中的欄位,放入連結串列中
    selectLists = selectStr.substring(selectStr.indexOf("select") + 6, selectStr.indexOf("from")).replace("\r\n", "").trim.split(",").toList
    //2.獲取第一個rs.get中所有的值
    var rsLists: List[String] = List()
    rsLists = nextElement(selectStr, rsLists)
    //3.判斷select語句和結果集獲取的值中的引數是否重複
    if ( selectLists.distinct.size != selectLists.size ) {
      println("查詢語句有重複值")
    }
    if ( rsLists.distinct.size != rsLists.size ) {
      println("設定的結果集有重複值")
    }
    //4.比較select語句和結果集獲取的值中的引數是否相等
    val selectSurplus = selectLists.toSet -- rsLists.toSet
    val rsSurplus = rsLists.toSet -- selectLists.toSet
    if ( selectSurplus.nonEmpty ) {
      println("select語句中多結果集多的欄位有" + selectSurplus)
    }
    if ( rsSurplus.nonEmpty ) {
      println("結果集語句中比select多的欄位有" + rsSurplus)
    }
  }

  @tailrec
  def nextElement(string: String, list: List[String]): List[String] = {
    val rightIndex = string.indexOf("\")")
    val leftIndex = string.indexOf("(\"") + 2
    val lists = list.::(string.substring(leftIndex, rightIndex))
    val subString = string.substring(rightIndex + 2)
    if ( string.lastIndexOf("\")").hashCode() == rightIndex.hashCode() ) {
      lists
    } else {
      nextElement(subString, lists)
    }
  }

 

  3.如果是insert語句,使用如下方法

 def insertTest(insertStr: String): Unit = {
    //1.獲取insert和values之間的字串,計算','的個數
    val insertSubFront = insertStr.substring(insertStr.indexOf("insert"), insertStr.indexOf("values"))
    val insertSubFrontNums = countNumbers(insertSubFront)
    //2.獲取values之後的字串,計算','的個數
    val insertSubBack = insertStr.substring(insertStr.indexOf("values"))
    val insertSubBackNums = countNumbers(insertSubBack)
    //3.判斷兩個字串中的','數量差值
    val delNums = insertSubFrontNums - insertSubBackNums
    if ( delNums < 0 ) {
      println(s"values 的括號中多了[$delNums]個數據")
    } else if ( delNums > 0 ) {
      println(s"values 的括號中缺少[$delNums]個數據")
    } else {
      println("INSERT語句中欄位都有值對應")
    }
  }

  private def countNumbers(strs: String): Integer = {
    //計算包含','字元的數量
    var count: Integer = 0
    strs.foreach {
      str =>
        if ( str == ',' ) {
          count = count + 1
        }
    }
    count
  }

  4.使用的時候直接呼叫sqlTest方法,放入對應的SQL就成。

//此變數為測試使用,不一定按照此格式使用
val selectStr =
    """
      |select
      |name,
      |password,
      |hello2
      |from
      |aa
      |rs.getString("name")
      |rs.getString("password")
      |rs.getString("hello")
    """.stripMargin
//此變數為測試使用,不一定按照此格式使用
val insertStr =
    """
      |insert
      |into
      |(name,
      |password,
      |hello2)
      | values
      |(?,?,?)
    """.stripMargin