校驗Select和Insert的方法
阿新 • • 發佈:2018-11-26
問題簡介:在工作中,表字段多到一定程度,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