Java工具代码
RSAUtil
依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
工具类代码
package com.pm.util; import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.util.StringUtils; import javax.crypto.Cipher; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.net.URLDecoder; import java.net.URLEncoder; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.util.HashMap; import java.util.Map; /** * 备注,解密前台公钥加密的数据,请调用decryptWithPrivate方法 * 每次重启之后,都会生成一个一对新的公私钥 */ public class RSAUtil { //秘钥大小 private static final int KEY_SIZE = 1024; //后续放到常量类中去 public static final String PRIVATE_KEY = "privateKey"; public static final String PUBLIC_KEY = "publicKey"; private static KeyPair keyPair; private static Map<String, String> rsaMap; private static org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = null; //BouncyCastleProvider内的方法都为静态方法,GC不会回收 public static synchronized org.bouncycastle.jce.provider.BouncyCastleProvider getInstance() { if (bouncyCastleProvider == null) { bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider(); } return bouncyCastleProvider; } //生成RSA,并存放 static { try { //通过以下方法,将每次New一个BouncyCastleProvider,可能导致的内存泄漏 /* Provider provider =new org.bouncycastle.jce.provider.BouncyCastleProvider(); Security.addProvider(provider); KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);*/ //解决方案 KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", getInstance()); SecureRandom random = new SecureRandom(); generator.initialize(KEY_SIZE, random); keyPair = generator.generateKeyPair(); //将公钥和私钥存放,登录时会不断请求获取公钥 //建议放到redis的缓存中,避免在分布式场景中,出现拿着server1的公钥去server2解密的问题 storeRSA(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** * 将RSA存入缓存 */ private static void storeRSA() { rsaMap = new HashMap<String, String>(); PublicKey publicKey = keyPair.getPublic(); String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded())); rsaMap.put(PUBLIC_KEY, publicKeyStr); PrivateKey privateKey = keyPair.getPrivate(); String privateKeyStr = new String(Base64.encodeBase64(privateKey.getEncoded())); rsaMap.put(PRIVATE_KEY, privateKeyStr); } /** * 私钥解密(解密前台公钥加密的密文) * * @param encryptText 公钥加密的数据 * @return 私钥解密出来的数据 * @throws Exception e */ public static String decryptWithPrivate(String encryptText) throws Exception { if (StringUtils.isEmpty(encryptText)) { return null; } byte[] en_byte = Base64.decodeBase64(encryptText.getBytes()); //可能导致内存泄漏问题 /* Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider(); Security.addProvider(provider); Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);*/ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", getInstance()); PrivateKey privateKey = keyPair.getPrivate(); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] res = cipher.doFinal(en_byte); return new String(res); } /** * java端 使用公钥加密(此方法暂时用不到) * * @param plaintext 明文内容 * @return byte[] * @throws UnsupportedEncodingException e */ public static byte[] encrypt(String plaintext) throws UnsupportedEncodingException { String encode = URLEncoder.encode(plaintext, "utf-8"); RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); //获取公钥指数 BigInteger e = rsaPublicKey.getPublicExponent(); //获取公钥系数 BigInteger n = rsaPublicKey.getModulus(); //获取明文字节数组 BigInteger m = new BigInteger(encode.getBytes()); //进行明文加密 BigInteger res = m.modPow(e, n); return res.toByteArray(); } /** * java端 使用私钥解密(此方法暂时用不到) * * @param cipherText 加密后的字节数组 * @return 解密后的数据 * @throws UnsupportedEncodingException e */ public static String decrypt(byte[] cipherText) throws UnsupportedEncodingException { RSAPrivateKey prk = (RSAPrivateKey) keyPair.getPrivate(); // 获取私钥参数-指数/系数 BigInteger d = prk.getPrivateExponent(); BigInteger n = prk.getModulus(); // 读取密文 BigInteger c = new BigInteger(cipherText); // 进行解密 BigInteger m = c.modPow(d, n); // 解密结果-字节数组 byte[] mt = m.toByteArray(); //转成String,此时是乱码 String en = new String(mt); //再进行编码,最后返回解密后得到的明文 return URLDecoder.decode(en, "UTF-8"); } /** * 获取公钥 * * @return 公钥 */ public static String getPublicKey() { return rsaMap.get(PUBLIC_KEY); } /** * 获取私钥 * * @return 私钥 */ public static String getPrivateKey() { return rsaMap.get(PRIVATE_KEY); } public static void main(String[] args) throws UnsupportedEncodingException { System.out.println(RSAUtil.getPrivateKey()); System.out.println(RSAUtil.getPublicKey()); byte[] usernames = RSAUtil.encrypt("username"); System.out.println(RSAUtil.decrypt(usernames)); } }
JSON
导包
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
代码
/**
* 格式化输出JSON字符串
* @return 格式化后的JSON字符串
*/
private static String toPrettyFormat(String json) {
JsonParser jsonParser = new JsonParser();
JsonObject jsonObject = jsonParser.parse(json).getAsJsonObject();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(jsonObject);
}
日志
package com.jiajian.start.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.Marker; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 封装日志工具 * * @author jiajian * @date 2023/4/13 9:32 */ public class MyLogger { private Logger logger; private String logDir = ".\\log\\"; private String logPath = null; private String name; // 临时存储日志 private List<String> logCache = new ArrayList<>(); // 当前存在的写入线程 private WriteThread writeThread = null; // 写入日志线程的刷新标志 private boolean isFlush = false; // 文件写入工具 private FileUtil fileUtil = new FileUtil(); // 日期工具 private DateUtil dateUtil = new DateUtil(); // 字符串工具 private StringUtil stringUtil = new StringUtil(); /** * @Function: 初始化 * @Param: * @Return: */ public MyLogger(String name){ this.name = name; logger = LoggerFactory.getLogger(name); // 创建当天日志的文件夹 logDir = logDir + dateUtil.getFormatDate(new Date(),dateUtil.shortBarFormat) + "\\"; File file = new File(logDir); if(!file.exists()){ System.out.println("------------日志文件夹不存在,创建文件夹"+file.getAbsolutePath()); file.mkdirs(); } // 生成日志文件路径 logPath = logDir + String.format("%s_%s.txt",name,dateUtil.getFormatDate(new Date(),1)); } /** * @Function: 每次写入日志唤醒的文件写入线程,出现一条日志后,线程会等待两秒,两秒内出现新日志会刷新等待时间,两秒内没有新日志出现则写入日志 * @Param: * @Return: */ private class WriteThread extends Thread{ @Override public void run() { super.run(); // 第一次写入日志命令出现,开始计时 long startTime = new Date().getTime(); while (true){ // 开始循环等待下一条消息到来或两秒时间结束 if(isFlush){ // 新消息出现,刷新计时 startTime = new Date().getTime(); isFlush = false; continue; } // 判断两秒时间是否结束 long endTime = new Date().getTime(); if(endTime - startTime > 2000){ break; } } // 两秒内未出现新日志,开始写入日志 try { fileUtil.writeIntoFile(String.join("\n",logCache)+"\n",logPath); writeThread = null; isFlush = false; } catch (Exception e) { throw new RuntimeException(e); } } } /** * @Function: 添加日志,查看日志写入进程状态,调用日志写入进程 * @Param: * @Return: */ private void addLog(String s){ // 将日志添加进缓存 logCache.add(s); // 查看是否存在写入线程在等待 if (null != writeThread){ isFlush = true; }else { writeThread = new WriteThread(); writeThread.start(); } } /** * @Function: 组装info日志 * @Param: * @Return: */ private void i(String s){ s = String.format("%s\tINFO\t%s\t:%s", dateUtil.getFormatDate(new Date(),5), name, s ); addLog(s); } /** * @Function: 组装error日志 * @Param: * @Return: */ private void e(String s){ s = String.format("%s\tERROR\t%s\t:%s", dateUtil.getFormatDate(new Date(),5), name, s ); addLog(s); } /** * @Function: 组装debug日志 * @Param: * @Return: */ private void d(String s){ s = String.format("%s\tDEBUG\t%s\t:%s", dateUtil.getFormatDate(new Date(),5), name, s ); addLog(s); } /** * @Function: 组装track日志 * @Param: * @Return: */ private void t(String s){ s = String.format("%s\tTRACK\t%s\t:%s", dateUtil.getFormatDate(new Date(),5), name, s ); addLog(s); } /** * @Function: 组装warn日志 * @Param: * @Return: */ private void w(String s){ s = String.format("%s\tWARN\t%s\t:%s", dateUtil.getFormatDate(new Date(),5), name, s ); addLog(s); } public void trace(String s) { logger.trace(s); t(s); } public void trace(String s, Object... objects) { logger.trace(s,objects); t(stringUtil.parseFormatString(s,"{}",objects)); } public void trace(String s, Throwable throwable) { logger.trace(s,throwable); t(s); } public void debug(String s) { logger.debug(s); d(s); } public void debug(String s, Object... objects) { logger.debug(s, objects); d(stringUtil.parseFormatString(s,"{}",objects)); } public void debug(String s, Throwable throwable) { logger.debug(s, throwable); d(s); } public void info(String s) { logger.info(s); i(s); } public void info(String s, Object... objects) { logger.info(s, objects); i(stringUtil.parseFormatString(s,"{}",objects)); } public void info(String s, Throwable throwable) { logger.info(s, throwable); i(s); } public void warn(String s) { logger.warn(s); w(s); } public void warn(String s, Object... objects) { logger.warn(s, objects); w(stringUtil.parseFormatString(s,"{}",objects)); } public void warn(String s, Throwable throwable) { logger.warn(s, throwable); w(s); } public void error(String s) { logger.error(s); e(s); } public void error(String s, Object... objects) { logger.error(s, objects); e(stringUtil.parseFormatString(s,"{}",objects)); } public void error(String s, Throwable throwable) { logger.error(s, throwable); e(s); } }
字符串
package com.jiajian.start.util; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.stream.Stream; /** * TODO: * * @author jiajian * @date 2023/4/11 10:29 */ public class StringUtil { List<String> uppers = Stream.iterate((int)'A',(x)->(x+1)).limit(26). map(x->String.valueOf((char) ((int)x))).collect(Collectors.toList()); List<String> lowers = Stream.iterate((int)'a',(x)->(x+1)).limit(26). map(x->String.valueOf((char) ((int)x))).collect(Collectors.toList()); List<String> numbers = Stream.iterate(0,(x)->x+1).limit(10).map(x->String.valueOf(x)).collect(Collectors.toList()); /** * @Function: 将含有占位符的字符串的占位符转换为替换占位符后的字符串 * @Param: * @Return: */ public String parseFormatString(String sourceString,String format,Object...objects){ sourceString = sourceString.replace(format,"%s"); return String.format(sourceString,objects); } /** * 制造一个由数字,大小写字母组合成的字符串 * [length] * @return java.lang.String * @throw */ public String getRandomString(int length){ ArrayList<String> results = new ArrayList<>(); Random random = new Random(); // 随机字符源 List<String> sources = new ArrayList<>(); sources.addAll(uppers); sources.addAll(lowers); sources.addAll(numbers); for (int i = 0; i < length; i++) { int index = random.nextInt(62); results.add(sources.get(index)); } return String.join("",results); } /** * @Param: 下划线规则字符串,是否首字母大写 * @Function: 将下划线规则字符串转换为驼峰规则 * @Return: 驼峰规则字符串 */ public String getHumpFromUnderLineString(String sourceString,boolean isFirstCharUpper){ // 截断为几个单个字符串 String[] stringArray = sourceString.split("_"); int i = 1; if(isFirstCharUpper){ // 如果首字母大写 i = 0; } for (; i < stringArray.length; i++) { // 后续部分逐个大写首字母 stringArray[i] = getFirstCharUp(stringArray[i]); } // 组装返回 return String.join("",stringArray); } /** * @Param: 普通字符串 * @Function: 将首字母大写 * @Return: 首字母大写的对应字符串 */ public String getFirstCharUp(String sourceString){ return sourceString.substring(0,1).toUpperCase() + sourceString.substring(1); } public static void main(String[] args) { StringUtil stringUtil = new StringUtil(); // stringUtil.getRandomString(18); // System.out.println(stringUtil.getHumpFromUnderLineString("sjhs_hj_icds",true));; } }
文件
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; /** * 文件工具类 * * @author jiajian * @date 2023/4/11 14:06 */ public class FileUtil { /** * 将内容写进文件 * [string] * @return void * @throw */ public void writeIntoFile(String string,String targetPath) throws Exception{ // 存储sql语句的文件 File sqlFile = new File(targetPath); if (sqlFile.exists()){ sqlFile.createNewFile(); } // 写进文件 try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(targetPath))){ bufferedWriter.append(string); bufferedWriter.flush(); } } }
时间
import java.text.SimpleDateFormat; import java.util.Date; /** * TODO: * * @author jiajian * @date 2023/4/12 17:28 */ public class DateUtil { public final String[] format = new String[]{ "yyyy/MM/dd", "yyyy-MM-dd", "yyyy/MM/dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.sss", "yyyy-MM-dd HH:mm:ss.sss" }; public final int shortSlashFormat = 0; public final int shortBarFormat = 1; public final int normalSlashFormat = 2; public final int defaultFormat = 3; public final int normalBarFormat = 3; public final int longSlashFormat = 4; public final int longBarFormat = 5; /** * 返回指定时间格式的时间字符串 * [date, format_index] * @return java.lang.String * @throw */ public String getFormatDate(Date date, int formatIndex){ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format[formatIndex]); return simpleDateFormat.format(date); } /** * @Function: 将字符串解析为时间 * @Param: * @Return: */ public Date getDateFromString(String source,int formatIndex) throws Exception{ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format[formatIndex]); return simpleDateFormat.parse(source); } }
数据库相关自动代码
自动程序一
https://gitee.com/losHill/tools.git
自动程序二
初始化代码生成代码:读取指定格式的表格表述表单,生成java bean、数据库建表语句等代码(额外的工具代码,非项目代码)
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;
/**
* 工具类:解析的表格默认第一个字段为主键,且是唯一主键,类型为int
*
* @author jiajian
* @date 2023/4/7 11:54
*/
public class ParseExcelToDb {
private static String dataDir = "D:\\loshill\\blog\\document\\code_create\\";
private static String excelPath = dataDir + "table_info.xlsx";
private static String createSqlPath = dataDir + "create_sql\\";
private static String insertSqlPath = dataDir + "insert_sql\\";
private static String entityPath = dataDir + "entity\\";
private static String daoPath = dataDir + "dao\\";
private static String selectSqlPath = dataDir + "select_sql\\";
private static String updateSqlPath = dataDir + "update_sql\\";
private static String deleteSqlPath = dataDir + "delete_sql\\";
static {
File file = new File(createSqlPath);
if(!file.exists()){
file.mkdirs();
}
file = new File(insertSqlPath);
if(!file.exists()){
file.mkdirs();
}
file = new File(entityPath);
if(!file.exists()){
file.mkdirs();
}
file = new File(daoPath);
if(!file.exists()){
file.mkdirs();
}
file = new File(selectSqlPath);
if(!file.exists()){
file.mkdirs();
}file = new File(updateSqlPath);
if(!file.exists()){
file.mkdirs();
}
file = new File(deleteSqlPath);
if(!file.exists()){
file.mkdirs();
}
}
// 解析表格获取到的信息
private static Map<String,ArrayList<String[]>> info = getInformationFromForm();
// 操作文件的工具
private FileUtil fileUtil = new FileUtil();
// 操作字符串的工具
private StringUtil stringUtil = new StringUtil();
/**
* @Function: 使用jdbcTemplate的dao模板
* @Param:
* @Return:
*/
public void getDao() throws Exception{
// 循环表格
for (Map.Entry entry : info.entrySet()){
String result = "";
// 需要用到的信息
// 下划线格式的表名
String tableName = (String)entry.getKey();
ArrayList<String[]> table = (ArrayList<String[]>)entry.getValue();
String[] bineArray = table.get(0);
List<String> javaBineArray = Arrays.stream(bineArray).map(x->
String.format("%s.get%s()",stringUtil.getHumpFromUnderLineString(tableName,false),stringUtil.getHumpFromUnderLineString(x,true))).
collect(Collectors.toList());
List<String> bineList = new ArrayList<>(Arrays.asList(bineArray));
// 主键
String primaryKey = bineArray[0];
//包导入
result += String.format("package com.jiajian.start.dao;\n" +
"\n" +
"import com.jiajian.start.bean.%s;\n" +
"import org.springframework.beans.factory.annotation.Autowired;\n" +
"import org.springframework.jdbc.core.BeanPropertyRowMapper;\n" +
"import org.springframework.jdbc.core.JdbcTemplate;\n" +
"import org.springframework.stereotype.Repository;\n" +
"import java.util.List;\n" +
"\n" +
"/**\n" +
" * TODO:\n" +
" *\n" +
" * @author jiajian\n" +
" */\n",stringUtil.getHumpFromUnderLineString(tableName,true));
// 类声明
result += String.format("@Repository\n" +
"public class %sDao{\n",
stringUtil.getHumpFromUnderLineString(tableName,true));
// jdbc注入
result += "@Autowired\n" +
"\tJdbcTemplate jdbcTemplate;\n\n";
// 注释
result += "\t/**\n" +
"\t * @Function: 插入一条数据\n" +
"\t * @Param:\n" +
"\t * @Return:\n" +
"\t*/\n";
// 插入方法
result += String.format("\tpublic int insert(%s %s){\n",
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,false));
String[] questionMarks = new String[bineArray.length-1];
Arrays.fill(questionMarks,"?");
result += String.format("\t\tString insertSql = \"INSERT INTO `%s`(`%s`) values (%s) \";\n",
entry.getKey(),
String.join("`,`",bineList.subList(1, bineList.size())),
String.join(",",questionMarks));
result += String.format("\t\tint result = jdbcTemplate.update(insertSql,%s);\n",
String.join(",",javaBineArray.subList(1, javaBineArray.size())));
result += "\t\treturn result;\n\t}\n\n";
// 使用确定主键插入方法
// 注释
result += "\t/**\n" +
"\t * @Function: 使用确定主键插入数据\n" +
"\t * @Param:\n" +
"\t * @Return:\n" +
"\t*/\n";
result += String.format("\tpublic int insertWithPrimaryKey(%s %s){\n",
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,false));
questionMarks = new String[bineArray.length];
Arrays.fill(questionMarks,"?");
result += String.format("\t\tString insertSql = \"INSERT INTO `%s`(`%s`) values (%s) \";\n",
entry.getKey(),
String.join("`,`",bineList),
String.join(",",questionMarks));
result += String.format("\t\tint result = jdbcTemplate.update(insertSql,%s);\n",
String.join(",",javaBineArray));
result += "\t\treturn result;\n\t}\n\n";
// 查找最大主键方法
// 注释+方法声明
result += "\t/**\n" +
"\t * @Function: 查询最大主键值\n" +
"\t * @Param:\n" +
"\t * @Return:\n" +
"\t*/\n" +
"\tpublic int selectMaxPrimaryKey(){\n";
// 方法体
result += String.format(
"\t\tString selectSql = \"select `%s` from `%s` order by `%s` desc limit 1\";\n" +
"\t\tint result = jdbcTemplate.queryForObject(selectSql, Integer.class);\n" +
"\t\treturn result;\n" +
"\t}\n\n\n",
primaryKey,
tableName,
primaryKey);
// 删除方法
result += String.format("\t/**\n" +
"\t * @Function: 根据主键删除一条数据\n" +
"\t * @Param: %s\n" +
"\t * @Return:\n" +
"\t*/\n",primaryKey);
result += String.format("\tpublic int deleteBy%s(int %s){\n",
stringUtil.getHumpFromUnderLineString(primaryKey,true),
stringUtil.getHumpFromUnderLineString(primaryKey,false));
result += String.format("\t\tString deleteSql = \"delete from `%s` where `%s`=?\";\n",
tableName,
stringUtil.getHumpFromUnderLineString(primaryKey,false));
result += String.format("\t\tint result = jdbcTemplate.update(deleteSql,%s);\nreturn result;\n\t}\n\n",
stringUtil.getHumpFromUnderLineString(primaryKey,false));
// 更新方法
result += "\t/**\n" +
"\t * @Function: 更新\n" +
"\t * @Param:\n" +
"\t * @Return:\n" +
"\t*/\n";
result += String.format("\tpublic int update(%s %s){\n",
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,false));
result += String.format("\t\tString updateSql = \"update `%s` set `%s`=? where `%s`=? \";\n",
entry.getKey(),
String.join("`=?,`",bineArray),
primaryKey);
result += String.format("\t\tint result = jdbcTemplate.update(updateSql,%s,%s.get%s());\n",
String.join(",",javaBineArray),
stringUtil.getHumpFromUnderLineString(tableName,false),
stringUtil.getHumpFromUnderLineString(primaryKey,true));
result += "\t\treturn result;\n\t}\n\n";
// 查询单个
result += "\t/**\n" +
"\t * @Function: 单条信息查询\n" +
"\t * @Param:\n" +
"\t * @Return:\n" +
"\t*/\n";
result += String.format("\tpublic %s selectBy%s(int %s){\n",
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(primaryKey,true),
stringUtil.getHumpFromUnderLineString(primaryKey,false));
result += String.format("\t\tString selectSql = \"select `%s` from `%s` where %s=?\";\n",
String.join("`,`",bineArray),
tableName,
primaryKey);
result += String.format("\t\t%s %s = jdbcTemplate.queryForObject(selectSql,new BeanPropertyRowMapper<%s>(%s.class),%s);\n",
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,false),
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(primaryKey,false));
result += String.format("\t\treturn %s;\n\t}\n\n",
stringUtil.getHumpFromUnderLineString(tableName,false));
// 查询多个
result += "\t/**\n" +
"\t * @Function: 多条信息查询\n" +
"\t * @Param:\n" +
"\t * @Return:\n" +
"\t*/\n";
result += String.format("\tpublic List<%s> selectAll(){\n",
stringUtil.getHumpFromUnderLineString(tableName,true));
result += String.format("\t\tString selectSql = \"select `%s` from `%s`\";\n",
String.join("`,`",bineArray),
tableName);
result += String.format("\t\tList<%s> %sList = jdbcTemplate.query(selectSql,new BeanPropertyRowMapper<%s>(%s.class));\n",
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,false),
stringUtil.getHumpFromUnderLineString(tableName,true),
stringUtil.getHumpFromUnderLineString(tableName,true));
result += String.format("\t\treturn %sList;\n\t}\n\n",
stringUtil.getHumpFromUnderLineString(tableName,false));
// 类模板收尾
result += "}\n\n\n\n";
fileUtil.writeIntoFile(result,daoPath+entry.getKey()+".txt");
}
}
/**
* 生成表格的对应实体
* []
* @return void
* @throw
*/
public void getEntity() throws Exception{
for (Map.Entry entry : info.entrySet()){
String result = "";
// 需要用到如下几个信息,字段名,字段类型,字段备注
ArrayList<String[]> table = (ArrayList<String[]>)entry.getValue();
String[] bineArray = table.get(0);
String[] typeArray = table.get(1);
String[] commentArray = table.get(6);
// 实体名
String sqlTableName = (String) entry.getKey();
String tableName = stringUtil.getHumpFromUnderLineString(sqlTableName,true);
// 导包
result += "package com.jiajian.start.bean;\n" +
"\n" +
"import lombok.Data;\n" +
"import javax.persistence.Entity;\n" +
"\n" +
"/**\n" +
" * TODO:\n" +
" *\n" +
" * @author jiajian\n" +
" */\n";
// 组装字符串
result += String.format("@Data\n@Entity\npublic class %s {\n",tableName);
// 循环获取信息
for (int i = 0; i < bineArray.length; i++) {
// 字段名
String sqlBine = bineArray[i];
// 替换_命名为驼峰规则
String bine = stringUtil.getHumpFromUnderLineString(sqlBine,false);
// 字段类型
String mysqlType = typeArray[i];
String type = "String";
switch (mysqlType){
case "int":
type = "int";
break;
}
// 注释
String comment = commentArray[i];
// 组装实体成员变量
result += String.format("\t// %s\n\tprivate %s %s;\n\n",comment,type,bine);
}
// 组装字符串收尾
result += "}\n\n\n\n";
fileUtil.writeIntoFile(result,entityPath+entry.getKey()+".txt");
}
}
/**
* 根据信息列表生成插入sql语句
* []
* @return void
* @throw
*/
public void getInsertSql() throws Exception{
// 生成指定格式的时间字符串
DateUtil dateUtil = new DateUtil();
// 随机数
Random random = new Random();
// 循环解析信息,组装sql
for (Map.Entry entry : info.entrySet()){
String result = "";
// 存储插入的值
ArrayList<String> insertValue1 = new ArrayList<>();
ArrayList<String> insertValue2 = new ArrayList<>();
ArrayList<String> insertValue3 = new ArrayList<>();
ArrayList<String[]> table = (ArrayList<String[]>)entry.getValue();
// 自增长列表
String[] increment = table.get(4);
// 字段类型列表
String[] typeList = table.get(1);
// 字段列表
String[] bineArray = table.get(0);
// 根据类型为每个字段生成三个随机值
for (int i = 0; i < typeList.length; i++){
if("y".equals(increment[i])){
// 如果是自增长则设值为null
insertValue1.add("null");
insertValue2.add("null");
insertValue3.add("null");
continue;
}
String type = typeList[i];
// 如果是枚举类型则插入指定值
if(type.contains("enum")){
String[] ss = type.replace("enum","").replace("(","").
replace(")","").split(",");
// 为字段生成三个随机值
insertValue1.add(ss[random.nextInt(ss.length)]);
insertValue2.add(ss[random.nextInt(ss.length)]);
insertValue3.add(ss[random.nextInt(ss.length)]);
continue;
}
// 为字段生成三个随机值
switch (type){
case "int":
insertValue1.add(String.valueOf(new Random().nextInt()));
insertValue2.add(String.valueOf(new Random().nextInt()));
insertValue3.add(String.valueOf(new Random().nextInt()));
break;
case "datetime":
insertValue1.add("\'" + dateUtil.getFormatDate(new Date(),3) + "\'");
insertValue2.add("\'" + dateUtil.getFormatDate(new Date(),3) + "\'");
insertValue3.add("\'" + dateUtil.getFormatDate(new Date(),3) + "\'");
break;
default:
insertValue1.add("\'" + stringUtil.getRandomString(16) + "\'");
insertValue2.add("\'" + stringUtil.getRandomString(16) + "\'");
insertValue3.add("\'" + stringUtil.getRandomString(16) + "\'");
break;
}
}
// 组装sql语句
result += String.format("INSERT INTO `%s` values (%s),(%s),(%s);\n\n\n",
entry.getKey(),String.join(",",insertValue1)
,String.join(",",insertValue2)
,String.join(",",insertValue3));
fileUtil.writeIntoFile(result,insertSqlPath+entry.getKey()+".txt");
}
}
/**
* @Function: 生成jdbcTemplate使用的参数形式的sql语句使用模板
* @Param:
* @Return:
*/
public void getDeleteSql() throws Exception{
// 表格循环
for (Map.Entry entry : info.entrySet()){
String result = "";
ArrayList<String[]> table = (ArrayList<String[]>)entry.getValue();
String tableName = (String)entry.getKey();
result += String.format("String deleteSql = \"delete from %s where =?\";\n",
tableName);
result += String.format("int result = jdbcTemplate.update(deleteSql,param);\nreturn result;\n\n\n");
fileUtil.writeIntoFile(result,deleteSqlPath+entry.getKey()+".txt");
}
}
/**
* @Param:
* @Function: 解析信息生成修改sql
* @Return:
*/
public void getUpdateSql() throws Exception{
// 循环信息组装sql
for (Map.Entry entry : info.entrySet()){
// 返回结果
String result = "";
ArrayList<String[]> table = (ArrayList<String[]>)entry.getValue();
// 需要使用到的信息为字段名
String[] bineArray = table.get(0);
// 作为sql参数部分
String tableName = stringUtil.getHumpFromUnderLineString((String) entry.getKey(),false);
String[] javaBineArray = Arrays.stream(bineArray).map(x->String.format("%s.get%s()",tableName,stringUtil.getHumpFromUnderLineString(x,true))).toArray(String[]::new);
// 将字段组合为语句
result += String.format("String updateSql = \"update `%s` set `%s=? where =? \";\n",
entry.getKey(),
String.join("`=?,`",bineArray));
result += String.format("int result = jdbcTemplate.update(updateSql,%s,whereparam);\n",
String.join(",",javaBineArray));
result += "return result;\n\n\n";
fileUtil.writeIntoFile(result,updateSqlPath+entry.getKey()+".txt");
}
}
/**
* @Param:
* @Function: 通过解析信息获取查询语句
* @Return:
*/
public void getSelectSql() throws Exception{
// 循环所有表格
for (Map.Entry entry : info.entrySet()){
String result = "";
// 需要使用到的信息为字段名
ArrayList<String[]> table = (ArrayList<String[]>)entry.getValue();
String[] bineArray = table.get(0);
// 循环所有字段获取mysql语句
result += String.format("select `%s` from `%s` \n\n\n",String.join("`,`",bineArray),entry.getKey());
fileUtil.writeIntoFile(result,selectSqlPath+entry.getKey()+".txt");
}
}
/**
* 将getInformationFromForm方法解析出来的信息组装为sql语句,存储到sqlPath中
* [infoMap, sqlPath]
* @return void
* @throw
*/
public void getCreateSql() throws Exception{
for (Map.Entry entry : info.entrySet()){
// 循环获取信息,生成sql语句
String results = "";
// 组装sql语句
String createSql = String.format("CREATE TABLE IF NOT EXISTS `%s` (\n", entry.getKey());
// 表字段信息
ArrayList<String[]> tableInfo = (ArrayList<String[]>)entry.getValue();
String[] bineList = tableInfo.get(0);
String[] typeList = tableInfo.get(1);
String[] defaultList = tableInfo.get(2);
String[] noneAbleList = tableInfo.get(3);
String[] incrementList = tableInfo.get(4);
String[] primaryKeyList = tableInfo.get(5);
String[] commentList = tableInfo.get(6);
String primaryKey = "";
for (int i = 0; i < bineList.length; i++) {
// 判断是否存在默认值
String default_;
if ("".equals(defaultList[i])){
default_ = "";
}else {
if ("\"-\"".equals(defaultList[i])){
default_ = "default " + "\"-\"";
}else {
default_ = "default " + defaultList[i];
}
}
// 是否可空
String noneAble;
if ("y".equals(noneAbleList[i])){
noneAble = "NULL";
}else {
noneAble = "NOT NULL";
}
// 判断是否是主键
if ("y".equals(primaryKeyList[i])){
primaryKey =