# string-engine **Repository Path**: JayEinstein/string-engine ## Basic Information - **Project Name**: string-engine - **Description**: 一个即兴随手写的java字符引擎,真要使用推荐Kotlin - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-16 - **Last Updated**: 2022-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 个人因为在项目上使用StringBuilder拼接sql和pdf大文本语句感觉太麻烦, 很容易把人弄得头晕眼花,从而独自仿照JS语法实现的一个简单清晰的字符串拼接引擎。
主要分为字符解析、字符块拼接、自定义函数、运算和值解析四个部分, 当前已经实现了if,else,for,+-×÷四则运算,值解析,模块导入以及方法递归等功能, 稍微尴尬一点的就是实现完之后发现JDK扩展包居然自带JS引擎(javax.script.ScriptEngine), 运算和值解析部分可以直接使用javax脚本引擎替代。 #### demo演示: ``` // 普通的 if else, elseIf 简写为 ife func01(name) { select * from user where $if(name == '张三') { name = 'zhangsan' } $ife(name == '李四') { `name = 'lisi'` } $else { 1=1 } } -------------------------------------------------------------------------- FuncModuleDemoHandler handler = new FuncModuleDemoHandler("str/Demo.str"); // if String r1 = handler.exec("func01", "张三"); // 返回String可以自定义格式 System.out.println(r1); // else String r2 = handler.exec("func01", "err"); System.out.println(r2); 输出:--------------------------------------------------------------------- select * from user where name = 'zhangsan' select * from user where 1=1 ``` ``` // for循环 func02(list) { 循环begin: $for(item, ndx : list) { 索引:${ndx},值:${item}。 } 循环end. } -------------------------------------------------------------------------- FuncModuleDemoHandler handler = new FuncModuleDemoHandler("str/Demo.str"); // for 循环 String exec = handler.exec("func02", Arrays.asList("a", "b", "c", "d")); System.out.println(exec); 输出:--------------------------------------------------------------------- 循环begin: 索引:0,值:a。 索引:1,值:b。 索引:2,值:c。 索引:3,值:d。 循环end. ``` ``` // 方法引用 func03() { 引用func01:$func01() \n // `xx`为一个字符块,不添加``则全局默认有一个`` `引用func01:`$func01() } -------------------------------------------------------------------------- FuncModuleDemoHandler handler = new FuncModuleDemoHandler("str/Demo.str"); // 方法引用 String exec = handler.exec("func03"); System.out.println(exec); 输出:--------------------------------------------------------------------- 引用func01: select * from user where 1=1 引用func01: select * from user where 1=1 ``` ``` // (..)Map和Bean字段自动展开 func04(..) { if简写:在“\$”前加个"!",参数:`!${arg0}`。不存在的参数则\`\`内的字符块不拼接 \n if简写:在“\$”前加个"!",参数:`!${arg1}`。不存在的参数则\`\`内的字符块不拼接 } -------------------------------------------------------------------------- FuncModuleDemoHandler handler = new FuncModuleDemoHandler("str/Demo.str"); // if简写:在“$”前加个"!",参数:`!${arg0}`。不存在的参数则``内的字符块不拼接 Map param = new HashMap<>(); param.put("arg1", "有值"); String r1 = handler.exec("func04", param); System.out.println(r1); 输出:--------------------------------------------------------------------- if简写:在“$”前加个"!",参数:。不存在的参数则``内的字符块不拼接 if简写:在“$”前加个"!",参数:有值。不存在的参数则``内的字符块不拼接 ``` ``` // sql 自定义where函数 sql01(..) { SELECT * FROM BLOG $where() { `state = '!${state}'` `AND title like '!${title}'` `AND author_name like '!${author.name}'` } // mybatis动态sql对比 \n SELECT * FROM BLOG WHERE state = #{state} AND title like #{title} AND author_name like #{author.name} } -------------------------------------------------------------------------- /** * 随便定义了一个sql的 where函数 {@link jay.einstein.string.engine.app.func.sql.Where} * 当有函数体内的字符块有值时,则前前面加个‘where’ */ FuncModuleDemoHandler handler = new FuncModuleDemoHandler("str/Demo.str"); Map param = new HashMap<>(); param.put("state", "李四"); param.put("title", null); Map obj = new HashMap<>(); obj.put("name", "张三"); param.put("author", obj); String sql01 = handler.exec("sql01", param); System.out.println(sql01); 输出:--------------------------------------------------------------------- SELECT * FROM BLOG where state = '李四' AND author_name like '张三' SELECT * FROM BLOG WHERE state = '李四' AND title like AND author_name like '张三' ```