当前位置: 首页 > 后端技术 > Java

Foxnic-SQL(2)——SQL表达式(Expr)

时间:2023-04-01 14:26:46 Java

Foxnic-SQL(2)——SQL表达式(Expr)普通意义上的表达式表达式是运算符、常量和变量的组合。一个表达式可以由一个或多个操作数和零个或多个运算符组成以产生一个值。常量表达式、数学运算、关系表达式、逻辑表达式、位表达式等。SQL表达式Foxnic-SQL中提到的表达式其实就是SQL表达式。任何带有变量占位符的字符串都是一个SQL表达式,这些表达式最终可以组装成一个完整的SQL语句。Foxnic-SQL支持命名占位符(:NAME)和匿名占位符(?)。Foxnic-SQL通过Expr类构建和解析SQL表达式,例如:Exprexpr1=newExpr("select?+?asresultfromdual",8,9);System.out.println("expr1="+expr1);//输出:expr1=select8+9asresultfromdual这样的查询语句是一个表达式,问号(?)是一个变量占位符。它们没有名称,只有顺序,因此它们是匿名占位符。MapnamedParam=newHashMap<>();namedParam.put("P1",18);namedParam.put("P2",19);Exprexpr2=newExpr("选择:P1+:P2作为resultfromdual",namedParam);System.out.println("expr2="+expr2);//Output:expr2=select18+19asresultfromdual此示例将原始问号(?)占位符替换为命名占位符P1和P2以冒号(:)开头,这是带有命名占位符的SQL表达式。当然,表达式可以更简单一些,例如:Exprexpr1=newExpr("age>?",28);System.out.println("expr1="+expr1);//输出:expr1=age>28也可以是:Exprexpr1=newExpr("age>?andheight>?",28,182);System.out.println("expr1="+expr1);//output:expr1=age>28andheight>182从技术角度来说,SQL表达式关心的核心问题是变量占位符,它并没有'关心内容是否符合SQL语法。SQL表达式的执行当一个SQL表达式完整并符合SQL语法时,就可以被数据库执行。当表达式通过DAO传递给JDBC执行时,这些占位符被解析并处理成绑定变量。当打印或输出表达式时,占位符将被处理成符合指定数据库语法的SQL字符串,并且已代入变量。/***2.当表达式通过DAO传递给JDBC执行时,这些占位符被解析处理成绑定变量。当打印或输出表达式时,占位符将被处理成符合指定数据库语法的SQL字符串,并且已代入变量。**/publicstaticvoiddemo2(){Datedate=DateUtil.parse("2022-12-05");Exprexpr1=newExpr("select?+?asresultfrommy_tablewherecreate_date>?",8,9,date);System.out.println("StatementpassedtoJDBC(anonymousplaceholder)="+expr1.getListParameterSQL());//输出:传递给JDBC的语句(匿名占位符)=select?+?作为my_tablewherecreate_date>的结果?System.out.println("传递给JDBC的语句(命名占位符)="+expr1.getNamedParameterSQL());//输出:传递给JDBC的语句(命名占位符位)=select:PARAM_1+:PARAM_2asresultfrommy_tablewherecreate_date>:PARAM_3//指定全局SQL方言,默认MySQL,并自动识别特定数据库GlobalSettings.DEFAULT_SQL_DIALECT=SQL方言.MySQL;System.out.println("开发者友好的SQL(默认)="+expr1.getSQL());//输出:开发人员友好的SQL(默认)=从my_table中选择8+9作为结果wherecreate_date>str_to_date('2022-12-0500:00:00','%Y-%m-%d%H:%i:%s')System.out.println("对开发人员友好的SQL(Oracle)="+expr1.getSQL(SQLDialect.PLSQL));//输出:开发人员友好型SQL(Oracle)=select8+9作为my_table的结果wherecreate_date>to_date('2022-12-0500:00:00','yyyy-mm-ddhh24:mi:ss')//执行,这里注意控制台输出日志ExprexprForQuery=newExpr("select*fromsys_dictwherecreate_time>?",date);RcdSetrs=DBInstance.DEFAULT.dao().query(exprForQuery);for(Rcdr:rs){System.out.println(r.toJSONObject());}}开发者可以从表达式(Expr)中获取比传统的字符串拼接更灵活的方式,绑定变量友好的SQL处理方式也可以高效轻松地通过表达式避免SQL对数据库的硬解析,从而获得更好的性能。同时,开发者可以很方便地获取代入到绑定变量中的SQL语句。这些语句可以复制粘贴到数据库客户端工具中执行,大大方便了SQL语句的调试和排错。表达式组装Expr可以通过append方法实现两个表达式的拼接,示例代码:/***3.表达式组装**/publicstaticvoiddemo3(){//Example-1Exprexpr1=newExpr("age>",28);Exprexpr2=newExpr("身高>?",182);//通过append方法将expr2拼接到expr1expr1.append(expr2);System.out.println(expr1.getSQL());//输出:age>28andheight>182//Example-2Exprexpr3=newExpr("age>?",28);expr3.append("身高>?",182);System.out.println(expr1.getSQL());//Output:age>28andheight>182}总结Foxnic-SQL的Expr类负责解析SQL语句、子语句、语句片段中的绑定变量。它的目的是最终执行的SQL语句对JDBC友好,对开发者友好。Expr是Foxnic-SQL语句系统的基石,后续的其他语句对象均继承或合并自Expr。