使用mybatis的动态sql解析能力生成sql

需求:

    计算平台,有很多表,打算提供一个基于sql的服务接口, sql不能完全在配置页面写死,  要能根据参数不同执行不同的语义,防止sql个数爆炸
  • 把mybatis原码down下来, 改造一下测试用例, 观察一下动态sql的原理
    使用mybatis的动态sql解析能力生成sql_第1张图片

  • 可以看出IfSqlNode WhereSqlNode....这些sqlNode是解析xml文件得到的, 中间经过各种组合, 总不能再手动实现xml解析过程
    sqlSource.getBoundSql会根据入参自动计算ognl表达式,生成动态sql

  • 继续查看 XMLMapperBuilder, 这个可以自动解析xml, 但是mybatis依赖一些java pojo, 如果没有这些pojo,还能生成sql吗? 答案是肯定的


    使用mybatis的动态sql解析能力生成sql_第2张图片
    使用mybatis的动态sql解析能力生成sql_第3张图片

总结:

Q:如何把xml文本解析成各种sqlNode
A: XMLMapperBuilder.parse自动生成各种sqlNode

Q:没有java对象时如何使用动态解析的能力, 生成自定义sql
A: XMLMapperBuilder指定sql文件位置,然后用mappedStatement.getBoundSql(...params).getSql()即可得到动态生成的sql
后端只需要对每个sql生成一个xml字符串

你可能感兴趣的:(使用mybatis的动态sql解析能力生成sql)