package com.markMe1024.common.util.mysql;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
* @Description 数据库表映射实体类
* @Author From Internet
* @Date 2018年12月6日
*/
public class Mysql2EntityGenerator {
// 数据库信息
private static final String URL ="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
private static final String NAME = "root";
private static final String PASSWORD = "";
// 指定实体生成所在包的路径
private String packageOutPath;
// 表名
private String tablename;
// 列名数组
private String[] colNames;
// 列类型数组
private String[] colTypes;
// 列名大小数组
private int[] colSizes;
// 是否需要导入包java.util.*
private boolean iUtil = false;
// 是否需要导入包java.sql.*
private boolean iSql = false;
// 是否需要导入uuid生成id的注解
private boolean iIdVarchar = false;
// 是否需要导入生成自增id的注解
private boolean iIdInt = false;
// 是否需要导入date、time时间类型字段注解
private boolean iTime = false;
// 是否需要导入datetime时间类型字段注解
private boolean iDateTime = false;
/**
* @Description main
* @Author From Internet
* @Date 2018年12月6日
* @Note 使用时替换创建对象时的第二个第三个参数,分别是表名和实体类目标路径
*/
public static void main(String[] args) {
try {
Connection connection = DriverManager.getConnection(URL,NAME,PASSWORD);
new Mysql2EntityGenerator(connection,"t_health_physical", "com.dhcc.mhealth.entity.healthy.files.test");
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* @Description 构造函数
* @Author From Internet
* @Date 2018年12月6日
*/
public Mysql2EntityGenerator(Connection connection,String tableName, String packageOutPath){
// 1.初始化成员变量
this.tablename = tableName;
this.packageOutPath = packageOutPath;
try {
// 2.查询table信息
String sql = "select * from " + tablename;
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSetMetaData resultSetMetaData = preparedStatement.getMetaData();
int size = resultSetMetaData.getColumnCount();
colNames = new String[size];
colTypes = new String[size];
colSizes = new int[size];
for (int i = 0; i < size; i++) {
colNames[i] = resultSetMetaData.getColumnName(i + 1);
colTypes[i] = resultSetMetaData.getColumnTypeName(i + 1);
colSizes[i] = resultSetMetaData.getColumnDisplaySize(i + 1);
if (colTypes[i].equalsIgnoreCase("datetime")) {
iUtil = true;
}
if (colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")) {
iSql = true;
}
if (colTypes[i].equalsIgnoreCase("date") || colTypes[i].equalsIgnoreCase("time")) {
iTime = true;
}
if (colTypes[i].equalsIgnoreCase("datetime")) {
iDateTime = true;
}
if ("id".equals(colNames[i]) && "varchar".equalsIgnoreCase(colTypes[i])) {
iIdVarchar = true;
}
if ("id".equals(colNames[i]) && "int".equalsIgnoreCase(colTypes[i])) {
iIdInt = true;
}
}
// 3.生成实体类主体代码
String content = parse(colNames, colTypes, colSizes);
// 4.
try {
File directory = new File("");
String outputPath = directory.getAbsolutePath() + "\\src\\main\\java\\" + this.packageOutPath.replace(".", "\\") + "\\"+parseName(tablename) + ".java";
// 4.1.创建包
String packagePath = directory.getAbsolutePath() + "\\src\\main\\java\\" + this.packageOutPath.replace(".", "\\");
File file = new File(packagePath);
Boolean mkdirSuccess = file.mkdirs();
System.out.println("创建实体类所在包成功? " + mkdirSuccess);
FileWriter fileWriter = new FileWriter(outputPath);
PrintWriter printWriter = new PrintWriter(fileWriter);
printWriter.println(content);
printWriter.flush();
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
}
}
/**
* @Description 生成实体类主体代码
* @Author From Internet
* @Date 2018年12月6日
*/
private String parse(String[] colNames, String[] colTypes, int[] colSizes) {
StringBuffer entityStr = new StringBuffer();
// 1.package声明
entityStr.append("package " + this.packageOutPath + ";\r\n");
entityStr.append("\r\n");
// 2.import部分
if (iUtil) {
entityStr.append("import java.util.Date;\r\n");
entityStr.append("\r\n");
}
if (iSql) {
entityStr.append("import java.sql.*;\r\n");
entityStr.append("\r\n");
}
if (iIdVarchar) {
entityStr.append("import org.hibernate.annotations.GenericGenerator;\r\n");
entityStr.append("\r\n");
}
if (iTime) {
entityStr.append("import com.fasterxml.jackson.annotation.JsonFormat;\r\n");
entityStr.append("\r\n");
entityStr.append("import javax.persistence.Temporal;\r\n");
entityStr.append("import javax.persistence.TemporalType;\r\n");
}
if (iDateTime) {
entityStr.append("import javax.persistence.Temporal;\r\n");
entityStr.append("import javax.persistence.TemporalType;\r\n");
}
if (iIdVarchar) {
entityStr.append("import javax.persistence.GeneratedValue;\r\n");
}
if (iIdInt) {
entityStr.append("import javax.persistence.GeneratedValue;\r\n");
entityStr.append("import javax.persistence.GenerationType;\r\n");
}
entityStr.append("import javax.persistence.Entity;\r\n");
entityStr.append("import javax.persistence.Table;\r\n");
entityStr.append("import javax.persistence.Column;\r\n");
entityStr.append("import javax.persistence.Id;\r\n");
entityStr.append("\r\n");
entityStr.append("import java.io.Serializable;\r\n");
entityStr.append("\r\n");
// 3.实体部分
entityStr.append("@Entity\r\n");
entityStr.append("@Table(name = \""+tablename+"\")\r\n");
entityStr.append("public class " + parseName(tablename) + " implements Serializable {\r\n");
// 属性
processAllAttrs(entityStr);
// get set方法
processAllMethod(entityStr);
entityStr.append("}\r\n");
return entityStr.toString();
}
/**
* @Description 数据库表名转驼峰(首字母大写)
* @Author From Internet
* @Date 2018年12月6日
*/
private String parseName(String name){
StringBuffer result = new StringBuffer();
if (name != null && !"".equals(name)) {
String[] array = name.split("_");
if (array.length > 0){
for (String tmp : array) {
if ("t".equalsIgnoreCase(tmp)) {
continue;
}
result.append(initCap(tmp));
}
}
}
return result.toString();
}
/**
* @Description 将输入字符串的首字母改成大写
* @Author From Internet
* @Date 2018年12月6日
*/
private String initCap(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z'){
ch[0] = (char)(ch[0] - 32);
}
return new String(ch);
}
/**
* @Description 生成所有属性
* @Author From Internet
* @Date 2018年12月6日
*/
private void processAllAttrs(StringBuffer entityStr) {
for (int i = 0; i < colNames.length; i++) {
// 属性名转为驼峰命名(首字母小写)
String column = parseNameNotFirst(colNames[i]);
entityStr.append("\r\n");
if ("id".equals(column)) {
if ("varchar".equalsIgnoreCase(colTypes[i])) {
entityStr.append("\t@Id\r\n");
entityStr.append("\t@GenericGenerator(name = \"idGenerator\", strategy = \"uuid\")\r\n");
entityStr.append("\t@GeneratedValue(generator = \"idGenerator\")\r\n");
entityStr.append("\t@Column(name = \"" + colNames[i] + "\")\r\n");
}else {
entityStr.append("\t@Id\r\n");
entityStr.append("\t@Column(name = \"" + colNames[i] + "\")\r\n");
entityStr.append("\t@GeneratedValue(strategy = GenerationType.IDENTITY)\r\n");
}
}else {
if ("datetime".equalsIgnoreCase(colTypes[i])) {
entityStr.append("\t@Temporal(TemporalType.TIMESTAMP)\r\n");
}
if ("date".equalsIgnoreCase(colTypes[i])) {
entityStr.append("\t@JsonFormat(pattern=\"yyyy-MM-dd\", timezone=\"GMT+8\")\r\n");
}
if ("time".equalsIgnoreCase(colTypes[i])) {
entityStr.append("\t@JsonFormat(pattern=\"HH:mm:ss\", timezone=\"GMT+8\"))\r\n");
}
entityStr.append("\t@Column(name = \"" + colNames[i] + "\")\r\n");
}
entityStr.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + column + ";\r\n");
}
}
/**
* @Description 属性名转为驼峰命名(首字母小写)
* @Author From Internet
* @Date 2018年12月6日
*/
private String parseNameNotFirst(String name){
StringBuffer result = new StringBuffer();
if (name != null && !"".equals(name)) {
String[] array = name.split("_");
if (array.length > 0){
for (int i = 0; i < array.length; i++) {
if (i > 0) {
result.append(initCap(array[i]));
}else{
result.append(array[i]);
}
}
}
}
return result.toString();
}
/**
* @Description 生成get、set方法
* @Author From Internet
* @Date 2018年12月6日
*/
private void processAllMethod(StringBuffer entityStr) {
for (int i = 0; i < colNames.length; i++) {
entityStr.append("\r\n");
entityStr.append("\tpublic void set" + parseName(colNames[i]) + "(" + sqlType2JavaType(colTypes[i]) + " " + parseNameNotFirst(colNames[i]) + "){\r\n");
entityStr.append("\t\tthis." + parseNameNotFirst(colNames[i]) + " = " + parseNameNotFirst(colNames[i]) + ";\r\n");
entityStr.append("\t}\r\n");
entityStr.append("\r\n");
entityStr.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + parseName(colNames[i]) + "(){\r\n");
entityStr.append("\t\treturn " + parseNameNotFirst(colNames[i]) + ";\r\n");
entityStr.append("\t}\r\n");
}
}
/**
* @Description sql数据类型转java数据类型
* @Author From Internet
* @Date 2018年12月6日
*/
private String sqlType2JavaType(String 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") || sqlType.equalsIgnoreCase("INT UNSIGNED")) {
return "Integer";
}else if (sqlType.equalsIgnoreCase("bigint")) {
return "Long";
}else if (sqlType.equalsIgnoreCase("float")) {
return "Float";
}else if (sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric") || sqlType.equalsIgnoreCase("real")
|| sqlType.equalsIgnoreCase("money") || sqlType.equalsIgnoreCase("smallmoney")){
return "Double";
}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("date") || sqlType.equalsIgnoreCase("time")){
return "Date";
}else if (sqlType.equalsIgnoreCase("image")){
return "Blod";
}
return null;
}
}
数据库表映射实体类
猜你喜欢
转载自blog.csdn.net/weixin_34850743/article/details/86363657
今日推荐
周排行