# 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 '张三'
```