zoukankan      html  css  js  c++  java
  • Java使用mongodb原生增删改查语句

    Java使用mongodb原生增删改查语句

    2018-03-16

    自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb

    结构

    代码

    0 pom.xml

      <dependencies>
          <dependency>
              <groupId>org.mongodb</groupId>
              <artifactId>mongo-java-driver</artifactId>
              <version>3.2.2</version>
          </dependency>
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.31</version>
          </dependency>
      </dependencies>

    1 客户端操作Client.java

    package com.mongodb.util;
    
    import com.mongodb.util.DBConnection.DriverName;
    
    public class Client {
    
        public static void main(String[] args) {
            DBConnection conn = new DBConnection();
            conn.setDbConnectionName("mongoDb1");
            conn.setSource("****");
            conn.setDbName("****");
            conn.setDriverName(DriverName.mongodb);
            conn.setServerHost("****");
            conn.setServerPort("27017");
            conn.setUserName("****");
            conn.setPassword("****");
            String querySqlWithFields = "db.getCollection('laAppInterface').find({$or:[{'appCode':'100005'},{'appCode':'10005'}]},{'appCode':1,'interfaceId':1})";
            String querySqlWithoutFields = "db.getCollection('laAppInterface').find({$or:[{'appCode':'100005'},{'appCode':'10005'}]})";
            
            Crud.Connect(conn);
            
            //注意:客户端工具Robomogon中,保存整数1,要用NumberInt(1),否则会变成1.0
            String create = "db.getCollection('laAppInterface').save({'appCode':'10005','interfaceId':'TEST-API-0000068','invokeType':1,'callbackAddress':'',})";
            System.out.println("Create: "+Crud.OperateDB(create,false));
            System.out.println(Crud.OperateDB(querySqlWithFields, false));
            System.out.println(Crud.OperateDB(querySqlWithFields, true));
            System.out.println(Crud.OperateDB(querySqlWithoutFields, false));
            System.out.println(Crud.OperateDB(querySqlWithoutFields, true));
            String update="db.getCollection('laAppInterface').update({'interfaceId':'TEST-API-0000068'},{$set:{'appCode':'100005'}});";
            System.out.println("Update: "+Crud.OperateDB(update,false));
            System.out.println(Crud.OperateDB(querySqlWithFields, false));
            
            String delete="db.getCollection('laAppInterface').remove({$or:[{'appCode':'100005'},{'appCode':'10005'}]});";
            System.out.println("Delete: "+Crud.OperateDB(delete,false));
            System.out.println(Crud.OperateDB(querySqlWithFields, false));
            
    
            //比较运算
            String queryGt="db.getCollection('laAppInterface').find({'invokeType':{$gt:1}},{'appCode':1,'invokeType':1})";        
            System.out.println("queryGt: "+Crud.OperateDB(queryGt, false));
            
            //暂不支持模糊查询 {'appCode':/0005/}        
        }
    }
    View Code

    执行结果:

    Create: 0
    [["10005","TEST-API-0000068"]]
    [{"appCode":"10005","interfaceId":"TEST-API-0000068"}]
    [[{"counter":7184126,"date":1521186717000,"machineIdentifier":7002056,"processIdentifier":13740,"time":1521186717000,"timeSecond":1521186717,"timestamp":1521186717},"10005","TEST-API-0000068",1,""]]
    [{"_id":{"counter":7184126,"date":1521186717000,"machineIdentifier":7002056,"processIdentifier":13740,"time":1521186717000,"timeSecond":1521186717,"timestamp":1521186717},"appCode":"10005","interfaceId":"TEST-API-0000068","invokeType":1,"callbackAddress":""}]
    Update: 1
    [["100005","TEST-API-0000068"]]
    Delete: 1
    []
    queryGt: [["1002",4],["1002",4],["1002",4],["1002",4],["1002",4],["1004",4],["1002",4],["1002",4],["1002",4],["1002",4],["1001",4],["1001",4],["1001",4],["1001",4],["1001",4]]

    2 mongodb增删改查操作Crud.java

    只暴露两个方法

    public static void Connect(DBConnection dbCon);
    public static String OperateDB(String sql, Boolean hasColumnName); 
    package com.mongodb.util;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.mongodb.BasicDBObject;
    import com.mongodb.DB;
    import com.mongodb.DBCursor;
    import com.mongodb.DBObject;
    import com.mongodb.MongoClient;
    import com.mongodb.MongoCredential;
    import com.mongodb.ServerAddress;
    import com.mongodb.WriteResult;
    import com.mongodb.util.DBConnection.DriverName;
    
    public class Crud {
    
        static DB mongoConn = null;
    
        public static void Connect(DBConnection dbCon) {
            if (dbCon.getDriverName() == DriverName.mongodb) {
                ServerAddress serverAddress = new ServerAddress(dbCon.getServerHost(), Integer.valueOf(dbCon.getServerPort()));
                List<ServerAddress> addrs = new ArrayList<>();
                addrs.add(serverAddress);
                MongoCredential credential = MongoCredential.createScramSha1Credential(dbCon.getUserName(), dbCon.getSource(), dbCon.getPassword().toCharArray());
                List<MongoCredential> credentials = new ArrayList<>();
                credentials.add(credential);
    
                // 通过连接认证获取MongoDB连接
                MongoClient mongoClient = new MongoClient(addrs, credentials);
    
                @SuppressWarnings("deprecation")
                DB con = mongoClient.getDB(dbCon.getDbName());
                
                mongoConn = con;
            }
        }
    
        public static String OperateDB(String sql, Boolean hasColumnName) {
            String result = "";
            if (sql.toUpperCase().contains(").FIND(")) {
                result = Query(sql, hasColumnName);
    
            }
            else if(sql.toUpperCase().contains(").REMOVE("))
            {
                result=String.valueOf(Delete(sql));
            }    
            else if(sql.toUpperCase().contains(").UPDATE("))
            {
                result=String.valueOf(Update(sql));
            }    
            else {
                result= String.valueOf(Create(sql));
            }
            return result;
        }
        
    
        private static String Query(String sql, Boolean hasColumnName) {
            String tableName = RegExpUtil.getTableName(sql);
            String query = RegExpUtil.getQuery(sql);
            List<String> columnNames = getColumnNames(query);
    
            BasicDBObject queryObject = (BasicDBObject) JSON.parse(query);
            DBCursor cursor = mongoConn.getCollection(tableName).find(queryObject);
            JSONArray lists = new JSONArray();
    
            while (cursor.hasNext()) {
                JSONObject jsonObj = new JSONObject();
                JSONArray subLists = new JSONArray();
                DBObject o = cursor.next();
                if (!columnNames.isEmpty()) {
                    if(!hasColumnName)
                    {
                        for (String columnName : columnNames)
                            subLists.add(o.get(columnName));
                        lists.add(subLists);
                    }
                    else {
                        for (String columnName : columnNames)
                            jsonObj.put(columnName, o.get(columnName));
                        lists.add(jsonObj);
                    }
                } else {
                    if(!hasColumnName)
                    {
                        Iterator<String> it = o.keySet().iterator();
                        while(it.hasNext())
                            subLists.add(o.get(it.next()));
                        lists.add(subLists);
                    }
                    else {
                        lists.add(o);
                    }
                }
    
            }
            return FastJsonUtil.ObjectToString(lists);
        }
    
        private static int Create(String sql)
        {
            String tableName = RegExpUtil.getTableName(sql);
            String create = RegExpUtil.getCreate(sql);
            BasicDBObject createObject = (BasicDBObject) JSON.parse(create);
            WriteResult writeResult = mongoConn.getCollection(tableName).save(createObject);
            return writeResult.getN();
        }
        
        private static int Update(String sql)
        {
            String tableName = RegExpUtil.getTableName(sql);
            
            String update = RegExpUtil.getUpdate(sql);
            BasicDBObject updateQueryObject = (BasicDBObject) JSON.parse(update);
            
            String upset = getUpset(update);
            BasicDBObject upsetObject = (BasicDBObject) JSON.parse(upset);
            WriteResult updateResult = mongoConn.getCollection(tableName).update(updateQueryObject, upsetObject);
            return updateResult.getN();
        }
        
        private static int Delete(String sql)
        {
            String tableName = RegExpUtil.getTableName(sql);
            String delete = RegExpUtil.getRemove(sql);
            BasicDBObject deleteObject = (BasicDBObject) JSON.parse(delete);
            WriteResult writeResult = mongoConn.getCollection(tableName).remove(deleteObject);
            return writeResult.getN();
        }
        
        private static List<String> getColumnNames(String query) {
            String tmp = RegExpUtil.getObject(query,1);
            return RegExpUtil.getColumnNames(tmp);
        }
        
        private static String getUpset(String query) {
            String tmp  = RegExpUtil.getObject(query, 1);
            return tmp;
        }
    }
    View Code

    3 实体类DBConnection.java

    package com.mongodb.util;
    
    public class DBConnection {
        public enum DriverName {
            oracle, db2, sqlserver, mysql, sybase, postgresql,mongodb
        }
        private String dbConnectionName;
        private DriverName driverName;
        private String serverHost;
        private String serverPort;
        private String source;
        private String dbName;
        private String userName;
        private String password;
        public String getDbConnectionName() {
            return dbConnectionName;
        }
        public void setDbConnectionName(String dbConnectionName) {
            this.dbConnectionName = dbConnectionName;
        }
        public DriverName getDriverName() {
            return driverName;
        }
        public void setDriverName(DriverName driverName) {
            this.driverName = driverName;
        }
        public String getServerHost() {
            return serverHost;
        }
        public void setServerHost(String serverHost) {
            this.serverHost = serverHost;
        }
        public String getServerPort() {
            return serverPort;
        }
        public void setServerPort(String serverPort) {
            this.serverPort = serverPort;
        }
        public String getDbName() {
            return dbName;
        }
        public void setDbName(String dbName) {
            this.dbName = dbName;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getSource() {
            return source;
        }
        public void setSource(String source) {
            this.source = source;
        }
        
    }
    View Code

    4 RegExpUtil.java

    package com.mongodb.util;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegExpUtil {
    
        static String tableRegExp = "getCollection\('(\w+?)'\)";
        static String queryRegExp = "\.find\((.*?)\)";
        static String columnNameRegExp = "'(\w+?)':";
        static String createRegExp = "\.save\((.*?)\)";
        static String removeRegExp = "\.remove\((.*?)\)";
        static String updateRegExp = "\.update\((.*?)\)";
    
        static public String getObject(String str, int index) {
            int len = str.length();
            char[] chars = str.toCharArray();
            Stack<Character> stack = new Stack<Character>();
            int begin = 0, end = 0, i = 0, curIndex = 0;
            while (i < len && curIndex <= index) {
                // '{'入栈
                while (i < len&&stack.empty()) {
                    if (chars[i] == '{') {
                        stack.push(chars[i]);
                        begin = i;
                    }
                    ++i;
                }
                if (stack.empty()) {
                    return "";
                }
                // 第curIndex个object
                while (!stack.empty() && i < len) {
                    if (chars[i] == '{') {
                        stack.push(chars[i]);
    
                    }
                    if (chars[i] == '}') {
                        if (!stack.empty() && stack.peek() == '{') {
                            stack.pop();
                        }
                    }
                    ++i;
                }
                if (stack.empty()) {
                    end = i - 1;
                    if (curIndex == index)
                        return str.substring(begin, end+1);
                } else {
                    return "";
                }
    
                ++curIndex;
            }
            return "";
        }
    
        public static List<String> getColumnNames(String sql) {
            return GetWithRegExps(sql, columnNameRegExp);
        }
    
        public static String getTableName(String sql) {
            return GetWithRegExp(sql, tableRegExp);
        }
    
        public static String getQuery(String sql) {
            return GetWithRegExp(sql, queryRegExp);
        }
    
        public static String getCreate(String sql) {
            return GetWithRegExp(sql, createRegExp);
        }
    
        public static String getUpdate(String sql) {
            return GetWithRegExp(sql, updateRegExp);
        }
    
        public static String getRemove(String sql) {
            return GetWithRegExp(sql, removeRegExp);
        }
    
        private static String GetWithRegExp(String s, String regExp) {
            Pattern r = Pattern.compile(regExp);
            // 现在创建 matcher 对象
            Matcher m = r.matcher(s);
            if (m.find()) {
                return m.group(1);
            }
    
            return "";
        }
    
        private static List<String> GetWithRegExps(String s, String regExp) {
            List<String> ss = new ArrayList<String>();
            Pattern r = Pattern.compile(regExp);
            // 现在创建 matcher 对象
            Matcher m = r.matcher(s);
            while (m.find()) {
                ss.add(m.group(1));
            }
    
            return ss;
        }
    
    }
    View Code

    5 FastJsonUtil.java

    package com.mongodb.util;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONPath;
    import com.alibaba.fastjson.parser.Feature;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    public class FastJsonUtil {
        public static String ObjectToString(Object o) {
            String s = JSON.toJSONString(o);
            return TrimDoubleQuote(s);
        }
        
        private static String TrimDoubleQuote(String s) {
            if (s.startsWith(""") && s.endsWith(""")) {
                s = s.substring(1, s.length());
                s = s.substring(0, s.length() - 1);
            }
            return s;
        }    
    }
    View Code

    待完善

    代码暂不支持:

    • 正则表达式查询,如 db.getCollection('laAppInterface').find({'appCode':/^1.*?1$/})  中正则表达式 /^1.*?1$/
    • 不支持函数,如db.getCollection('laAppInterface').update({'interfaceId':'TEST-API-0000068'},{$set:{"invokeType":NumberInt(1)}}); 中函数NumberInt(1)
  • 相关阅读:
    redis集群报Jedis does not support password protected Redis Cluster configurations异常解决办法
    redis集群密码设置
    Redis 3.2.4集群实战
    Redis3.2.4 Cluster集群搭建
    redis集群环境的搭建和错误分析
    Centos iptables防火墙关闭启动详解
    动态的表格数据
    ubuntu使用抓包工具,charles
    layer结合art实现弹出功能
    禅道开源版源码安装
  • 原文地址:https://www.cnblogs.com/Ming8006/p/8583054.html
Copyright © 2011-2022 走看看