基於springboot+bootstrap+mysql+redis搭建一套完整的許可權架構【五】【編寫基礎程式碼快速生成工具】
首先我們在我們的com.csdn包底下我們新建一個codeUtil包如下所示:
首先我們新建一個我們的列的模型(ColumnModel.java)如下:
/** * 列模型 */ public class ColumnModel { private boolean isPrimaryKey; private boolean isAutoIncrement; private String columnName; private String dataType; private String typeName; private String columnClassName; private String fieldName; private String fieldType; private int columnSize; private String columnDef; private String remarks; public boolean isPrimaryKey() { return isPrimaryKey; } public void setPrimaryKey(boolean isPrimaryKey) { this.isPrimaryKey = isPrimaryKey; } public boolean isAutoIncrement() { return isAutoIncrement; } public void setAutoIncrement(boolean isAutoIncrement) { this.isAutoIncrement = isAutoIncrement; } public String getColumnName() { return columnName; } public void setColumnName(String columnName) { this.columnName = columnName; } public String getDataType() { return dataType; } public void setDataType(String dataType) { this.dataType = dataType; } public String getTypeName() { return typeName; } public void setTypeName(String typeName) { this.typeName = typeName; } public int getColumnSize() { return columnSize; } public void setColumnSize(int columnSize) { this.columnSize = columnSize; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } @Override public String toString() { return "ColumnModel [columnName=" + columnName + ", dataType=" + dataType + ", typeName=" + typeName + ", columnClassName=" + columnClassName + ", fieldName=" + fieldName + ", fieldType=" + fieldType + ", columnSize=" + columnSize + ", columnDef=" + columnDef + ", remarks=" + remarks + "]"; } public String getColumnDef() { return columnDef; } public void setColumnDef(String columnDef) { this.columnDef = columnDef; } public String getColumnClassName() { return columnClassName; } public void setColumnClassName(String columnClassName) { this.columnClassName = columnClassName; } public String getFieldName() { return fieldName; } public void setFieldName(String fieldName) { this.fieldName = fieldName; } public String getFieldType() { return fieldType; } public void setFieldType(String fieldType) { this.fieldType = fieldType; } }
接著我們建立我們的表結構的模型(TableModel.java)如下:
/**
* 表結構封裝
* */
public class TableModel {
//表名
private String tableName;
//主鍵列
private List<ColumnModel> primaryKeyColumns;
//列
private List<ColumnModel> columns;
//需要引入包
private Set<String> imports;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
}
public List<ColumnModel> getPrimaryKeyColumns() {
return primaryKeyColumns;
}
public void setPrimaryKeyColumns(List<ColumnModel> primaryKeyColumns) {
this.primaryKeyColumns = primaryKeyColumns;
}
public List<ColumnModel> getColumns() {
return columns;
}
public void setColumns(List<ColumnModel> columns) {
this.columns = columns;
}
public Set<String> getImports() {
return imports;
}
public void setImports(Set<String> imports) {
this.imports = imports;
}
}
在我們新建JdbcUtil.java資料庫連線操作類的時候我們首先新建一個(GenCodeUtil.java)我們的操作主類,JdbcUtil的程式碼如下:
public class JdbcUtil {
private static String properties_file_uri = null;
public static Properties configs;
public static void setPropertiesURL(String uri){
properties_file_uri = uri;
}
/**
* 獲取連線
* @return
*/
public static Connection getConnection(){
try {
configs = new Properties();
if(StringUtils.isEmpty(properties_file_uri)){
properties_file_uri = "/genericCoder.properties";
}
String path = GenCodeUtil.class.getResource("/").getPath();
InputStream in = new FileInputStream(new File(path+properties_file_uri));
configs.load(in);
Class.forName(configs.getProperty("spring.datasource.driverClassName"));
Properties properties = new Properties();
properties.put("user", configs.getProperty("spring.datasource.username"));
properties.put("password", configs.getProperty("spring.datasource.password"));
properties.put("remarksReporting","true");//想要獲取資料庫結構中的註釋,這個值是重點
return DriverManager.getConnection(configs.getProperty("spring.datasource.url"), properties);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 獲取表結構
* @param tableName
* @return
*/
public static TableModel getTableStructure(String tableName){
List<ColumnModel> columnModelList = new ArrayList<ColumnModel>();
List<ColumnModel> primaryKeyColumns = new ArrayList<ColumnModel>();
Set<String> imports = new HashSet<String>();
try {
//TODO 表相關
//ResultSet tableSet = metaData.getTables(null, "%",tableName,new String[]{"TABLE"});
//TODO 欄位相關
DatabaseMetaData dbMeta = getConnection().getMetaData();
List<String> primaryKeys = getPrimaryKeys(dbMeta, tableName);
ResultSet columnSet = dbMeta.getColumns(null,"%",tableName,"%");
ColumnModel columnModel = null;
while(columnSet.next()){
columnModel = new ColumnModel();
columnModel.setColumnName(columnSet.getString("COLUMN_NAME"));
columnModel.setColumnSize(columnSet.getInt("COLUMN_SIZE"));
columnModel.setDataType(columnSet.getString("DATA_TYPE"));
columnModel.setRemarks(columnSet.getString("REMARKS"));
columnModel.setTypeName(columnSet.getString("TYPE_NAME"));
columnModel.setAutoIncrement(columnSet.getBoolean("IS_AUTOINCREMENT"));
columnModel.setPrimaryKey(justicPrimaryKey(columnModel.getColumnName(), primaryKeys));
//String columnClassName = ColumnTypeEnum.getColumnTypeEnumByDBType(columnModel.getTypeName());
String columnClassName = sqlType2JavaType(columnModel.getTypeName());
String imp = getImportByJavaType(columnClassName);
if(StringUtils.isNotEmpty(imp))
imports.add(imp);
String fieldName = getFieldName(columnModel.getColumnName());
String fieldType = null;
try{
if(StringUtils.isNotEmpty(columnClassName))
fieldType = Class.forName(columnClassName).getSimpleName();
else
throw new RuntimeException();
}
catch(ClassNotFoundException e){
fieldType = columnClassName;
}
columnModel.setFieldName(fieldName);
columnModel.setColumnClassName(columnClassName);
columnModel.setFieldType(fieldType);
columnModelList.add(columnModel);
if(columnModel.isPrimaryKey())
primaryKeyColumns.add(columnModel);
//System.out.println(columnModel.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
TableModel table = new TableModel();
table.setColumns(columnModelList);
table.setPrimaryKeyColumns(primaryKeyColumns);
table.setImports(imports);
table.setTableName(tableName);
return table;
}
/**
* 將資料庫欄位轉換成bean屬性
* @param columnName
* @return
*/
private static String getFieldName(String columnName) {
char[] columnCharArr = columnName.toCharArray();
StringBuffer sb = new StringBuffer();
int ad = -1;
for (int i = 0; i < columnCharArr.length; i++) {
char cur = columnCharArr[i];
if(cur=='_'){
ad = i;
}else{
if((ad+1)==i&&ad!=-1){
sb.append(Character.toUpperCase(cur));
}else{
sb.append(cur);
}
ad=-1;
}
}
return sb.toString();
}
/**
* 獲取表主鍵
* @throws SQLException
* */
private static List<String> getPrimaryKeys(DatabaseMetaData dbMeta, String tableName) throws SQLException{
ResultSet pkRSet = dbMeta.getPrimaryKeys(null, null, tableName);
List<String> primaryKyes = new ArrayList<String>();
while(pkRSet.next()){
primaryKyes.add(pkRSet.getObject("COLUMN_NAME").toString());
}
return primaryKyes;
}
/**
* 判斷列是否為主鍵列
* */
private static boolean justicPrimaryKey(String columnName, List<String> primaryKyes){
for(String key : primaryKyes)
if(key.equals(columnName))
return true;
return false;
}
/**
* 功能:獲得列的資料型別
* @param sqlType
* @return
*/
private static 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")){
return "int";
}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")){
return "Date";
}else if(sqlType.equalsIgnoreCase("image")){
return "Blod";
}else if(sqlType.equalsIgnoreCase("timestamp")){
return "Timestamp";
}
return "String";
}
/**
* 根據資料型別獲取需要引入的類
* */
private static String getImportByJavaType(String javaType){
switch(javaType){
case "Date": return "java.util.Date";
case "Timestamp": return "java.sql.Timestamp";
case "Blod": return "java.sql.Blod";
}
return null;
}
}
接著我們在生成我們的各層程式碼的工具類(MyBatisUtil.java)如下:
/**
* mybatis配置檔案生成功能
* */
public class MyBatisUtil {
/**
* 從表結構中去生成mybatis配置
* @param table
* @param namespace
* @param beanName
* @param queryModelName
* @return
*/
public static String genMapperConfig(TableModel table,String namespace, String beanName, String queryModelName){
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
sb.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n");
sb.append("<mapper namespace=\""+namespace+"\">\n");
//生成resultMap
String resultMap = beanName.split("\\.")[(beanName.split("\\.").length-1)]+"Map";
sb.append(genResultMap(beanName, resultMap, table));
//生成Get SQL
sb.append(genGETSQL(beanName, resultMap, table));
//生成插入SQL
String dbType = "oracle";
String driver = JdbcUtil.configs.getProperty("spring.datasource.driverClassName");
if(driver.toLowerCase().indexOf("mysql")>0){
dbType = "";
}
if(dbType.equalsIgnoreCase("oracle")){
sb.append(genSAVESQLOfORCL(beanName, table));
}
else{
sb.append(genSAVESQL(beanName, table));
}
//生成修改SQL
sb.append(genUPDATESQL(beanName, table));
//生成刪除SQL
sb.append(genDELETESQL(beanName, table));
if(StringUtils.isNotEmpty(queryModelName)){
//生成分頁查詢
if(dbType.equalsIgnoreCase("oracle")){
sb.append(genFINDBYPAGESQLOfORCL(queryModelName, resultMap, table));
}
else{
sb.append(genFINDBYPAGESQL(queryModelName, resultMap, table));
}
//統計
sb.append(genCOUNTSQL(queryModelName, table));
//查詢
sb.append(genQUERYSQL(queryModelName, resultMap, table));
}
sb.append("</mapper>");
return sb.toString();
}
private static String genResultMap(String beanName, String resultMap, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
List<ColumnModel> primaryKeys = table.getPrimaryKeyColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<resultMap type=\""+beanName+"\" id=\""+resultMap+"\">\n");
if(primaryKeys.size()==1){
ColumnModel primaryKey = primaryKeys.get(0);
sb.append("\t\t<id property=\""+primaryKey.getFieldName()+"\" column=\""+primaryKey.getColumnName()+"\"/>\n");
for(ColumnModel cm : columnModelList){
if(!cm.isPrimaryKey())
sb.append("\t\t<result property=\""+cm.getFieldName()+"\" column=\""+cm.getColumnName()+"\"/>\n");
}
}
else
for(ColumnModel cm : columnModelList){
sb.append("\t\t<result property=\""+cm.getFieldName()+"\" column=\""+cm.getColumnName()+"\"/>\n");
}
sb.append("\t</resultMap>\n\n");
return sb.toString();
}
private static String genGETSQL(String beanName, String resultMap, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
List<ColumnModel> primaryKeys = table.getPrimaryKeyColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--根據主鍵獲取物件-->\n");
sb.append("\t<select id=\"get\" parameterType=\""+beanName+"\" resultMap=\""+resultMap+"\">\n\t\tSELECT ");
sb.append(getSelectFields(columnModelList));
sb.append(" FROM "+table.getTableName() +" \n\t\tWHERE ");
for(int i=0; i<primaryKeys.size(); i++){
ColumnModel pk = primaryKeys.get(i);
sb.append(pk.getColumnName()+"=#{"+pk.getFieldName()+"}");
if(i<primaryKeys.size()-1){
sb.append(" and ");
}
}
sb.append("\n\t</select>\n\n");
return sb.toString();
}
private static String genSAVESQL(String beanName, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
List<ColumnModel> primaryKeys = table.getPrimaryKeyColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--儲存-->\n");
if(primaryKeys.size()==1 && primaryKeys.get(0).isAutoIncrement()){
//自增主鍵,並返回主鍵值
sb.append("\t<insert id=\"save\" parameterType=\""+beanName+"\" useGeneratedKeys=\"true\" keyProperty=\""+primaryKeys.get(0).getFieldName()+"\">\n");
sb.append("\t\tINSERT INTO "+table.getTableName()+"(");
for(ColumnModel cm : columnModelList){
if(!cm.isPrimaryKey()|| !cm.isAutoIncrement()){
sb.append(cm.getColumnName());
sb.append(",");
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(")\n\t\tVALUES(");
for(ColumnModel cm : columnModelList){
if(!cm.isPrimaryKey()|| !cm.isAutoIncrement()){
sb.append("#{"+cm.getFieldName()+"}");
sb.append(",");
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(")\n");
sb.append("\t</insert>\n\n");
}
else{
sb.append("\t<insert id=\"save\" parameterType=\""+beanName+"\">\n");
sb.append("\t\tINSERT INTO "+table.getTableName()+"(");
for(ColumnModel cm : columnModelList){
if(!cm.isAutoIncrement()){
sb.append(cm.getColumnName());
sb.append(",");
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(")\n\t\tVALUES(");
for(ColumnModel cm : columnModelList){
if(!cm.isAutoIncrement()){
sb.append("#{"+cm.getFieldName()+"}");
sb.append(",");
}
}
sb.deleteCharAt(sb.length()-1);
sb.append(")\n");
sb.append("\t</insert>\n\n");
}
return sb.toString();
}
private static String genSAVESQLOfORCL(String beanName, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
List<ColumnModel> primaryKeys = table.getPrimaryKeyColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--儲存-->\n");
sb.append("\t<insert id=\"save\" parameterType=\""+beanName+"\">\n");
if(primaryKeys.size()==1 && primaryKeys.get(0).isAutoIncrement()){
String sequence = null;
if(table.getTableName().toLowerCase().indexOf("t_")==0){
sequence = table.getTableName().toLowerCase().replace("t_", "s_");
}
else{
sequence = "s_"+table.getTableName().toLowerCase();
}
//自增主鍵,並返回主鍵值
sb.append("\t\t<selectKey keyProperty=\""+primaryKeys.get(0).getFieldName()+"\" resultType=\"int\" order=\"BEFORE\">select "+sequence+".nextval from dual</selectKey>\n");
}
sb.append("\t\tINSERT INTO "+table.getTableName()+"(");
for(ColumnModel cm : columnModelList){
sb.append(cm.getColumnName());
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")\n\t\tVALUES(");
for(ColumnModel cm : columnModelList){
sb.append("#{"+cm.getFieldName()+"}");
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")\n");
sb.append("\t</insert>\n\n");
return sb.toString();
}
private static String genUPDATESQL(String beanName, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
List<ColumnModel> primaryKeys = table.getPrimaryKeyColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--修改-->\n");
sb.append("\t<update id=\"update\" parameterType=\""+beanName+"\">\n");
sb.append("\t\tUPDATE "+table.getTableName()+" SET ");
for(ColumnModel cm : columnModelList){
if(!cm.isPrimaryKey()){
sb.append(cm.getColumnName()+"=#{"+cm.getFieldName()+"}");
sb.append(",");
}
}
sb.deleteCharAt(sb.length()-1);
sb.append("\n\t\tWHERE ");
for(int i=0; i<primaryKeys.size(); i++){
ColumnModel pk = primaryKeys.get(i);
sb.append(pk.getColumnName()+"=#{"+pk.getFieldName()+"}");
if(i<primaryKeys.size()-1){
sb.append(" and ");
}
}
sb.append("\n\t</update>\n\n");
return sb.toString();
}
private static String genDELETESQL(String beanName, TableModel table){
List<ColumnModel> primaryKeys = table.getPrimaryKeyColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--刪除-->\n");
sb.append("\t<delete id=\"delete\" parameterType=\""+beanName+"\">\n");
sb.append("\t\t DELETE FROM "+table.getTableName()+" WHERE ");
for(int i=0; i<primaryKeys.size(); i++){
ColumnModel pk = primaryKeys.get(i);
sb.append(pk.getColumnName()+"=#{"+pk.getFieldName()+"}");
if(i<primaryKeys.size()-1){
sb.append(" and ");
}
}
sb.append("\n\t</delete>\n\n");
return sb.toString();
}
private static String genFINDBYPAGESQL(String queryModelName, String resultMap, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--分頁查詢-->\n");
sb.append("\t<select id=\"findByPage\" parameterType=\""+queryModelName+"\" resultMap=\""+resultMap+"\">");
sb.append("\n\t\tSELECT ");
for(ColumnModel cm : columnModelList){
sb.append(cm.getColumnName());
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(" FROM "+table.getTableName());
sb.append("\n\t\tWHERE 1=1");
for(ColumnModel cm :getQueryFields(table)){
sb.append("\n\t\t<if test=\""+cm.getFieldName()+"!=null and "+cm.getFieldName()+"!='' \" >");
sb.append("\n\t\tAND "+cm.getColumnName()+"=#{"+cm.getFieldName()+"}");
sb.append("\n\t\t</if>");
}
sb.append("\n\t\t<if test=\"sort!= null\">\n\t\torder by ${sort} ${order}\n\t\t</if>");
sb.append("\n\t\tlimit #{offset},#{limit}");
sb.append("\n\t</select>\n\n");
return sb.toString();
}
private static String genFINDBYPAGESQLOfORCL(String queryModelName, String resultMap, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--分頁查詢-->\n");
sb.append("\t<select id=\"findByPage\" parameterType=\""+queryModelName+"\" resultMap=\""+resultMap+"\">");
sb.append("\n\t\tSELECT * FROM (SELECT t.*, ROWNUM rn FROM (");
sb.append("\n\t\tSELECT ");
for(ColumnModel cm : columnModelList){
sb.append(cm.getColumnName());
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(" FROM "+table.getTableName());
sb.append("\n\t\tWHERE 1=1");
for(ColumnModel cm :getQueryFields(table)){
sb.append("\n\t\t<if test=\""+cm.getFieldName()+"!=null and "+cm.getFieldName()+"!='' \">");
sb.append("\n\t\tAND "+cm.getColumnName()+"=#{"+cm.getFieldName()+"}");
sb.append("\n\t\t</if>");
}
sb.append("\n\t\t<if test=\"sort!= null\">\n\t\torder by ${sort} ${order}\n\t\t</if>");
sb.append("\n\t\t)t) WHERE rn>#{offset} AND (#{offset}+#{limit})>=rn");
sb.append("\n\t</select>\n\n");
return sb.toString();
}
private static String genCOUNTSQL(String queryModelName, TableModel table){
StringBuffer sb = new StringBuffer();
sb.append("\t<!--統計-->\n");
sb.append("\t<select id=\"count\" parameterType=\""+queryModelName+"\" resultType=\"int\">");
sb.append("\n\t\tSELECT count(*) FROM "+table.getTableName());
sb.append("\n\t\tWHERE 1=1");
for(ColumnModel cm : getQueryFields(table)){
sb.append("\n\t\t<if test=\""+cm.getFieldName()+"!=null and "+cm.getFieldName()+"!='' \">");
sb.append("\n\t\tAND "+cm.getColumnName()+"=#{"+cm.getFieldName()+"}");
sb.append("\n\t\t</if>");
}
sb.append("\n\t</select>\n\n");
return sb.toString();
}
private static String genQUERYSQL(String queryModelName, String resultMap, TableModel table){
List<ColumnModel> columnModelList = table.getColumns();
StringBuffer sb = new StringBuffer();
sb.append("\t<!--查詢-->\n");
sb.append("\t<select id=\"query\" parameterType=\""+queryModelName+"\" resultMap=\""+resultMap+"\">\n");
sb.append("\t\tSELECT ");
for(ColumnModel cm : columnModelList){
sb.append(cm.getColumnName());
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(" FROM "+table.getTableName());
sb.append("\n\t\tWHERE 1=1");
for(ColumnModel cm : getQueryFields(table)){
sb.append("\n\t\t<if test=\""+cm.getFieldName()+"!=null and "+cm.getFieldName()+"!='' \">");
sb.append("\n\t\tAND "+cm.getColumnName()+"=#{"+cm.getFieldName()+"}");
sb.append("\n\t\t</if>");
}
sb.append("\n\t\t<if test=\"sort!= null\">\n\t\torder by ${sort} ${order}\n\t\t</if>");
sb.append("\n\t</select>\n");
return sb.toString();
}
public static String getSelectFields(List<ColumnModel> columnModelList){
StringBuffer sb = new StringBuffer();
for(ColumnModel cm : columnModelList){
sb.append(cm.getColumnName());
sb.append(",");
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
/**
* 獲取查詢欄位
* */
public static List<ColumnModel> getQueryFields(TableModel table){
if(table.getPrimaryKeyColumns().size()==1 && table.getPrimaryKeyColumns().get(0).isAutoIncrement()){
List<ColumnModel> columns = new ArrayList<ColumnModel>();
for(ColumnModel cm : table.getColumns()){
if(!cm.isPrimaryKey())
columns.add(cm);
}
return columns;
}
return table.getColumns();
}
}
最後我們編寫我們主入口生成工具類(GenCodeUtil.java)如下所示:
/*
* 類描述:
* @auther linzf
* @create 2017/12/8 0008
*/
public class GenCodeUtil {
/**
* 從表結構中去生成javabean
* @param author
* @param table
* @param beanName
* @param packagePath
* @return
*/
private static String genJavaBeanFromTableStructure(String author, TableModel table,String beanName, String packagePath){
StringBuffer sb = new StringBuffer();
if(StringUtils.isNotEmpty(packagePath)){
sb.append("package "+packagePath+";\n");
}
for(String imp : table.getImports()){
sb.append("import "+imp+";\n");
}
sb.append("\n");
sb.append("/**\n *@author "+author+"\n **/\n");
List<ColumnModel> columnModelList = table.getColumns();
try {
sb.append("public class "+toFirstCharUpCase(beanName)+" {\r\n");
for (ColumnModel columnModel : columnModelList) {
if(StringUtils.isNotBlank(columnModel.getRemarks())){
sb.append(" //"+columnModel.getRemarks()+" \r\n");
}
sb.append(" private "+columnModel.getFieldType()+" "+columnModel.getFieldName()+";\r\n");
}
sb.append("\r\n");
//get set
for (ColumnModel columnModel : columnModelList) {
sb.append(
"\tpublic "+columnModel.getColumnClassName()+" get"+toFirstCharUpCase((String) columnModel.getFieldName())+"() {\r\n" +
"\t\treturn "+columnModel.getFieldName()+";\r\n" +
"\t}\r\n" +
"\r\n" +
"\tpublic void set"+toFirstCharUpCase((String) columnModel.getFieldName())+"("+columnModel.getColumnClassName()+" "+columnModel.getFieldName()+") {\r\n" +
"\t\tthis."+columnModel.getFieldName()+" = "+columnModel.getFieldName()+";\r\n" +
"\t}\r\n\r\n");
}
sb.append("}\r\n");
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 從表結構中去生成查詢實體類
* @param author
* @param table
* @param beanName
* @param extendsBasePackage
* @param packagePath
* @return
*/
private static String genQueryModelFromTableStructure(String author, TableModel table,String beanName, String extendsBasePackage, String packagePath){
StringBuffer sb = new StringBuffer();
if(StringUtils.isNotEmpty(packagePath)){
sb.append("package "+packagePath+";\n\n");
}
sb.append("import "+extendsBasePackage+".entity.QueryBase;\n\n");
sb.append("/**\n *@author "+author+"\n **/\n");
try {
sb.append("public class "+toFirstCharUpCase(beanName)+" extends QueryBase {\r\n");
List<ColumnModel> columns = getQueryFields(table);
for (ColumnModel columnModel : columns) {
if(StringUtils.isNotBlank(columnModel.getRemarks())){
sb.append(" //"+columnModel.getRemarks()+" \r\n");
}
String qFieldType = getQueryModelFieldType(columnModel.getFieldType());
sb.append(" private "+qFieldType+" "+columnModel.getFieldName()+";\r\n");
}
sb.append("\r\n");
//get set
for (ColumnModel columnModel : columns) {
String qFieldType = getQueryModelFieldType(columnModel.getFieldType());
sb.append(
"\tpublic "+qFieldType+" get"+toFirstCharUpCase((String) columnModel.getFieldName())+"() {\r\n" +
"\t\treturn "+columnModel.getFieldName()+";\r\n" +
"\t}\r\n" +
"\r\n" +
"\tpublic void set"+toFirstCharUpCase((String) columnModel.getFieldName())+"("+qFieldType+" "+columnModel.getFieldName()+") {\r\n" +
"\t\tthis."+columnModel.getFieldName()+" = "+columnModel.getFieldName()+";\r\n" +
"\t}\r\n\r\n");
}
sb.append("}\r\n");
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 生成Dao
* */
private static String genDao(String author, String packagePath, String beanName, String queryModelName,String extendsBasePackage){
StringBuffer sb = new StringBuffer();
if(StringUtils.isNotEmpty(packagePath)){
sb.append("package "+packagePath+";\n\n");
}
String businessPackage = packagePath.substring(0, packagePath.lastIndexOf("."));
String basePackage = businessPackage.substring(0, businessPackage.lastIndexOf("."));
sb.append("import "+extendsBasePackage+".dao.GenericDao;\n\n");
sb.append("import "+businessPackage+".entity."+beanName+";\n");
sb.append("import "+businessPackage+".entity."+queryModelName+";\n\n");
sb.append("/**\n *@author "+author+"\n **/\n");
sb.append("public interface "+beanName+"Dao extends GenericDao<"+beanName+", "+queryModelName+"> {\r\n");
sb.append("\n\t\n}");
return sb.toString();
}
/**
* 生成Service
* */
private static String genService(String author, String packagePath, String beanName, String queryModelName,String extendsBasePackage){
StringBuffer sb = new StringBuffer();
if(StringUtils.isNotEmpty(packagePath)){
sb.append("package "+packagePath+";\n\n");
}
String businessPackage = packagePath.substring(0, packagePath.lastIndexOf("."));
String basePackage = businessPackage.substring(0, businessPackage.lastIndexOf("."));
sb.append("import org.springframework.beans.factory.annotation.Autowired;\n");
sb.append("import org.springframework.stereotype.Service;\n\n");
sb.append("import org.springframework.transaction.annotation.Transactional;\n\n");
sb.append("import "+extendsBasePackage+".service.GenericService;\n");
sb.append("import "+basePackage+".common.base.dao.GenericDao;\n\n");
sb.append("import "+businessPackage+".entity."+beanName+";\n");
sb.append("import "+businessPackage+".entity."+queryModelName+";\n");
sb.append("import "+businessPackage+".dao."+beanName+"Dao;\n\n");
sb.append("/**\n *@author "+author+"\n **/\n");
sb.append("@Service(\""+toFirstCharLowerCase(beanName)+"Service\")\n");
sb.append("@Transactional(rollbackFor={IllegalArgumentException.class})\n");
sb.append("public class "+beanName+"Service extends GenericService<"+beanName+", "+queryModelName+"> {\r\n");
sb.append("\
到此我們已經開發完成了我們的程式碼快速生成工具類,接著大家在GenCodeUtil.java中我們直接執行我們的genFiles("作者","資料庫表名","基礎工具包路徑【com.csdn.demo.common.base】",”java程式碼生成的路徑“,"mybatis程式碼生成的路徑","實體名","查詢實體名","讀取的配置檔案的名字");我們此處則開始試著快速生成一份我們的程式碼,首先我們在PDM中設計一張字典表如下所示:
接著我們在資料執行生成我們的dict表的資料庫字典指令碼,然後我們在GenCodeUtil的main方法中執行我們的快速生成程式碼如下:
執行好該程式碼我們會發現我們的工程中已經多出來了以下的程式碼:
通過上圖我們可以很明顯的看到我們的程式碼已經生成成功了,那麼接下來我們重新載入下我們的專案我們訪問下我們的swagger2介面我們會發現我們的生成的程式碼已經生效了:
到此處我們很明顯的發現我們生成的程式碼已經生效了,那麼以後我們每當有一個新的模組的開發那麼我們只要設計好資料庫,後續我們就可以快速的生成程式碼,大大簡化我們的開發工作,下一章將講解如何整合bootsrap。
本章的程式碼GitHub地址:https://github.com/185594-5-27/csdndemo/tree/base-druid-swagger-tool-two
上一篇文章地址:基於springboot+bootstrap+mysql+redis搭建一套完整的許可權架構【四】【編寫基礎開發工具】
下一篇文章地址:基於springboot+bootstrap+mysql+redis搭建一套完整的許可權架構【六】【引入bootstrap前端框架】