1、添加依赖
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/tools.jar</systemPath>
</dependency>
1、 工具类
public class GenerateSqlMapperUtil {
public static void main(String[] args) throws IOException {
generateSqlMapper(SysDictType.class, "t_sys_dict_type");
}
public static void generateSqlMapper(Class obj,String tableName) throws IOException{
Field[] fields = obj.getDeclaredFields();
String cameCaseColumn = null;
String underScoreCaseColumn = null;
StringBuilder sql = new StringBuilder();
if(tableName==null||tableName.equals("")){
tableName = obj.getName().substring(obj.getName().lastIndexOf(".")+1);
}
String javabeanPath = getJavabeanPath(obj.getSimpleName());
System.out.println(javabeanPath);
Doclet doclet = new Doclet(javabeanPath);
Map<String, String> commentMap = doclet.resolveClassComment();
sql.append("DROP TABLE IF EXISTS ").append(tableName).append(";\r\n");
sql.append("CREATE TABLE ").append(tableName).append("( \r\n");
boolean firstId = true;
for(Field f : fields){
cameCaseColumn = f.getName();
String fieldComment = commentMap.get(cameCaseColumn);
underScoreCaseColumn = cameCaseColumn;
for(int i = 0; i < cameCaseColumn.length(); i++){
if(Character.isUpperCase(cameCaseColumn.charAt(i))) {
underScoreCaseColumn = cameCaseColumn.substring(0, i) + '_' + cameCaseColumn.substring(i, i + 1).toLowerCase()
+ cameCaseColumn.substring(i + 1, cameCaseColumn.length());
}
}
sql.append(" "+underScoreCaseColumn).append(" ");
fieldTypeToSql(sql,f.getType(),firstId,fieldComment);
if(firstId){
sql.append(" PRIMARY KEY AUTO_INCREMENT COMMENT '主键'");
firstId = false;
}
sql.append(",\n");
}
sql.delete(sql.lastIndexOf(","), sql.length())
.append("\n)ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=1 COMMENT '"+commentMap.get("classComment")+"';\r\n");
System.out.println(sql);
}
private static void fieldTypeToSql(StringBuilder sql,Class<?> fileType,Boolean firstId,String fieldComment){
if(firstId){
sql.append("INT ");
return;
}
if(fileType.equals(String.class)){
sql.append("VARCHAR(64) NOT NULL DEFAULT '' COMMENT '"+fieldComment+"' ");
}
else if(fileType.equals(Integer.class) ){
sql.append("INT(7) NOT NULL DEFAULT 0 COMMENT '"+fieldComment+"' ");
}
else if ( fileType.equals(Long.class)){
sql.append("BIGINT(11) NOT NULL DEFAULT 0 COMMENT '"+fieldComment+"' ");
}
else if(fileType.equals(Short.class)){
sql.append("SMALLINT(4) NOT NULL DEFAULT 0 COMMENT '"+fieldComment+"' ");
}
else if(fileType.equals(Double.class) || fileType.equals(Float.class) ||fileType.equals(BigDecimal.class) ){
sql.append(" DECIMAL(8,2) NOT NULL DEFAULT '0.00' COMMENT '"+fieldComment+"' ");
}
else if(fileType.equals(Date.class) || fileType.equals(LocalDateTime.class)){
sql.append(" DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '"+fieldComment+"'");
}
}
private static String getJavabeanPath(String javaName){
String path = "G:\\gitee-workspace\\my-code-gennertor\\src\\main\\java\\cn\\vipthink\\icode\\table_create\\entity\\";
return path+javaName+".java";
}
}
FildEntry封装
public class FildEntry {
private String fName;
private String fType;
private String fExplain;
public FildEntry(String fName, String fType, String fExplain) {
super();
this.fName = fName;
this.fType = fType;
this.fExplain = fExplain;
}
@Override
public String toString() {
return "Entry{" +
"fName='" + fName + '\'' +
", fType='" + fType + '\'' +
", fExplain='" + fExplain + '\'' +
'}';
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getfType() {
return fType;
}
public void setfType(String fType) {
this.fType = fType;
}
public String getfExplain() {
return fExplain;
}
public void setfExplain(String fExplain) {
this.fExplain = fExplain;
}
}
2、ModelClassDocVO
public class ModelClassDocVO {
private String modelTableName;
private String modelClassName;
private String modelCommentText;
private List<FildEntry> fildEntryList;
public String getModelTableName() {
return modelTableName;
}
public void setModelTableName(String modelTableName) {
this.modelTableName = modelTableName;
}
public String getModelClassName() {
return modelClassName;
}
public void setModelClassName(String modelClassName) {
this.modelClassName = modelClassName;
}
public String getModelCommentText() {
return modelCommentText;
}
public void setModelCommentText(String modelCommentText) {
this.modelCommentText = modelCommentText;
}
public List<FildEntry> getFildEntryList() {
return fildEntryList;
}
public void setFildEntryList(List<FildEntry> fildEntryList) {
this.fildEntryList = fildEntryList;
}
@Override
public String toString() {
return "ModelClassDocVO{" +
"modelClassName='" + modelClassName + '\'' +
", modelCommentText='" + modelCommentText + '\'' +
", fildEntryList=" + fildEntryList +
'}';
}
}
3、方言
import cn.hutool.core.util.ReflectUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.RootDoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
public class Doclet {
public static Logger logger = LoggerFactory.getLogger(Doclet.class);
private static RootDoc rootDoc;
private String javaBeanFilePath;
public static boolean start(RootDoc root) {
rootDoc = root;
return true;
}
public Doclet(String javaBeanFilePath) {
this.javaBeanFilePath = javaBeanFilePath;
}
public ModelClassDocVO exec() {
ModelClassDocVO modelClassDocVO = new ModelClassDocVO();
com.sun.tools.javadoc.Main.execute(new String[]{"-doclet", Doclet.class.getName(), "-docletpath",
Doclet.class.getResource("/").getPath(), "-encoding", "utf-8", javaBeanFilePath});
ClassDoc[] classes = rootDoc.classes();
if (classes == null || classes.length == 0) {
logger.warn(javaBeanFilePath + " 无ClassDoc信息");
return modelClassDocVO;
}
List<FildEntry> entrys = Lists.newArrayList();
ClassDoc classDoc = classes[0];
modelClassDocVO.setModelClassName(classDoc.name());
Object documentation = ReflectUtil.getFieldValue(classDoc, "documentation");
String classComment = null != documentation? documentation.toString() : "";
String spitStr = "\n";
for (String msg : classComment.split(spitStr)) {
if (!msg.trim().startsWith("@") && msg.trim().length() > 0) {
modelClassDocVO.setModelCommentText(msg);
break;
}
}
FieldDoc[] fields = classDoc.fields(false);
for (FieldDoc field : fields) {
entrys.add(new FildEntry(field.name(), field.type().typeName(), field.commentText()));
}
modelClassDocVO.setFildEntryList(entrys);
return modelClassDocVO;
}
public Map<String,String> getCommentMap(ModelClassDocVO modelClassDocVO){
Map<String,String> commentMap = Maps.newHashMap();
String modelCommentText = modelClassDocVO.getModelCommentText();
commentMap.put("classComment",modelCommentText);
List<FildEntry> fildEntryList = modelClassDocVO.getFildEntryList();
for(FildEntry entry:fildEntryList){
commentMap.put(entry.getfName(),entry.getfExplain());
}
return commentMap;
}
public Map<String,String> resolveClassComment(){
Doclet doclet = new Doclet(javaBeanFilePath);
ModelClassDocVO modelClassDocVO = doclet.exec();
return getCommentMap(modelClassDocVO);
}
}