问题简介:在工作中,表字段多到一定程度,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
原文地址:https://www.cnblogs.com/orchid9/p/10022931.html
时间: 2024-10-12 21:48:14