校验Select和Insert的方法

Posted orchid9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了校验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("
", "").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

  

 

以上是关于校验Select和Insert的方法的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中insert into select和select into的区别

MYSQL insert into select 锁表问题

bootstrapvalidator+bootstrap-select select无法校验问题解决方法

Laravel:如何在控制器的几种方法中重用代码片段

SQLite INSERT 和 DELETE 查询给出错误,但不是 SELECT 查询

在 SQL 的 select 语句中使用 insert