🦆博主介绍:小黄鸭技术
🌈擅长领域:Java、实用工具、运维
👀 系列专栏:📢Java之路
📧如果文章写作时有错误的地方,请各位大佬指正,一起进步!!!
🧡欢迎大家点赞➕收藏⭐➕评论💬支持博主🤞
参数拼接
将参数以 字段名=参数&字段名=参数 的方式拼接
例如:
name=duck&sex=1&age=18
public static String getParam(Map<String, String> map) throws Exception {
StringBuilder param = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
param.append(entry.getKey()).append("=").append(URLEncoder.encode(String.valueOf(entry.getValue()), "UTF-8")).append("&");
}
param = new StringBuilder(param.substring(0, param.length() - 1));
return param.toString();
}
JSON转实体类
一般我们对接完接口时会返回我们JSON结构的数据,我们需要根据返回的JSON字符串来生成对应的实体类,一般我会用IDEA 的插件 GsonFormat-Plus 来快速生成接收实体类。
先安装插件
Json转换
实体类转建表语句工具
maven依赖
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.2</version>
</dependency>
主要用于利用Swagger的注解来标注字段的含义,通过解析注解来生成建表语句的相关备注。
添加字段的含义
生成建表语句
package com.duck.api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
public class CreateSqlByClass {
private static final Class<?> CLS = User.class;
private static final String LINE = "\r\n";
private static Map<String, String> map = new LinkedHashMap<String, String>();
public static void main(String[] args) throws Exception {
// 获取建表 SQL
createSQL();
}
/**
* 获取建表SQL(执行后控制台会自动输出建表语句SQL)
*/
private static void createSQL() throws Exception {
StringBuilder sb = new StringBuilder();
sb.append("CREATE TABLE `").append(getSqlAttrName(CLS.getSimpleName())).append("` (").append(LINE);
sb.append(" `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',").append(LINE);
sb.append(" `create_time` datetime DEFAULT NULL COMMENT '创建时间',").append(LINE);
sb.append(" `update_time` datetime DEFAULT NULL COMMENT '创建时间',").append(LINE);
sb.append(" `deleted` tinyint DEFAULT 0 COMMENT '是否已删除:0-未删除,1-已删除',").append(LINE);
sb.append(" `version` tinyint DEFAULT 0 COMMENT '版本号',").append(LINE);
// 获取其他参数
Field[] fields = CLS.getDeclaredFields();
for (Field field : fields) {
String type = field.getType().getSimpleName();
String key = getSqlAttrName(field.getName());
String comment = getComment(field, false);
switch (type) {
case "String":
sb.append(" `").append(key).append("` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ").append(comment).append(",")
.append(LINE);
break;
case "int":
case "Integer":
comment = getComment(field, true);
if (isStatusAndType(field.getName())) {
sb.append(" `").append(key).append("` tinyint(2) DEFAULT 0 COMMENT ").append(comment).append(",")
.append(LINE);
} else {
sb.append(" `").append(key).append("` int(11) DEFAULT 0 COMMENT ").append(comment).append(",")
.append(LINE);
}
break;
case "long":
case "Long":
comment = getComment(field, true);
sb.append(" `").append(key).append("` bigint(20) DEFAULT 0 COMMENT ").append(comment).append(",")
.append(LINE);
break;
case "Date":
sb.append(" `").append(key).append("` datetime DEFAULT NULL COMMENT ").append(comment).append(",")
.append(LINE);
break;
case "List":
sb.append(" `").append(key).append("` json DEFAULT NULL COMMENT ").append(comment).append(",")
.append(LINE);
break;
case "BigDecimal":
sb.append(" `").append(key).append("` decimal(16,4) DEFAULT NULL COMMENT ").append(comment).append(",")
.append(LINE);
break;
default:
throw new Exception("未知属性类型:" + type);
}
}
sb.append(" PRIMARY KEY (`id`)").append(LINE);
sb.append(") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT'").append(getApiModelName())
.append("表';").append(LINE);
System.out.println("-- 创建表SQL");
System.out.println(sb.toString());
}
/**
* 大小写转换成_拼接
* **/
private static String getSqlAttrName(String attr) {
char[] array = attr.toCharArray();
StringBuilder sb = new StringBuilder();
int idx = 0;
for (char c : array) {
if (c >= 'a' && c <= 'z') {
sb.append(c);
} else {
if (idx > 0) {
sb.append("_");
}
sb.append(String.valueOf(c).toLowerCase());
}
idx++;
}
return sb.toString();
}
/**
* 获取类的名称注解
* */
private static String getApiModelName() {
ApiModel model = CLS.getAnnotation(ApiModel.class);
if (Objects.isNull(model)) {
return "";
}
return model.value();
}
private static String getComment(Field field, boolean isNumber) {
String sqlFiledName = getSqlAttrName(field.getName());
ApiModelProperty property = field.getAnnotation(ApiModelProperty.class);
if (Objects.isNull(property)) {
if (isNumber) {
map.put(sqlFiledName, "0");
} else {
map.put(sqlFiledName, "NULL");
}
return "''";
}
// 是否有默认值
String expmale = property.example();
if (isNumber) {
map.put(sqlFiledName, expmale);
} else {
map.put(sqlFiledName, "'" + expmale + "'");
}
return "'" + property.value() + "'";
}
private static boolean isStatusAndType(String s) {
s = s.toLowerCase();
return s.endsWith("status") || s.endsWith("type");
}
}
根据表生成Mybatis-Plus Dao层文件
MyBatisX插件
设置数据库信息
如果不显示表,就打开 架构/schemas 中勾选要在idea中展示的表。
生成的文件如下
🧡欢迎大家点赞➕收藏⭐➕评论💬支持博主🤞