目录
场景:
最近写了一个目录管理的需求,用的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
终于看到曙光了,附一下地址:
接下来就是引用依赖自己封装写工具类了,以下是我给同事提供的工具类代码
实操:
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%')");
}
}
以下是运行结果: