MySQL实体类框架
实现mysql数据库的增删改查功能
import com.mchange.v2.collection.MapEntry;
import lombok.Data;
import org.junit.jupiter.api.Test;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.*;
import java.sql.*;
import java.util.*;/*** 自定义框架* 生成mysql表对应的实体类*/
public class MySqlMapper {/*** 配制参数*/static class Config {//mysql地址,数据库,用户名,密码final static private String address = "127.0.0.1:3306";final static private String dbName = "creative";final static private String username = "root";final static private String password = "123456";//模型保存的位置final static private String modelPath = "C:\\Users\\admin\\IdeaProjects\\mytest1\\src\\main\\java\\com\\libii\\model";//mysql数据类型与java数据类型转换final static MapEntry[] map = {new MapEntry("INT", "Integer"),new MapEntry("VARCHAR", "String"),new MapEntry("TIMESTAMP", "String"),new MapEntry("DOUBLE", "Double")};}/*** 内存参数*/static class Variable {final static private String packagePath = Config.modelPath.split("java\\\\")[1].replace("\\", ".");static private Map<String, String> mapper = new HashMap<>();static {for (MapEntry mapEntry : Config.map) {mapper.put(String.valueOf(mapEntry.getKey()), String.valueOf(mapEntry.getValue()));}}}/*** 获取连接** @return* @throws SQLException* @throws ClassNotFoundException*/public static Connection getConn() throws SQLException, ClassNotFoundException {Class.forName("com.mysql.jdbc.Driver");String url = "jdbc:mysql://" + Config.address + "/" + Config.dbName + "?useUnicode=true&characterEncoding=UTF-8";Connection conn = DriverManager.getConnection(url, Config.username, Config.password);return conn;}public static void main(String[] args) throws Exception {Connection conn = getConn();List<ModelTable> modelTableList = Business.getModelTable(conn);//获取数据库下的表结构conn.close();Business.foreach(modelTableList);//遍历结构数据}static class Business {//业务类/*** 获取数据库中表与字段的集合** @param conn* @return*/public static List<ModelTable> getModelTable(Connection conn) throws Exception {List<ModelTable> modelTableList = new LinkedList<>();Map<String, String> tableMsg = Business.getTableNameList(conn);for (Map.Entry<String, String> line : tableMsg.entrySet()) {ModelTable tableFieldMap = getTableFieldMap(conn, line);modelTableList.add(tableFieldMap);}return modelTableList;}/*** 获取表名称** @param conn* @return* @throws Exception*/public static Map<String, String> getTableNameList(Connection conn) throws Exception {String sql = "select TABLE_NAME,TABLE_COMMENT from information_schema.tables where table_schema=\"" + Config.dbName + "\"";List<Map<String, Object>> tableMap = Util.select(sql, conn);Map<String, String> tableMsg = new HashMap<>();for (Map<String, Object> line : tableMap) {String tableName = String.valueOf(line.get("TABLE_NAME"));String tableComment = String.valueOf(line.get("TABLE_COMMENT"));tableMsg.put(tableName, tableComment);}return tableMsg;}/*** 获取表中的字段信息** @param conn* @return* @throws Exception*/public static ModelTable getTableFieldMap(Connection conn, Map.Entry<String, String> line) throws Exception {DatabaseMetaData meta = conn.getMetaData();String tableName = line.getKey();String tableComment = line.getValue();ResultSet rs = meta.getColumns(null, "%", tableName, "%");Map<String, MapEntry> tableFieldMap = new HashMap<>();ModelTable modelTable = new ModelTable();modelTable.setTableName(tableName);modelTable.setFields(tableFieldMap);modelTable.setTableComment(tableComment);while (rs.next()) {String columnName = rs.getString("COLUMN_NAME");String dataTypeName = rs.getString("TYPE_NAME");String remarks = rs.getString("REMARKS");tableFieldMap.put(columnName, new MapEntry(dataTypeName, remarks));//字段名称,字段类型}return modelTable;}/*** 遍历model信息** @param modelTableList*/public static void foreach(List<ModelTable> modelTableList) throws IOException {//写入接口String filePath = Config.modelPath + "/IModel.java";String msg = getIModelMsg();Util.writer(filePath, msg);for (ModelTable modelTable : modelTableList) {writerModelTable(modelTable);}}private static String getIModelMsg() {String packagePath = "package " + Variable.packagePath + ";\n";String inner = "import com.alibaba.fastjson.JSONObject;\n" +"import java.util.Map;\n" +"\n" +"public interface IModel {\n" +" String toInsertSql();\n" +"\n" +" String toDeleteSql();\n" +"\n" +" String toUpdateSql();\n" +"\n" +" String toSelectSql();\n" +"\n" +" void mapToModel(Map<String, Object> model);\n" +"\n" +" void jsonToModel(JSONObject model);\n" +"\n" +" Map<String, Object> modelToMap();\n" +"\n" +" JSONObject modelToJson();\n" +"}\n";return packagePath+inner;}/*** 写入model信息到文件** @param modelTable*/public static void writerModelTable(ModelTable modelTable) throws IOException {String msg = getMsg(modelTable);//计算需要写入的信息String filePath = Config.modelPath + "/" + modelTable.tableName + ".java";Util.writer(filePath, msg);}/*** 生成model的信息** @param modelTable* @return*/public static String getMsg(ModelTable modelTable) {String packagePath = "package " + Variable.packagePath + ";";String fastjson = "import com.alibaba.fastjson.JSONObject;";String javaUtil = "import java.util.*;";String lombok = "import lombok.Data;";String data = "@Data";String headClass = "public class " + modelTable.tableName + " implements IModel{";String tailClass = "}";StringBuilder sbr = new StringBuilder();sbr.append(packagePath).append("\n").append("\n");sbr.append(fastjson).append("\n");sbr.append(lombok).append("\n");sbr.append(javaUtil).append("\n").append("\n");sbr.append("/**").append("\n");//添加类备注sbr.append("/*").append(modelTable.tableComment).append("\n");sbr.append("*/").append("\n");sbr.append(data).append("\n");sbr.append(headClass).append("\n");//添加成员变量与备注for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {String fieldName = entry.getKey();MapEntry value = entry.getValue();String fieldType = String.valueOf(value.getKey());String remakes = String.valueOf(value.getValue());sbr.append("\tprivate ").append(Variable.mapper.get(fieldType)).append(" ").append(fieldName).append(";").append("//").append(remakes).append("\n");}sbr.append("\n");//自定义方法不需要的方式直接注释sbr.append(ModelFunc.modelToJson(modelTable)).append("\n");sbr.append(ModelFunc.modelToMap(modelTable)).append("\n");sbr.append(ModelFunc.jsonToModel(modelTable)).append("\n");sbr.append(ModelFunc.mapToModel(modelTable)).append("\n");sbr.append(ModelFunc.toInsertSql(modelTable)).append("\n");//增sbr.append(ModelFunc.toDeleteSql(modelTable)).append("\n");//删sbr.append(ModelFunc.toUpdateSql(modelTable)).append("\n");//改sbr.append(ModelFunc.toSelectSql(modelTable)).append("\n");//查//结束sbr.append(tailClass).append("\n");return sbr.toString();}}static class ModelFunc {//方法构造public static String modelToJson(ModelTable modelTable) {//将成员变量转化为json对象StringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *将当前Model对象转化为json对象\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public JSONObject modelToJson(){\n");Map<String, MapEntry> fields = modelTable.fields;sbr.append("\t\tJSONObject result = new JSONObject();").append("\n");for (Map.Entry<String, MapEntry> entry : fields.entrySet()) {String fieldName = entry.getKey();sbr.append("\t\t").append("result.put(\"").append(fieldName).append("\",").append(fieldName).append(");").append("\n");}sbr.append("\t\treturn result;\n");sbr.append("\t}\n");return sbr.toString();}public static String modelToMap(ModelTable modelTable) {//将成员变量转化为Map对象StringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *将当前Model对象转化为Map对象\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public Map<String,Object> modelToMap(){\n");sbr.append("\t\t").append("Map<String,Object> result = new HashMap<>();\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {String fieldName = entry.getKey();sbr.append("\t\t").append("result.put(\"").append(fieldName).append("\",").append(fieldName).append(");").append("\n");}sbr.append("\t\treturn result;\n");sbr.append("\t}\n");return sbr.toString();}public static String jsonToModel(ModelTable modelTable) {//json赋值StringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *将json对象转化为Model对象\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public void jsonToModel(JSONObject model){\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {String fieldName = entry.getKey();String fieldType = String.valueOf(entry.getValue().getKey());sbr.append("\t\t").append("this.").append(fieldName).append("=model.get").append(Variable.mapper.get(fieldType)).append("(\"").append(fieldName).append("\");").append("\n");}sbr.append("\t}\n");return sbr.toString();}public static String mapToModel(ModelTable modelTable) {//Map赋值StringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *将Map对象转化为Model对象\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public void mapToModel(Map<String,Object> model){\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {String fieldName = entry.getKey();String fieldType = String.valueOf(entry.getValue().getKey());sbr.append("\t\t").append("this.").append(fieldName).append("=").append(Variable.mapper.get(fieldType)).append(".valueOf(model.get(\"").append(fieldName).append("\").toString());").append("\n");}sbr.append("\t}\n");return sbr.toString();}public static String toInsertSql(ModelTable modelTable) {//获取新增sqlStringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *根据成员变量获取插入sql语句\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public String toInsertSql(){\n");StringBuilder ifField = new StringBuilder();ifField.append("if(!(");int len = modelTable.fields.size();for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {len--;ifField.append(entry.getKey()).append("!=null");String type = len > 0 ? "||" : "";ifField.append(type);}ifField.append(")) return \"insert into ").append(modelTable.tableName).append(" () value ()\";");sbr.append("\t\t").append(ifField).append("\n");sbr.append("\t\tStringBuilder values = new StringBuilder();\n");sbr.append("\t\tvalues.append(\"insert into ").append(modelTable.tableName).append(" (\");\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {sbr.append("\t\tif (").append(entry.getKey()).append(" != null) values.append(\"").append(entry.getKey()).append("\")");sbr.append(".append(\",\");\n");}sbr.append("\t\tvalues.setLength(values.length()-1);\n");sbr.append("\t\tvalues.append(\") value \").append(\"(\");\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {sbr.append("\t\tif (").append(entry.getKey()).append(" != null) values.append(\"'\").append(").append(entry.getKey()).append(").append(\"'\")");sbr.append(".append(\",\");\n");}sbr.append("\t\tvalues.setLength(values.length()-1);\n");sbr.append("\t\tvalues.append(\")\");\n");sbr.append("\t\tString sql = values.toString();\n");sbr.append("\t\treturn sql;\n");sbr.append("\t}\n");return sbr.toString();}public static String toDeleteSql(ModelTable modelTable) {//获取删除sqlStringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *根据成员变量获取删除sql语句\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public String toDeleteSql(){\n");StringBuilder ifField = new StringBuilder();ifField.append("if(!(");int len = modelTable.fields.size();for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {len--;ifField.append(entry.getKey()).append("!=null");String type = len > 0 ? "||" : "";ifField.append(type);}ifField.append(")) return \"delete from ").append(modelTable.tableName).append("\";");sbr.append("\t\t").append(ifField).append("\n");sbr.append("\t\tStringBuilder values = new StringBuilder();\n");sbr.append("\t\tvalues.append(\"delete from ").append(modelTable.tableName).append(" where \");\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {sbr.append("\t\tif (").append(entry.getKey()).append(" != null) values.append(\"").append(entry.getKey()).append("\")").append(".append(\" = \").append(\"'\").append(").append(entry.getKey()).append(")").append(".append(\"'\")");sbr.append(".append(\" and \");\n");}sbr.append("\t\tString sql = values.substring(0,values.length()-5);\n");sbr.append("\t\treturn sql;\n");sbr.append("\t}\n");return sbr.toString();}public static String toUpdateSql(ModelTable modelTable) {//获取修改sqlStringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *根据成员变量获取修改sql语句\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public String toUpdateSql(){\n");StringBuilder ifField = new StringBuilder();ifField.append("if(!(");int len = modelTable.fields.size();for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {len--;ifField.append(entry.getKey()).append("!=null");String type = len > 0 ? "||" : "";ifField.append(type);}ifField.append(")) return \"update ").append(modelTable.tableName).append(" set id = id\";");sbr.append("\t\t").append(ifField).append("\n");sbr.append("\t\tStringBuilder values = new StringBuilder();\n");sbr.append("\t\tvalues.append(\"update ").append(modelTable.tableName).append(" set \");\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {sbr.append("\t\tif (").append(entry.getKey()).append(" != null) values.append(\"").append(entry.getKey()).append("\")").append(".append(\" = \").append(\"'\").append(").append(entry.getKey()).append(")").append(".append(\"'\")");sbr.append(".append(\",\");\n");}sbr.append("\t\tvalues.setLength(values.length()-1);\n");sbr.append("\t\tString sql = values.toString();\n");sbr.append("\t\treturn sql;\n");sbr.append("\t}\n");return sbr.toString();}public static String toSelectSql(ModelTable modelTable) {//获取修改sqlStringBuilder sbr = new StringBuilder();sbr.append("\t/**\n");sbr.append("\t *根据成员变量获取查询sql语句\n");sbr.append("\t */\n");sbr.append("\t @Override\n");sbr.append("\t").append("public String toSelectSql(){\n");StringBuilder ifField = new StringBuilder();ifField.append("if(!(");int len = modelTable.fields.size();for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {len--;ifField.append(entry.getKey()).append("!=null");String type = len > 0 ? "||" : "";ifField.append(type);}ifField.append(")) return \"select * from ").append(modelTable.tableName).append("\";");sbr.append("\t\t").append(ifField).append("\n");sbr.append("\t\tStringBuilder values = new StringBuilder();\n");sbr.append("\t\tvalues.append(\"select * from ").append(modelTable.tableName).append(" where \");\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {sbr.append("\t\tif (").append(entry.getKey()).append(" != null) values.append(\"").append(entry.getKey()).append("\")").append(".append(\" = \").append(\"'\").append(").append(entry.getKey()).append(")").append(".append(\"'\")");sbr.append(".append(\" and \");\n");}sbr.append("\t\tvalues.setLength(values.length()-5);\n");sbr.append("\t\tString sql = values.toString();\n");sbr.append("\t\treturn sql;\n");sbr.append("\t}\n");return sbr.toString();}}static class Util {//工具类/*** 查询数据** @param sql 请求sql* @param conn 数据库连接* @return 查询的响应数据* @throws Exception*/public static List<Map<String, Object>> select(String sql, Connection conn) throws Exception {List<Map<String, Object>> result = new LinkedList<>();PreparedStatement preparedStatement = null;//支出传递问号,防止sql注入ResultSet resultSet = null;try {preparedStatement = conn.prepareStatement(sql);//获取PreparedStatementresultSet = preparedStatement.executeQuery();//获取查询结果的字段信息ResultSetMetaData metaData = resultSet.getMetaData();int fieldCount = metaData.getColumnCount();//字段数量List<String> fields = new ArrayList<>(fieldCount);for (int i = 1; i <= fieldCount; i++) {fields.add(metaData.getColumnName(i));}//5、从结果集获取结果数据while (resultSet.next()) {Map<String, Object> line = new HashMap();for (String field : fields) {line.put(field, resultSet.getObject(field));}result.add(line);}} catch (SQLException e) {e.printStackTrace();} finally {resultSet.close();preparedStatement.close();}return result;}/*** 写入内容到文件** @param filePath 文件路径* @param msg 写入信息* @throws IOException*/public static void writer(String filePath, String msg) throws IOException {if (msg == null || "".equals(msg)) return;File file = new File(filePath);if (!file.exists()) file.createNewFile();FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(file);fileOutputStream.write(msg.getBytes("UTF-8"));} catch (IOException e) {e.printStackTrace();} finally {fileOutputStream.close();//先打开的后关闭}}/*** 获取json内容的类型转换** @param fieldType* @return*/public static String getType(String fieldType) {String javaFieldType = Variable.mapper.get(fieldType);switch (javaFieldType) {case "Integer":return "getInteger";case "String":case "TIMESTAMP":return "getString";case "DOUBLE":return "getDouble";default:return "getObject";}}}@Datastatic class ModelTable {//数据库中表与字段的集合private String tableName;//表名称private String tableComment;//表备注private Map<String, MapEntry> fields;//字段列表,MapEntry<字段类型,备注>}
}
相关文章:
MySQL实体类框架
实现mysql数据库的增删改查功能 import com.mchange.v2.collection.MapEntry; import lombok.Data; import org.junit.jupiter.api.Test;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.*; import java.sql.*; …...
数据结构之初始泛型
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 深入了解包装类 包装类的由来 装箱与拆箱 面试题 泛型 泛型的语法与使用…...
【网络编程开发】7.TCP可靠传输的原理
7.TCP可靠传输的原理 TCP实现可靠传输的原理主要基于序列号和确认应答、超时重传、滑动窗口、连接管理机制以及拥塞控制等多重机制。 TCP(Transmission Control Protocol),即传输控制协议,是网络通信中的一种重要协议࿰…...
视觉SLAM十四讲:从理论到实践(Chapter8:视觉里程计2)
前言 学习笔记,仅供学习,不做商用,如有侵权,联系我删除即可 一、目标 1.理解光流法跟踪特征点的原理。 2.理解直接法是如何估计相机位姿的。 3.实现多层直接法的计算。 特征点法存在缺陷: 二、光流(Optical Flow) …...
C语言过度C++语法补充(面向对象之前语法)
目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间? 2. 如何使用一个命名空间 3. 命名空间中可以定义什么? 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何? 5. 总结~~撒花~~…...
类和对象(二)(C++)
初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化…...
Chrome DevTools解密:成为前端调试大师的终极攻略
Chrome DevTools是一套内置于Google Chrome浏览器中的开发者工具,它允许开发者对网页进行调试、分析和优化。本文将全面介绍DevTools的功能、使用方法以及注意事项,帮助开发者更好地利用这些工具来提升开发效率和网页性能。 一、简介 1. DevTools是什么…...
【python】OpenCV—Cartoonify and Portray
参考来自 使用PythonOpenCV将照片变成卡通照片 文章目录 1 卡通化codecv2.medianBlurcv2.adaptiveThresholdcv2.kmeanscv2.bilateralFilter 2 肖像画cv2.divide 1 卡通化 code import cv2 import numpy as npdef edge_mask(img, line_size, blur_value):gray cv2.cvtColor(…...
制作AI问答机器人:从0到1的完整指南
在数字化转型的浪潮中,企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力,成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人,并强调其功能体…...
mysql 数据库datetime 类型,转换为DO里面的long类型后,只剩下年了,没有了月和日
解决方法也简单: 自定义个一个 Date2LongTypeHandler <resultMap id"BeanResult" type"XXXX.XXXXDO"><result column"gmt_create" property"gmtCreate" jdbcType"DATE" javaType"java.lang.Long&…...
信息系统项目管理师0148:输出(9项目范围管理—9.3规划范围管理—9.3.3输出)
点击查看专栏目录 文章目录 9.3.3 输出 9.3.3 输出 范围管理计划 范围管理计划是项目管理计划的组成部分,描述将如何定义、制定、监督、控制和确认项 目范围。范围管理计划用于指导如下过程和相关工作: ①制定项目范围说明书;②根据详细项目范…...
解决 SQLyog 连接 MySQL 8 连不上和 SQLyog Trial 试用到期的问题
今天发现 SQLyog 突然连不上 MySQL 了,跟之前不一样的地方就是我升级了 MySQL,升级到了 MySQL 8。 原来是因为 MySQL 8 引入了新的密码验证机制。在 MySQL 8 中默认的密码验证插件从 mysql_native_password 更换为 caching_sha2_password。我的 SQLYog …...
go语言内置预编译 //go:embed xxx 使用详解
在go语言里面,我们可以使用一个“类注释”的语法来来让编译器帮助我们在编译的时候将一些文件或者目录读取到指定的变量中来供我们使用。 go:embed语法: //go:embed 文件或者目录路径 var 变量名 变量类型 说明: 文件或者目录路径 可以…...
数据挖掘--挖掘频繁模式、关联和相关性:基本概念和方法
频繁项集、闭项集和关联规则 频繁项集:出现的次数超过最小支持度计数阈值 闭频繁项集:一个集合他的超集(包含这个集合的集合)在数据库里面的数量和这个集合在这个数据库里面的数量不一样,这个集合就是闭项集 如果这个集合还是频繁的,那么他就是极大频…...
Locust:用Python编写可扩展的负载测试
Locust:简化性能测试,让负载模拟更直观- 精选真开源,释放新价值。 概览 Locust是一个开源的性能和负载测试工具,专门用于HTTP和其他协议的测试。它采用开发者友好的方法,允许用户使用普通的Python代码来定义测试场景。…...
【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱
Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21(1)下载(2)安装(3)环境配置 2. 安装Neo4j(1)下载(2)解压安装(3)环境配置…...
探索智慧林业系统的总体架构与应用
背景: 随着人们对森林资源保护和管理的重视,智慧林业系统作为一种新兴的林业管理手段,正在逐渐受到广泛关注和应用。智慧林业系统的总体架构设计与应用,将现代信息技术与林业管理相结合,为森林资源的保护、管理和利用…...
【JSP】如何在IDEA上部署JSP WEB开发项目
以我的课设为例,教大家拿到他人的项目后,如何在IDEA上部署。 需要准备: JDK17(或者JDK13)IntelliJ IDEA 2023.2.6MySQL 8.0Tomcat 9.0 一,新建项目添加文件 1.1复制“位置”的路径 1.2找到该文件夹 1.3…...
用HTML实现拓扑面,动态4D圆环面,可手动调节,富有创新性的案例。(有源代码)
文章目录 前言一、示例二、目录结构三、index.html(主页面)四、main.js五、Tour4D.js六、swissgl.js七、dat.gui.min.js八、style.css 前言 如果你觉得对代码进行复制粘贴很麻烦的话,你可以直接将资源下载到本地。无需部署,直接可…...
java调用GDAL及JTS实现生成泰森多边形(Voronoi图)的一种方法
目录 一、关于泰森多边形 1.泰森多边形的特性 2.本文的目的 二、实现思路 1.gdal和jts库的maven坐标 2.jts生成泰森多边形的关键代码 3.使用GDAL读取源文件信息的关键代码 4.使用GDAL将生成的泰森多边形写入文件 三、实现结果 1.实现的效果 2.完整代码示例 一、关于…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
