MyBatis 参数解析器
MyBatis 参数解析器
一个专门用于解析MyBatis日志中参数字符串的独立工具模块。支持复杂的参数格式,包括含有逗号的参数值。
特性
- ✅ 解析标准MyBatis参数格式:
value(Type)
- ✅ 支持包含逗号的参数值:
'value, with, commas'(String)
- ✅ 支持单引号和双引号包围的字符串
- ✅ 智能括号匹配和引号处理
- ✅ 参数格式验证
- ✅ SQL格式化支持
- ✅ 参数类型统计
- ✅ 完整的单元测试覆盖
安装和使用
const {
parseParameters,
parseIndividualParameter,
validateParametersFormat,
formatParameters,
formatParameterForSql,
getParameterTypeStats
} = require('./parameterParser');
API 文档
parseParameters(parametersString)
解析MyBatis参数字符串为参数数组。
参数:
parametersString
(string): 参数字符串,格式如"1(Integer), 'hello'(String)"
返回值:
Array<{value: string, type: string}>
: 解析后的参数数组
示例:
// 基本用法
const result = parseParameters("1(Integer), Vehicle-0009(String)");
// 返回: [{ value: "1", type: "Integer" }, { value: "Vehicle-0009", type: "String" }]
// 包含逗号的参数
const result = parseParameters("1(Integer), 'Vehicle-0009, Model X'(String)");
// 返回: [{ value: "1", type: "Integer" }, { value: "Vehicle-0009, Model X", type: "String" }]
parseIndividualParameter(paramStr)
解析单个参数字符串。
参数:
paramStr
(string): 单个参数字符串,格式如"value(Type)"
返回值:
{value: string, type: string} | null
: 解析后的参数对象
示例:
const result = parseIndividualParameter("'hello, world'(String)");
// 返回: { value: "hello, world", type: "String" }
validateParametersFormat(parametersString)
验证参数字符串格式是否正确。
参数:
parametersString
(string): 待验证的参数字符串
返回值:
boolean
: 格式是否正确
示例:
const isValid = validateParametersFormat("1(Integer), hello(String)");
// 返回: true
formatParameters(parameters)
将参数数组格式化为可读字符串。
参数:
parameters
(Array): 参数数组
返回值:
string
: 格式化后的字符串
示例:
const formatted = formatParameters([
{ value: "1", type: "Integer" },
{ value: "hello", type: "String" }
]);
// 返回: "1. 1 (Integer), 2. hello (String)"
formatParameterForSql(parameter)
根据参数类型格式化参数值,用于SQL语句中。
参数:
parameter
(Object): 参数对象{value, type}
返回值:
string
: 格式化后的参数值
示例:
const sqlValue = formatParameterForSql({ value: "hello", type: "String" });
// 返回: "'hello'"
const sqlValue = formatParameterForSql({ value: "123", type: "Integer" });
// 返回: "123"
getParameterTypeStats(parameters)
统计参数类型分布。
参数:
parameters
(Array): 参数数组
返回值:
Object
: 类型统计对象
示例:
const stats = getParameterTypeStats([
{ value: "1", type: "Integer" },
{ value: "hello", type: "String" },
{ value: "2", type: "Integer" }
]);
// 返回: { "Integer": 2, "String": 1 }
支持的参数格式
基本格式
value(Type)
包含逗号的字符串
'value, with, commas'(String)
"value, with, commas"(String)
复杂示例
1(Integer), 'Vehicle-0009, Model X'(String), null(Object), 45.67(Double)
支持的数据类型
模块会自动识别以下数据类型,并在SQL格式化时正确处理引号:
需要引号的类型:
- String
- VARCHAR
- CHAR
- TEXT
- Date
- Time
- Timestamp
不需要引号的类型:
- Integer
- Long
- Double
- Float
- BigDecimal
- Boolean
- 其他数字类型
测试
运行单元测试:
npm test -- parameterParser.spec.js
运行示例:
node src/components/utils/java/mybatis/examples/parameterParserExample.js
集成使用
在MyBatis日志解析器中使用:
const { parseParameters } = require('./parameterParser');
// 在解析MyBatis日志时使用
function parseLogLine(line) {
if (line.includes('Parameters:')) {
const paramStr = extractParameterString(line);
const parameters = parseParameters(paramStr);
return parameters;
}
}
错误处理
- 无效输入(null、undefined、空字符串)返回空数组
- 格式错误的参数会尝试解析为
{value: input, type: 'Unknown'}
- 引号不匹配或括号不匹配时会进行最佳努力解析
性能考虑
- 使用状态机方式解析,时间复杂度为 O(n)
- 支持大量参数的解析
- 内存使用效率高,避免不必要的字符串复制
贡献
欢迎提交问题和改进建议。在提交PR之前请确保:
- 添加相应的单元测试
- 更新文档
- 确保所有测试通过