校验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

  

原文地址:https://www.cnblogs.com/orchid9/p/10022931.html

时间: 2024-10-12 21:48:14

校验Select和Insert的方法的相关文章

mybatis之@Select、@Insert、@Delete、@Param

之前学习的时候,看到别人在使用mybatis时,用到@Select.@Insert.@Delete.@Param这几个注解,故楼主研究了一下,在这里与大家分享 当使用这几个注解的时候,可以省去写Mapper.xml等一系列配置文件 首先来看个例子: import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotation

动态SQL拼接,select,insert的写法

1 import java.util.Iterator; 2 import java.util.Map; 3 import java.util.Set; 4 5 public class SQLUtil { 6 public static String sqlSelect = ""; 7 8 public static String selectQuerySQL(Map<String, Object> map, String tableName) { 9 if (map.i

只显示前几条数据的sql语句写法 七种数据库中Select Top的使用方法

七种数据库中Select Top的使用方法 1. Oracle数据库 SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库 SELECT FIRST N * FROM TABLENAME 3. DB2数据库 SELECT * FROM (SELECT * ROW_NUMBER() OVER({ORDER BY COL1 DESC}) AS ROWNUM FROM TABLENAME) WHERE ROWNUM <= N 或者 SELEC

Mysql 时间格式默认空串 &#39;0000-00-00 00:00:00&#39; select抛出异常的解决方法

Mysql 时间格式默认插入值为空时,会以'0000-00-00 00:00:00'填充,这时如果select时会抛出SQLExecption如下: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 解决方法如下: 方法一:jdbc的url加zeroDateTimeBehavior参数: datasource.url=jdbc:mysql://localh

List的 Select()使用方法 Demo

List的 Select()使用方法 用List存储对象,代码如下: IList<Student> studentList = new List<Student>(); for(int i=0;i<1000;i++) { Student student = new Student(); //赋值 studentList.Add(student); } 现在需要从studentList中查询符合条件的对象,Student中有个ClassName字段,需要从studentList

jquery easyui校验select下拉列表值是否为空的问题

属性名 类型 描述 默认值 required 布尔 定义文本域是否为必填项 false validType 字符串 定义字段的验证类型,比如email, url, etc. null missingMessage 字符串 当文本框为空时提示的文本信息 This field is required. invalidMessage 字符串 当文本框内容不合法时提示的文本信息 null required只表示文本框中是否有内容,easy ui的select框渲染完后 会自动添加一个文本框用于输入,如下

SELECT CASE 语句使用方法

SELECT CASE 语句 ****** select id ,'sexNo'= case when sex='先生' then 2 when sex='女士' then 3 else 1 end ,age FROM [ comsiterefer] SELECT CASE 语句使用方法

VC 操作 EXCEL---插入工作表(Insert.Sheet)方法

看到的资料 http://bbs.csdn.net/topics/198565 自己总结一下 //插入到nIndex工作表之前 void InsertSheet(int nIndex) { sheets = book.GetSheets(); COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); COleVariant covBefore; covBefore.vt = VT_DISPATCH; covBefore.pdis

前端校验框架ValidForm之check方法修正

用过validform的朋友相信都知道,在利用check方法的时候,发现该方法对表单输入值只要符合datatype规则的就返回ture.那么我们想对某个字段进行ajax重复校验的时候,只需要在该表单元素添加ajaxurl就可以了,但是check方法并没有对ajaxurl返回过来的值进行捕捉,即ajaxurl返回{status:no}的情况下,只有其他校验都通过,check返回的结果都是true.这样一来,利用check方法的人就希望能修复这个问题.在此我提供了个人的方法对框架进行了改动,希望帮到