mysql自定义实体类框架
根据表结构自动生产实体类和方法,根据反射与io生成,可自定义扩展方法
package com.digital.web.front; /*** pom依赖* <dependency>* <groupId>mysql</groupId>* <artifactId>mysql-connector-java</artifactId>* <version>5.1.27</version>* </dependency>* <dependency>* <groupId>org.projectlombok</groupId>* <artifactId>lombok</artifactId>* <version>1.16.10</version>* </dependency>*/import com.alibaba.fastjson.JSONObject;
import com.mchange.v2.collection.MapEntry;
import lombok.Data;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.*;/*** 自定义框架* 生成mysql表对应的实体类*/
public class MySqlMapper {/*** 配制参数*/static class Config {//mysql地址,数据库,用户名,密码final static private String address = "12.0.0.1:3306";final static private String dbName = "henan";final static private String username = "root";final static private String password = "12346";//模型保存的位置final static private String modelPath = "G:\\IdeaProject\\中文\\src\\main\\java\\com\\digital\\web\\front\\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=\"henan\"";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 {for (ModelTable modelTable : modelTableList) {writerModelTable(modelTable);}}/*** 写入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 lombok = "import lombok.Data;";String javaUtil = "import java.util.*;";String data = "@Data";String headClass = "public class " + modelTable.tableName + "{";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.getToJson(modelTable)).append("\n");sbr.append(ModelFunc.getToMap(modelTable)).append("\n");sbr.append(ModelFunc.setToJson(modelTable)).append("\n");sbr.append(ModelFunc.setToMap(modelTable)).append("\n");
// sbr.append(ModelFunc.getInsertSql(modelTable)).append("\n");//结束sbr.append(tailClass).append("\n");return sbr.toString();}}static class ModelFunc {//方法构造public static String getToJson(ModelTable modelTable) {//将成员变量转化为json对象StringBuilder sbr = new StringBuilder();sbr.append("\t").append("public JSONObject getToJson(){\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 getToMap(ModelTable modelTable) {//将成员变量转化为Map对象StringBuilder sbr = new StringBuilder();sbr.append("\t").append("public Map<String,Object> getToMap(){\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 setToJson(ModelTable modelTable) {//json赋值StringBuilder sbr = new StringBuilder();sbr.append("\t").append("public void setToJson(JSONObject model){\n");JSONObject model = null;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 setToMap(ModelTable modelTable) {//Map赋值StringBuilder sbr = new StringBuilder();sbr.append("\t").append("public void setToMap(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 getInsertSql(ModelTable modelTable) {//获取新增sqlStringBuilder sbr = new StringBuilder();sbr.append("\t").append("public String getInsertSql(){\n");StringBuilder keys = new StringBuilder();StringBuilder values = new StringBuilder();sbr.append("\t\tStringBuilder values = new StringBuilder();").append("\n");for (Map.Entry<String, MapEntry> entry : modelTable.fields.entrySet()) {String fieldName = entry.getKey();keys.append(fieldName).append(",");values.append(".append(" +"\"this.").append(fieldName).append("/.").append(");");}sbr.append("\t\tString sql = values.append(").append("\"insert into ").append(modelTable.tableName).append("(").append(keys.substring(0,keys.length()-1)).append(")value(").append("\")").append(values.substring(0,values.length()-1));sbr.append("insert into ").append(modelTable.tableName).append("(").append(keys.substring(0,keys.length()-1)).append(")value(").append(values.substring(0,values.length()-1)).append(")\";\n");sbr.append("\treturn sql;");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自定义实体类框架
根据表结构自动生产实体类和方法,根据反射与io生成,可自定义扩展方法 package com.digital.web.front; /*** pom依赖* <dependency>* <groupId>mysql</groupId>* <artifactId>mysql-connector-java</artifactId>* <version>5.1.27</ve…...
批量将Excel中的第二列内容从拼音转换为汉字
要批量将Excel中的第二列内容从拼音转换为汉字,您可以使用Python的openpyxl库来实现。下面是一个示例代码,演示如何读取Excel文件并将第二列内容进行拼音转汉字: from openpyxl import load_workbook from xpinyin import Pinyin # 打开Exce…...
消息推送:精准推送,提升运营效果,增添平台活力
对于app开发者而言,没有什么途径比消息推送更能直接、即时地触及目标用户群体了。消息推送与我们的日常生活息息相关,各种APP的状态和通知都通过消息推送来告知用户,引起用户的注意,吸引用户点开app。总而言之,推送服务…...
[保研/考研机试] KY43 全排列 北京大学复试上机题 C++实现
题目链接: 全排列https://www.nowcoder.com/share/jump/437195121692001512368 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有a < b < ... < y < z,而且给定的字符串中的字…...
Java将时间戳转化为特定时区的日期字符串
先上代码: ZonedDateTime dateTime ZonedDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()),zone ); //2019-12-01T19:01:4608:00String formattedDate dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd") ); //2019-12-…...
【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字
611. 有效三角形的个数 611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/ 题目描述: 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 解题思路: 本题是一个关于三角形是否能成立…...
通过 kk 创建 k8s 集群和 kubesphere
官方文档:多节点安装 确保从正确的区域下载 KubeKey export KKZONEcn下载 KubeKey curl -sfL https://get-kk.kubesphere.io | VERSIONv3.0.7 sh -为 kk 添加可执行权限: chmod x kk创建 config 文件 KubeSphere 版本:v3.3 支持的 Kuber…...
感觉和身边其他人有差距怎么办?
虽然清楚知识需要靠时间沉淀,但在看到自己做不出来的题别人会做,自己写不出的代码别人会写时还是会感到焦虑怎么办? 你是否也因为自身跟周围人的差距而产生过迷茫,这份迷茫如今是被你克服了还是仍旧让你感到困扰? 下…...
【C语言基础】宏定义的用法详解
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
微服务系列文章之 SpringBoot 最佳实践
Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。 以下是一些最佳实践和一些技巧,我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。 Spring Boot 的四大核心 1、自动配置 针对很多Spring应用程序和常见的应用功能,Spring Boo…...
C++并发多线程--std::async、std::packaged_task和std::promise的使用
目录 1--std::async的使用 2--std::packaged_task的使用 3--std::promise的使用 1--std::async的使用 std::async用于启动一个异步任务,并返回一个std::future对象;std::future对象里含有异步任务线程入口函数的结果; std::launch::deferr…...
opencv-目标追踪
import argparse import time import cv2 import numpy as np# 配置参数 ap argparse.ArgumentParser() ap.add_argument("-v", "--video", typestr,help"path to input video file") ap.add_argument("-t", "--tracker", …...
【数据结构】 单链表面试题讲解
文章目录 引言反转单链表题目描述示例:题解思路代码实现: 移除链表元素题目描述:示例思路解析: 链表的中间结点题目描述:示例:思路解析代码实现如下: 链表中倒数第k个结点题目描述示例思路解析&…...
C++ string类的模拟实现
模拟实现string类不是为了造一个更好的轮子,而是更加理解string类,从而来掌握string类的使用 string类的接口设计繁多,故而不会全部涵盖到,但是核心的会模拟实现 库中string类是封装在std的命名空间中的,所以在模拟…...
Qt实现简单的漫游器
文章目录 Qt的OpenGL窗口GLSL的实现摄像机类的实现简单的漫游器 Qt的OpenGL窗口 Qt主要是使用QOpenGLWidget来实现opengl的功能。 QOpenGLWidget 提供了三个便捷的虚函数,可以重载,用来重新实现典型的OpenGL任务: paintGL:渲染…...
【c语言】文件操作
朋友们,大家好,今天分享给大家的是文件操作的相关知识,跟着我一起学习吧!! 🎈什么是文件 磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件 程序文…...
【Unity】坐标转换经纬度方法(应用篇)
【Unity】坐标转换经纬度方法(应用篇) 解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法,理论上可以解决小范围内所以坐标转换的问题。 之前有写过[Unity]坐标转换经纬度方法(原理篇),在实际使用中,…...
element时间选择器el-date-picter使用disabledDate指定禁用的日期
需要的效果 <el-date-pickerclass"selectstyle"v-model"year"value-format"yyyy"type"year":picker-options"disabledCli"placeholder"选择年"> </el-date-picker>data() {return {disabledCli: {/…...
出学校干了 5 年外包,已经废了
如果不是女朋友和我提分手,我估计现在还没醒悟 本科大专,17年通过校招进入某软件公司做测试,干了接近5年的功能。 今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经…...
day-23 代码随想录算法训练营(19)part09
669.修剪二叉搜索树 思路一:根据二叉搜索树的特性进行中间值与去区间值判断,有三种情况:1.在区间中,所以左右子树都可能在区间中; 2.在区间外面的左侧,必然只有右子树可能存在区间中;3.在区间外…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
