当前位置: 首页 > article >正文

03/29 使用 海康SDK 对接时使用的 MysqlUtils

前言

最近朋友的需求, 是需要使用 海康sdk 连接海康设备, 进行数据的获取, 比如 进出车辆, 进出人员 

这一部分是 资源比较贫瘠时的一个 Mysql 工具类 

 

 

测试用例

public class MysqlUtils {

    public static String MYSQL_HOST = "192.168.31.9";
    public static int MYSQL_PORT = 3306;
    public static String MYSQL_DB = "20240811_vehicle_stats";
    public static String MYSQL_USERNAME = "root";
    public static String MYSQL_PASSWORD = "postgres";

    public static String COLUMN_CATM = "catm";
    public static String COLUMN_UPTM = "uptm";
    public static String SQL_DUMMY_SQL = "select 1;";

    public static boolean DEFAULT_ADD_CATM_UPTM = false;

    public static SingleStringColumnExtractor SINGLE_STRING_COLUMN_EXTRACTOR = new SingleStringColumnExtractor();
    public static GenericMapExtractor GENERIC_MAP_EXTRACTOR = new GenericMapExtractor();
    public static MyStatsVehicleFlowLogExtractor MY_STATISTICS_VEHICLE_FLOW_LOG_EXTRACTOR = new MyStatsVehicleFlowLogExtractor();
    public static MyStatsPeopleFlowLogExtractor MY_STATISTICS_PEOPLE_FLOW_LOG_EXTRACTOR = new MyStatsPeopleFlowLogExtractor();

    // disable constructor
    private MysqlUtils() {
        System.err.println("can't instantiate !");
    }

    // mysql jdbcDriver
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.err.println("can't found jdbcDriver !");
        }
    }

    public static void init() {
        MYSQL_HOST = ConfigUtils.getString("MYSQL_HOST", MYSQL_HOST);
        MYSQL_PORT = ConfigUtils.getInt("MYSQL_PORT", MYSQL_PORT);
        MYSQL_DB = ConfigUtils.getString("MYSQL_DB", MYSQL_DB);
        MYSQL_USERNAME = ConfigUtils.getString("MYSQL_USERNAME", MYSQL_USERNAME);
        MYSQL_PASSWORD = ConfigUtils.getString("MYSQL_PASSWORD", MYSQL_PASSWORD);

        DEFAULT_ADD_CATM_UPTM = ConfigUtils.getString("DEFAULT_ADD_CATM_UPTM", String.valueOf(DEFAULT_ADD_CATM_UPTM)).equalsIgnoreCase("true");
    }

    // 获取 jdbc 链接
    public static Connection getConnection(String ip, int port, String dbName, String userName, String password) {
        Connection con = null;
        try {
            con = DriverManager.getConnection(String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=UTF8", ip, port, dbName), userName, password);
        } catch (SQLException se) {
            se.printStackTrace();
            System.err.println("error while try to get an connection !");
        }

        return con;
    }

    public static Connection getConnection() {
        return MysqlUtils.getConnection(MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_USERNAME, MYSQL_PASSWORD);
    }

    // 执行 jdbc 查询
    public static <T> List<T> executeQuery(String sql, Function<ResultSet, T> recordExtractor) {
        Connection con = MysqlUtils.getConnection(MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_USERNAME, MYSQL_PASSWORD);
        PreparedStatement stat = null;
        ResultSet rs = null;
        List<T> result = new ArrayList<>();
        try {
            stat = con.prepareStatement(sql);
            rs = stat.executeQuery();
            while (rs.next()) {
                result.add(recordExtractor.apply(rs));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if(stat != null) {
                    stat.close();
                }
                if(rs != null) {
                    rs.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    public static List<Map<String, Object>> executeQuery(String sql) {
        return executeQuery(sql, GENERIC_MAP_EXTRACTOR);
    }

    // 执行 jdbc 更新
    public static int executeUpdate(String sql) {
        Connection con = MysqlUtils.getConnection(MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_USERNAME, MYSQL_PASSWORD);
        PreparedStatement stat = null;
        int updated = -1;
        try {
            stat = con.prepareStatement(sql);
            updated = stat.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if(stat != null) {
                    stat.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return updated;
    }


    public static String assembleInsertSql(String tableName, Map<String, Object> entity, boolean addCommonFields) {
        String insertSqlTemplate = " insert into %s (%s) values (%s); ";
        List<String> fieldNames = new ArrayList<>(), fieldValues = new ArrayList<>();
        for (String fieldName : entity.keySet()) {
            Object originalFieldValue = entity.get(fieldName);
            String fieldValue = resolveFieldValue(entity, fieldName, originalFieldValue);
            fieldNames.add(String.format("`%s`", fieldName));
            fieldValues.add(transferFieldValueIfNecessary(fieldValue));
        }
        if (addCommonFields) {
            Long currentTs = System.currentTimeMillis();
            addFixedFieldNames(fieldNames, currentTs, true);
            addFixedFieldValues(fieldValues, currentTs, true);
        }

        String sql = String.format(insertSqlTemplate, tableName,
                join(fieldNames, ", "),
                join(fieldValues, ", ")
        );
        return sql;
    }

    public static String assembleInsertSql(String tableName, Map<String, Object> entity) {
        return assembleInsertSql(tableName, entity, DEFAULT_ADD_CATM_UPTM);
    }

    public static String assembleBatchInsertSql(String tableName, List<Map<String, Object>> entityList, boolean addCommonFields) {
        String insertSqlTemplate = " insert into %s (%s) values %s; ";
        List<String> insertFieldNames = new ArrayList<>(), outerFieldValues = new ArrayList<>();
        Set<String> fieldNames = new LinkedHashSet<>();
        Long currentTs = System.currentTimeMillis();

        for (Map<String, Object> entity : entityList) {
            fieldNames.addAll(entity.keySet());
        }
        for (String fieldName : fieldNames) {
            insertFieldNames.add(String.format("`%s`", fieldName));
        }
        if (addCommonFields) {
            addFixedFieldNames(insertFieldNames, currentTs, true);
        }

        for (Map<String, Object> entity : entityList) {
            List<String> fieldValues = new ArrayList<>();
            for (String fieldName : fieldNames) {
                Object originalFieldValue = entity.get(fieldName);
                String fieldValue = resolveFieldValue(entity, fieldName, originalFieldValue);
                fieldValues.add(transferFieldValueIfNecessary(fieldValue));
            }

            if (addCommonFields) {
                addFixedFieldValues(fieldValues, currentTs, true);
            }
            outerFieldValues.add(String.format("(%s)", join(fieldValues, ", ")));
        }

        String sql = String.format(insertSqlTemplate, tableName,
                join(insertFieldNames, ", "),
                join(outerFieldValues, ", ")
        );
        return sql;
    }

    public static String assembleBatchInsertSql(String tableName, List<Map<String, Object>> entityList) {
        return assembleBatchInsertSql(tableName, entityList, DEFAULT_ADD_CATM_UPTM);
    }

    public static String assembleUpdateSql(String tableName, String idFieldName, Map<String, Object> entity, boolean addCommonFields) {
        String updateSqlTemplate = " update %s set %s %s; ";
        List<String> fieldNames = new ArrayList<>(), fieldValues = new ArrayList<>();
        for (String fieldName : entity.keySet()) {
            Object originalFieldValue = entity.get(fieldName);
            String fieldValue = resolveFieldValue(entity, fieldName, originalFieldValue);
            fieldNames.add(String.format("`%s`", fieldName));
            fieldValues.add(transferFieldValueIfNecessary(fieldValue));
        }
        if (addCommonFields) {
            Long currentTs = System.currentTimeMillis();
            addFixedFieldNames(fieldNames, currentTs, false);
            addFixedFieldValues(fieldValues, currentTs, false);
        }

        List<String> setClauseList = new ArrayList<>();
        for (int i = 0; i < fieldNames.size(); i++) {
            setClauseList.add(String.format(" %s = %s ", fieldNames.get(i), fieldValues.get(i)));
        }
        String setClause = join(setClauseList, ", ");

        String idValue = String.valueOf(entity.get(idFieldName));
        String whereCond = String.format(" where %s = %s ", idFieldName, transferFieldValueIfNecessary(idValue));

        String sql = String.format(updateSqlTemplate, tableName, setClause, whereCond);
        return sql;
    }

    public static String assembleUpdateSql(String tableName, String idFieldName, Map<String, Object> entity) {
        return assembleUpdateSql(tableName, idFieldName, entity, DEFAULT_ADD_CATM_UPTM);
    }

    public static List<String> assembleBatchSaveSql(String tableName, String idFieldName,
                                                    List<Map<String, Object>> entityList, Function<ResultSet, String> idExtractor,
                                                    boolean addCommonFields) {
        List<String> idList = entityList.stream().map(ele -> String.valueOf(ele.get(idFieldName))).collect(Collectors.toList());
        List<String> existsIdList = selectExistsById(tableName, idFieldName, idList, idExtractor);
        Map<String, Map<String, Object>> toInsertById = new LinkedHashMap<>(), toUpdateById = new LinkedHashMap<>();
        for (Map<String, Object> entity : entityList) {
            String idValue = String.valueOf(entity.get(idFieldName));

            Map<String, Map<String, Object>> entityByIdTmp = toInsertById;
            if (existsIdList.contains(idValue)) {
                entityByIdTmp = toUpdateById;
            }
            entityByIdTmp.put(idValue, entity);
        }

        List<String> result = new ArrayList<>();
        String insertSql = SQL_DUMMY_SQL;
        List<Map<String, Object>> toInsertList = new ArrayList<>(toInsertById.values());
        if (!isEmpty(toInsertList)) {
            insertSql = assembleBatchInsertSql(tableName, toInsertList, addCommonFields);
        }
        result.add(insertSql);

        List<Map<String, Object>> toUpdateList = new ArrayList<>(toUpdateById.values());
        for (Map<String, Object> toUpdate : toUpdateList) {
            String updateSql = assembleUpdateSql(tableName, idFieldName, toUpdate, addCommonFields);
            result.add(updateSql);
        }
        return result;
    }

    public static <T> List<String> assembleBatchSaveSql(String tableName, String idFieldName,
                                                        List<Map<String, Object>> entityList, Function<ResultSet, String> recordExtractor) {
        return assembleBatchSaveSql(tableName, idFieldName, entityList, recordExtractor, true);
    }

    public static List<String> selectExistsById(String tableName, String idFieldName, List<String> idList, Function<ResultSet, String> recordExtractor) {
        if (isEmpty(idList)) {
            return Collections.emptyList();
        }

        String querySqlTemplate = " select %s as id from %s %s; ";
        String idInSnippet = join(idList.stream().map(MysqlUtils::transferFieldValueIfNecessary).collect(Collectors.toList()), ", ");
        String whereCond = String.format(" where %s in (%s) ", idFieldName, idInSnippet);
        String querySql = String.format(querySqlTemplate, idFieldName, tableName, whereCond);

        return executeQuery(querySql, recordExtractor);
    }

    public static String generateQuerySql(String tableName, String whereCond) {
        String querySql = String.format(" select * from %s ", tableName);
        if (isNotBlank(whereCond)) {
            querySql = String.format(" %s where %s ", querySql, whereCond);
        }
        return querySql;
    }

    public static String generateDeleteSql(String tableName, String whereCond) {
        String querySql = String.format(" delete from %s ", tableName);
        if (isNotBlank(whereCond)) {
            querySql = String.format(" %s where %s ", querySql, whereCond);
        }
        return querySql;
    }

    public static String resolveFieldValue(Map<String, Object> entity, String fieldName, Object fieldValue) {
        if (fieldValue == null) {
            return null;
        }

        if (fieldValue instanceof Date) {
            return DateFormatUtils.format((Date) fieldValue);
        }
        if (fieldValue instanceof LocalDateTime) {
            LocalDateTime dateTime = ((LocalDateTime) fieldValue);
            return String.format("%s-%s-%s %s:%s:%s",
                    String.format("%04d", dateTime.getYear()),
                    String.format("%02d", dateTime.getMonthValue()),
                    String.format("%02d", dateTime.getDayOfMonth()),
                    String.format("%02d", dateTime.getHour()),
                    String.format("%02d", dateTime.getMinute()),
                    String.format("%02d", dateTime.getSecond())
            );
        }

        return String.valueOf(fieldValue);
    }

    public static void addFixedFieldNames(List<String> fieldNames, Long currentTs, boolean addCatm) {
        if (addCatm) {
            fieldNames.add(COLUMN_CATM);
        }
        fieldNames.add(COLUMN_UPTM);
    }

    public static void addFixedFieldValues(List<String> fieldValues, Long currentTs, boolean addCatm) {
        if (addCatm) {
            fieldValues.add(transferFieldValueIfNecessary(String.valueOf(currentTs)));
        }
        fieldValues.add(transferFieldValueIfNecessary(String.valueOf(currentTs)));
    }

    public static String transferFieldValueIfNecessary(String fieldValue) {
        if (fieldValue == null) {
            return "NULL";
        }

        if (fieldValue.contains("\"")) {
            fieldValue = fieldValue.replace("\"", "\\\"");
        }
        return String.format("\"%s\"", fieldValue);
    }

    public static String transferSingleQuoteFieldValueIfNecessary(String fieldValue) {
        if (fieldValue == null) {
            return "NULL";
        }

        if (fieldValue.contains("'")) {
            fieldValue = fieldValue.replace("'", "\\'");
        }
        return String.format("'%s'", fieldValue);
    }

    public static void fillOrTrimToFieldNames(Map<String, Object> entity, List<String> fieldNames, String defaultValue) {
        List<String> field2Remove = new ArrayList<>();
        for (Map.Entry<String, Object> entry : entity.entrySet()) {
            String fieldName = entry.getKey();
            if (!fieldNames.contains(fieldName)) {
                field2Remove.add(fieldName);
            }
        }
        for (String fieldName : field2Remove) {
            entity.remove(fieldName);
        }

        for (String fieldName : fieldNames) {
            if (!entity.containsKey(fieldName)) {
                entity.put(fieldName, defaultValue);
            }
        }
    }

    public static void fillOrTrimToFieldNames(Map<String, Object> entity, List<String> fieldNames) {
        fillOrTrimToFieldNames(entity, fieldNames, "");
    }

    public static String wrapSqlIn(List<String> list) {
        if (isEmpty(list)) {
            return "";
        }

        return String.format("\"%s\"", join(list, "\", \""));
    }

    public static boolean isBlank(String str) {
        return str == null || str.trim().length() == 0;
    }

    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    public static <T> boolean isEmpty(Collection<T> list) {
        return list == null || (list.size() == 0);
    }

    public static <T> String join(Collection<T> list, String seprator) {
        StringBuffer result = new StringBuffer();
        for (Iterator ite = list.iterator(); ite.hasNext(); result.append((String) ite.next())) {
            if (result.length() != 0) {
                result.append(seprator);
            }
        }
        return result.toString();
    }

}

 

 

GenericMapExtractor
public class GenericMapExtractor implements Function<ResultSet, Map<String, Object>> {

    @Override
    public Map<String, Object> apply(ResultSet resultSet) {
        try {
            Map<String, Object> result = new LinkedHashMap<>();
            int columnCount = resultSet.getMetaData().getColumnCount();
            for (int i = 1; i <= columnCount; i++) {
                String columnName = resultSet.getMetaData().getColumnName(i);
                result.put(columnName, resultSet.getObject(columnName));
            }
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

 

 

MyStatsPeopleFlowLogExtractor
public class MyStatsPeopleFlowLogExtractor implements Function<ResultSet, StatsPeopleFlowLog> {

    @Override
    public StatsPeopleFlowLog apply(ResultSet resultSet) {
        try {
            Map<String, Object> entityMap = MysqlUtils.GENERIC_MAP_EXTRACTOR.apply(resultSet);
            JSONObject entityJson = (JSONObject) JSON.toJSON(entityMap);
            return StatsPeopleFlowLog.fromJSON(entityJson);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

 

 

部分截图

 

 

完 

 

 

 

 

 


http://www.kler.cn/a/540488.html

相关文章:

  • Docker安装Redis
  • 软件模拟I2C案例(寄存器实现)
  • Python 鼠标轨迹 - 防止游戏检测
  • git命令行删除远程分支、删除远程提交日志
  • Spring AI -使用Spring快速开发ChatGPT应用
  • 数据结构——图
  • 利用蓝耘智算平台深度搭建deepseek R1模型,进行深度机器学习
  • Selenium常用自动化函数
  • STM32 HAL库 ADC程序(C语言)
  • 剖析 C++ 模拟算法:数据结构、随机数生成与模型验证
  • UE5--浅析委托原理(Delegate)
  • AWS SES 邮件声誉监控与优化最佳实践
  • 大模型融入推荐系统
  • 【Unity】性能优化:UI的合批 图集和优化
  • 基于Java的自助多张图片合成拼接实战
  • 洛谷 P1015:回文数 ← 高精度加法
  • 宇宙大爆炸3D粒子特效实现原理详解
  • 【jmeter】在windows中,创建的变量,在jmeter中,读取变量失败的问题,路径问题
  • CSS Position宝典:解锁网页元素精准布局的秘密武器
  • Go语言构建微服务:从入门到实战
  • 0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型
  • 千兆网络变压器(又称千兆以太网隔离变压器)是一种基于电磁感应原理设计的设备,主要用于以下核心功能:
  • Python—pandas读取Excel将两列转为字典(json)
  • Git安全回退历史版本
  • 基于java手机销售网站设计和实现(LW+源码+讲解)
  • 麒麟系统编译安装git