convert-sql.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // 转化Sql 函数 传入 "select * from table <if test=\"id != null and id != ''\"> id = ${id} </if>" 这样的字符串
  2. // data 传入 {id: ''} 这样的数据, 如果 id != null && id != '' 那么就生成 select * from table
  3. // 如果 data 传入 {id: '123'}, 这样的数据那么就生成 select * from table where id = '123'
  4. function dynamicJudgment(testReg: string, data: any, dataStr: string) {
  5. let funcStr = `${dataStr}\nreturn ${testReg}`
  6. let func = new Function('data', 'testReg', funcStr)
  7. try {
  8. return func(data, testReg)
  9. } catch (e) {
  10. return false
  11. }
  12. }
  13. /**
  14. * 把 data 中的 key 变成了
  15. * var {id, name} = data
  16. * @param data 数据
  17. * @returns {string} 返回字符串
  18. */
  19. function getDataParam(data: any): string {
  20. let dataParam = ''
  21. for (let key in data) {
  22. dataParam += `${key},`
  23. }
  24. dataParam = dataParam.substring(0, dataParam.length - 1)
  25. // 这个是把 data 中的 key 给解析出来
  26. dataParam = 'var {' + dataParam + '} = ' + 'data'
  27. return dataParam
  28. }
  29. /**
  30. * 把 sql 像 mybatis 一样动态拼接
  31. * @param {string} sqlStr sql 字符串
  32. * @param {any} data 需要填充的数据
  33. * @returns {string} 返回sql
  34. */
  35. const convertSql = (sqlStr: string, data: any): string => {
  36. // 去除掉 字符串中的换行,不然 sqlStr.match(reg) 会返回 null
  37. sqlStr = sqlStr.replace(/[\r\n]/g, ' ')
  38. let reg = /<if test="(.+?)">(.+?)<\/if>/g
  39. let arr = sqlStr.match(reg)
  40. let dataParam = getDataParam(data)
  41. if (arr) {
  42. arr.forEach(item => {
  43. // '<if test="id != null and id != \'\'"> id = ${id} </if>
  44. // 获取 test =" 里面的内容
  45. let testReg = item.match(/test="(.+?)"/)[1]
  46. // 把 and 换成 && 把 or 换成 || 这样 js 才能判断
  47. testReg = testReg.replace(/\band\b/g, ' && ').replace(/\bor\b/g, ' || ')
  48. // 获取到 <if test="id != null and id != \'\'"> id = ${id} </if>
  49. // 被 if 包裹的元素
  50. if (dynamicJudgment(testReg, data, dataParam)) {
  51. let dataStr = item.match(/<if test="(.+?)">(.+?)<\/if>/)[2]
  52. sqlStr = sqlStr.replace(item, dataStr)
  53. } else {
  54. sqlStr = sqlStr.replace(item, '')
  55. }
  56. })
  57. }
  58. let 填充数据 = new Function('data', 'sqlStr', `${dataParam} \n return \`${sqlStr}\``)
  59. return 填充数据(data, sqlStr)
  60. }
  61. export default convertSql