目录

场景:    

举例:

        我这边存储的sql where子句是:

        他需要用到的MongoDB语法格式是:

实操:

1.引用依赖

2.封装转义工具类

3.测试用例

以下是运行结果:


场景:    

    最近写了一个目录管理的需求,用的MySQL数据库,存储了一些查询条件,对接我的同事他做的模块用的是MongoDB数据库,这样就需要转义。

举例:

        我这边存储的sql where子句是:

a != 1 and b = 2 or (c =3 and d = 4 or e like '%5%')

        他需要用到的MongoDB语法格式是:

{
    "$or":[
        {
            "a":{
                "$ne":1
            }
        },
        {
            "b":2
        },
        {
            "$or":[
                {
                    "c":3
                },
                {
                    "d":4
                },
                {
                    "e":{
                        "$regex":"^.*5.*$"
                    }
                }
            ]
        }
    ]
}

        这样看,转义自己写是相当费劲,因为语法完全不一样,尤其是涉及到多个‘“或”“与”“非”加括号的时候就很容易崩溃了...

        所以最好的办法就是面向对象,没错去找工具类,吃现成的……

        经鄙人不懈努力的查找下,终于再github上找到了可用的工具包

        sql-to-mongo-db-query-converter

        终于看到曙光了,附一下地址:

sql转MongoDB语法的工具包github地址

接下来就是引用依赖自己封装写工具类了,以下是我给同事提供的工具类代码

实操:

1.引用依赖

<dependency>
   <groupId>com.github.vincentrussell</groupId>
   <artifactId>sql-to-mongo-db-query-converter</artifactId>
   <version>1.21</version>
</dependency>

2.封装转义工具类

import com.github.vincentrussell.query.mongodb.sql.converter.MongoDBQueryHolder;
import com.github.vincentrussell.query.mongodb.sql.converter.QueryConverter;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;

/**
 * 类描述: mysql语句转mongoDB语句
 *
 * @author bijianhuan
 * @version 1.0
 * @date 2022/6/18 11:26
 */
@Slf4j
public class MysqlConvertToMongoDB {

    public static Document SqlConvertToMongoDB(String dataCondition) throws Exception {
        log.info("需要转义sql: " + dataCondition);
        String sql = "select * from t where " + dataCondition;
        log.info("转义前的sql: " + sql);
        QueryConverter queryConverter = new QueryConverter.Builder().sqlString(sql).build();
        MongoDBQueryHolder mongoDBQueryHolder = queryConverter.getMongoQuery();
        String collection = mongoDBQueryHolder.getCollection();
        Document query = mongoDBQueryHolder.getQuery();
        String mongosql = query.toJson();
        log.info("转义后的sql: " + mongosql);
        log.info("返回值Document: " + query);
        return query;
    }

}

3.测试用例

import org.bson.Document;

/**
 * 类描述:
 *
 * @author bijianhuan
 * @version 1.0
 * @date 2022/6/18 11:30
 */
public class CheckFormat {
    public static void main(String[] args) throws Exception {

        Document document = MysqlConvertToMongoDB.SqlConvertToMongoDB("a != 1 and b = 2 or (c =3 and d = 4 or e like '%5%')");

    }

}

以下是运行结果:

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐