根据MYSQL数据库生成注解类mybatisSQL语句(仅包含主键)

package com;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GenBaseSQLMysql {

	private String packageOutPathEntity = "com.user.entity";// 指定实体生成所在包的路径
	private String packageOutPath = "com.user.sql";// 指定实体生成所在包的路径
	private String authorName = "linshiq";// 作者名字
	private String tablename = "";// 表名
	private boolean f_util = false; // 是否需要导入包java.util.*
	private boolean f_sql = false; // 是否需要导入包java.sql.*
	private boolean f_decimal = false; // 是否需要导入包java.sql.*

	// 数据库连接
	private static final String URL = "jdbc:mysql://localhost:3306/llll";
	private static final String NAME = "root";
	private static final String PASS = "root";
	private static final String DRIVER = "com.mysql.jdbc.Driver";

	/*
	 * 构造函数
	 */
	public GenBaseSQLMysql() {
		// 创建连接
		Connection con;

		PreparedStatement pStemt = null;
		try {
			try {
				Class.forName(DRIVER);
			} catch (ClassNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			con = DriverManager.getConnection(URL, NAME, PASS);

			// 获取所有的表名
			DatabaseMetaData meta = con.getMetaData();
			ResultSet rs = meta.getTables(null, null, null, new String[] { "TABLE" });
			while (rs.next()) {
				System.out.println("------------------------------");
				System.out.println("表名:" + rs.getString(3));
				System.out.println("表所属用户名:" + rs.getString(2));

				String tablename = rs.getString(3);
				this.tablename = tablename;
				// 获取所有的主键
				// oracle 语句 select
				// table_name,dbms_metadata.get_ddl('TABLE','TABLE_NAME')from
				// dual,user_tables where table_name='TABLE_NAME';
				// TABLE_NAME为具体的表名,要求大写
				String sql_table = "SHOW CREATE TABLE " + tablename;
				PreparedStatement pre = con.prepareStatement(sql_table);
				ResultSet rs1 = pre.executeQuery();
				if (rs1.next()) {

					// 正则匹配数据
					Pattern pattern = Pattern.compile("PRIMARY KEY \\(\\`(.*)\\`\\)");
					Matcher matcher = pattern.matcher(rs1.getString(2));
					matcher.find();
					String data = "";
					try {
						data = matcher.group();
					} catch (IllegalStateException e) {
						System.out.println("没主键");
						continue;
					}

					// 过滤对于字符
					data = data.replaceAll("\\`|PRIMARY KEY \\(|\\)", "");
					// 拆分字符
					String[] stringArr = data.split(",");
					System.out.println("主键为:" + Arrays.toString(stringArr));

					System.out.println("------------------------------");

					// 查要生成实体类的表
					String sql = "select * from " + tablename;

					pStemt = con.prepareStatement(sql);
					ResultSetMetaData rsmd = pStemt.getMetaData();
					int size = rsmd.getColumnCount(); // 统计列
					String[] colnames = new String[size];
					String[] colTypes = new String[size];
					int[] colSizes = new int[size];
					for (int i = 0; i < size; i++) {
						colnames[i] = rsmd.getColumnName(i + 1).toLowerCase();
						colTypes[i] = rsmd.getColumnTypeName(i + 1);

						colSizes[i] = rsmd.getColumnDisplaySize(i + 1);
					}

					String content = parse(colnames, colTypes, colSizes, stringArr);

					try {
						File directory = new File("");
						// System.out.println("绝对路径:"+directory.getAbsolutePath());
						// System.out.println("相对路径:"+directory.getCanonicalPath());
						String path = this.getClass().getResource("").getPath();

						System.out.println(path);
						System.out.println("src/?/" + path.substring(path.lastIndexOf("/com/", path.length())));
						// String outputPath = directory.getAbsolutePath()+
						// "/src/"+path.substring(path.lastIndexOf("/com/",
						// path.length()), path.length()) + initcap(tablename) +
						// ".java";
						String outputPath = directory.getAbsolutePath() + "/src/main/java/"
								+ this.packageOutPath.replace(".", "/") + "/" + initcap(tablename) + "Dao.java";
						FileWriter fw = new FileWriter(outputPath);
						System.out.println(outputPath);
						PrintWriter pw = new PrintWriter(fw);
						pw.println(content);
						pw.flush();
						pw.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// try {
			// con.close();
			// } catch (SQLException e) {
			// // TODO Auto-generated catch block
			// e.printStackTrace();
			// }
		}
	}

	/**
	 * 功能:生成实体类主体代码
	 * 
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @param stringArr
	 * @return
	 */
	private String parse(String[] colnames, String[] colTypes, int[] colSizes, String[] stringArr) {

		// 确定导入包
		for (int i = 0; i < stringArr.length; i++) {

			for (int j = 0; j < colnames.length; j++) {

				if (colnames[j].equalsIgnoreCase(stringArr[i])) {

					if (colTypes[i].equalsIgnoreCase("datetime")) {
						f_util = true;
					}
					if (colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")) {
						f_sql = true;
					}

					String clone = colTypes[i].toLowerCase();

					if (clone.contains("decimal")) {
						f_decimal = true;
					}
				}

			}
		}

		StringBuffer sb = new StringBuffer();

		sb.append("package " + this.packageOutPath + ";\r\n");
		sb.append("\r\n");
		// 判断是否导入工具包
		if (f_util) {
			sb.append("import java.util.Date;\r\n");
		}
		if (f_sql) {
			sb.append("import java.sql.*;\r\n");
		}
		if (f_decimal) {
			sb.append("import java.math.BigDecimal;\r\n");
		}
		sb.append("import org.apache.ibatis.annotations.Delete;\r\n");
		sb.append("import org.apache.ibatis.annotations.Insert;\r\n");
		sb.append("import org.apache.ibatis.annotations.Select;\r\n");
		sb.append("import org.apache.ibatis.annotations.Update;\r\n");
		sb.append("import org.apache.ibatis.annotations.Mapper;\r\n");
		sb.append("import " + packageOutPathEntity + "." + initcap(tablename) + ";\r\n");
		sb.append("\r\n");

		// 注释部分
		sb.append("   /**\r\n");
		sb.append("    * " + tablename + " 基础SQL\r\n");
		sb.append("    * " + new Date() + " " + this.authorName + "\r\n");
		sb.append("    */ \r\n");
		// 实体部分
		sb.append("\r\n@Mapper");
		sb.append("\r\npublic interface " + initcap(tablename) + "Dao{\r\n");
		processDelete(sb, colnames, colTypes, colSizes, stringArr);
		sb.append("\r\n");
		processUpdate(sb, colnames, colTypes, colSizes, stringArr);
		sb.append("\r\n");
		processSelect(sb, colnames, colTypes, colSizes, stringArr);
		sb.append("\r\n");
		processInsert(sb, colnames, colTypes, colSizes, stringArr);

		sb.append("}\r\n");

		// System.out.println(sb.toString());
		return sb.toString();
	}

	/**
	 * @Author linshiq
	 *         <p>
	 *         <li>2018年11月15日-下午4:33:28</li>
	 *         <li>功能说明:补充基础Insert</li>
	 *         </p>
	 * @param sb
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @param stringArr
	 */
	private void processInsert(StringBuffer sb, String[] colnames, String[] colTypes, int[] colSizes,
			String[] stringArr) {

		StringBuffer insertInfoSb = new StringBuffer();

		for (int i = 0; i < colnames.length; i++) {// 补充insert into部分
			insertInfoSb.append(colnames[i].toLowerCase()).append(",");
		}
		insertInfoSb.delete(insertInfoSb.length() - 1, insertInfoSb.length());

		StringBuffer valuesSb = new StringBuffer(); // 补充values部分
		for (int j = 0; j < colnames.length; j++) {

			valuesSb.append("#{" + colnames[j] + "}").append(",");

		}

		valuesSb.delete(valuesSb.length() - 1, valuesSb.length());

		// 开始组装
		StringBuffer overParm = new StringBuffer();
		overParm.append("INSERT INTO " + tablename + " ( " + insertInfoSb.toString() + " ) ");
		overParm.append(" VALUES (" + valuesSb.toString() + ")");

		sb.append("\t" + "@Insert(\"" + overParm.toString() + "\")" + "\r\n");// 补充方法注解

		sb.append("\tint insertByKey(" + initcap(tablename) + " " + tablename + ");\r\n");
		//System.out.println(parm);

	}

	/**
	 * @Author linshiq
	 *         <p>
	 *         <li>2018年11月15日-下午4:33:26</li>
	 *         <li>功能说明:补充基础Select</li>
	 *         </p>
	 * @param sb
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @param stringArr
	 */
	private void processSelect(StringBuffer sb, String[] colnames, String[] colTypes, int[] colSizes,
			String[] stringArr) {

		StringBuffer resultSb = new StringBuffer();

		for (int i = 0; i < colnames.length; i++) {
			resultSb.append(colnames[i].toLowerCase()).append(",");
		}
		resultSb.delete(resultSb.length() - 1, resultSb.length());

		StringBuffer inParm = new StringBuffer();
		StringBuffer overParm = new StringBuffer();
		overParm.append("SELECT " + resultSb.toString() + " FROM " + tablename + " WHERE ");
		for (int i = 0; i < stringArr.length; i++) {

			for (int j = 0; j < colnames.length; j++) {

				if (colnames[j].equalsIgnoreCase(stringArr[i])) {
					inParm.append(sqlType2JavaType(colTypes[i]) + " " + stringArr[i] + ",");
					overParm.append(stringArr[i] + " = " + "#{" + stringArr[i] + "}").append(" and ");
				}

			}

		}
		overParm.delete(overParm.length() - 5, overParm.length());
		sb.append("\t" + "@Select(\"" + overParm.toString() + "\")" + "\r\n");
		inParm.delete(inParm.length() - 1, inParm.length());
		sb.append("\t" + initcap(tablename) + " selectByKey(" + inParm.toString() + ");\r\n");
		//System.out.println(parm);

	}

	/**
	 * @Author linshiq
	 *         <p>
	 *         <li>2018年11月15日-下午4:33:24</li>
	 *         <li>功能说明:补充基础Update</li>
	 *         </p>
	 * @param sb
	 * @param colnames
	 * @param colTypes
	 * @param colSizes
	 * @param stringArr
	 */
	private void processUpdate(StringBuffer sb, String[] colnames, String[] colTypes, int[] colSizes,
			String[] stringArr) {

		// 组装set部分
		StringBuffer setSb = new StringBuffer();
		
		List<String> mainKey = Arrays.asList(stringArr);
		
		for (int j = 0; j < colnames.length; j++) {
			
			if (mainKey.contains(colnames[j].toUpperCase()) || mainKey.contains(colnames[j].toLowerCase())) {
				continue;
			}
			
			setSb.append(colnames[j] + " = " + "#{" + colnames[j] + "}").append(",");

		}
		
		// 如果小于等于0说明都是主键
		if(setSb.length() <= 0){
			
			return;
		}
		
		setSb.delete(setSb.length() - 1, setSb.length());

		// 组装where
		StringBuffer whereSb = new StringBuffer();

		for (int i = 0; i < stringArr.length; i++) {

			whereSb.append(stringArr[i] + " = " + "#{" + stringArr[i].toLowerCase() + "}").append(" and ");

		}

		whereSb.delete(whereSb.length() - 5, whereSb.length());

		StringBuffer overParm = new StringBuffer();
		overParm.append("UPDATE " + tablename + " SET " + setSb.toString() + " WHERE "+whereSb.toString());

		sb.append("\t" + "@Update(\"" + overParm.toString() + "\")" + "\r\n");

		sb.append("\tint updateByKey(" + initcap(tablename) + " " + tablename + ");\r\n");

	}

	/**
	 * @Author linshiq
	 *         <p>
	 *         <li>2018年11月15日-下午4:13:47</li>
	 *         <li>功能说明:补充基础删除方法</li>
	 *         </p>
	 * @param sb
	 */
	private void processDelete(StringBuffer sb, String[] colnames, String[] colTypes, int[] colSizes,
			String[] stringArr) {

		StringBuffer inParm = new StringBuffer();// 组装入参
		
		StringBuffer deleteSql = new StringBuffer();
		deleteSql.append("DELETE FROM " + tablename + " WHERE ");
		for (int i = 0; i < stringArr.length; i++) {

			for (int j = 0; j < colnames.length; j++) {

				if (colnames[j].equalsIgnoreCase(stringArr[i])) {
					inParm.append(sqlType2JavaType(colTypes[i]) + " " + stringArr[i] + ",");
					deleteSql.append(stringArr[i] + " = " + "#{" + stringArr[i] + "}").append(" and "); // 组装主键限制
				}

			}

		}
	
		deleteSql.delete(deleteSql.length() - 5, deleteSql.length());
		
		sb.append("\t" + "@Delete(\"" + deleteSql.toString() + "\")" + "\r\n");
		inParm.delete(inParm.length() - 1, inParm.length());
		sb.append("\t" + "int deleteByKey(" + inParm.toString() + ");\r\n");
		//System.out.println(parm);

	}

	/**
	 * 功能:将输入字符串的首字母改成大写
	 * 
	 * @param str
	 * @return
	 */
	private String initcap(String str) {

		char[] ch = str.toCharArray();
		if (ch[0] >= 'a' && ch[0] <= 'z') {
			ch[0] = (char) (ch[0] - 32);
		}

		// for (int i = 1; i < ch.length; i++) {
		//
		// if (ch[i] >= 'a' && ch[i] <= 'z') {
		// ch[i] = (char) (ch[i] + 32);
		// }
		// }

		return new String(ch);
	}

	/**
	 * 功能:获得列的数据类型
	 * 
	 * @param sqlType
	 * @return
	 */
	private String sqlType2JavaType(String sqlType) {
		// System.out.println(sqlType);
		if (sqlType.equalsIgnoreCase("bit")) {
			return "boolean";
		} else if (sqlType.equalsIgnoreCase("tinyint")) {
			return "byte";
		} else if (sqlType.equalsIgnoreCase("smallint")) {
			return "short";
		} else if (sqlType.equalsIgnoreCase("int")) {
			return "int";
		} else if (sqlType.equalsIgnoreCase("bigint")) {
			return "long";
		} else if (sqlType.equalsIgnoreCase("float")) {
			return "float";
		} else if (sqlType.equalsIgnoreCase("numeric") || sqlType.equalsIgnoreCase("real")) {
			return "double";
		} else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("money")
				|| sqlType.equalsIgnoreCase("smallmoney")) {
			return "BigDecimal";
		} else if (sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")
				|| sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar")
				|| sqlType.equalsIgnoreCase("text")) {
			return "String";
		} else if (sqlType.equalsIgnoreCase("datetime") || sqlType.equalsIgnoreCase("timestamp")) {
			return "Date";
		} else if (sqlType.equalsIgnoreCase("image")) {
			return "Blod";
		} else {

			String clone = sqlType.toLowerCase();

			if (clone.contains("decimal")) {
				return "BigDecimal";
			}

			return null;
		}

	}

	/**
	 * 出口 TODO
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		new GenBaseSQLMysql();

	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值