基于spring MVC 和 MyBatis 泛型的代码生成模板

简单说明

       这块代码生成工具是我抽空的时候方便自己使用而编写的,并不适合其他框架,这里由于项目原有,我并没有上传泛型部份的代码,这套代码是基于 spring Mvc + MyBatis 的,好了 废话不多说看图

我在这里主要贴出 java 部份的代码,源代码我已经上传 在文章底部我会贴出下载地址链接

TableHandle.java(主要处理表字段 与 字段对应java类型的转换)

package web.engine.handle;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.sun.istack.internal.logging.Logger;

import web.engine.dbmanager.DBManager;

/**
 * 数据库表处理
 * @author lx
 *
 */
public class TableHandle {

	
	/**
	 * 查询表结构语句(表名,表字段,数据类型,是否为主键,字段备注)
	 */
	private static String column_sql = "select  TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_KEY,COLUMN_COMMENT from information_schema.columns where table_schema ='xxxx' ";
	
	private static String table_sql = "select table_comment from information_schema.tables  where table_schema = 'xxxx' ";
	
	private static Logger logger = Logger.getLogger(TableHandle.class); 
	
	/**
	 * 根据表名获取字段
	 * @param tableName
	 * @throws SQLException 
	 */
	public static List<TableColumn> getColumns(String tableName) {
		logger.info("获取【"+ tableName +"】字段信息");
		List<TableColumn> list = new ArrayList<TableColumn>();
		DBManager manager = new DBManager();
		Connection conn = manager.getConnection();
		Statement statement = null;
        ResultSet rs = null;
		String sql = column_sql + "and table_name = '" + tableName + "'";
		try {
			statement = conn.createStatement();
			rs = statement.executeQuery(sql);
			while(rs.next()){
				TableColumn c = new TableColumn();
			    c.setColumnComment(rs.getString("COLUMN_COMMENT"));
			    c.setColumnKey(rs.getString("COLUMN_KEY"));
			    c.setColumnName(rs.getString("COLUMN_NAME"));
			    c.setDataType(rs.getString("DATA_TYPE"));
			    c.setTableName(rs.getString("TABLE_NAME"));
			    c.setEntityName(StringUtil.fomatJavaName(rs.getString("COLUMN_NAME")));
			    c.setJavaType(getJavaType(rs.getString("DATA_TYPE")));
			    c.setJavaTypeObj(getJavaTypeObj(rs.getString("DATA_TYPE")));
			    list.add(c);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			manager.closeConn(rs,statement,conn);
		}
		return list;
	}
	
	/**
	 * 根据表名获取字段
	 * @param tableName
	 * @throws SQLException 
	 */
	public static String getTableComment(String tableName) {
		logger.info("获取【"+ tableName +"】备注信息");
		String tableComment = "";
		DBManager manager = new DBManager();
		Connection conn = manager.getConnection();
		Statement statement = null;
        ResultSet rs = null;
        String sql = table_sql + "and table_name = '" + tableName + "'";
		try {
			statement = conn.createStatement();
			rs = statement.executeQuery(sql);
			while(rs.next()){
				tableComment = rs.getString("table_comment");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			manager.closeConn(rs,statement,conn);
		}
		return tableComment;
	}
	
	
//	public static void main(String[] args) {
//		TableHandle handle = new TableHandle();
//		String tables[] = new String[]{"sys_user","sys_role"};
//		for(int i = 0; i < tables.length; i++){
//			System.out.println(handle.getTableComment(tables[i]));
//		}
//	}
	
	private static String getJavaType(String dataType){
		String javaType = "String";
		switch (dataType) {
		case "datetime":
			javaType =  "Date";
			break;
		case "date":
			javaType =  "Date";
			break;
		case "int":
			javaType =  "Integer";
			break;
		case "timestamp":
			javaType =  "Date";
			break;
		case "time":
			javaType =  "Date";
			break;
		case "year":
			javaType =  "Date";
			break;
		case "bigint":
			javaType =  "Integer";
			break;
		case "decimal":
			javaType =  "Double";
			break;
		case "double":
			javaType =  "Double";
			break;
		case "integer":
			javaType =  "Integer";
			break;
		case "float":
			javaType =  "Double";
			break;
		case "tinyint":
			javaType =  "Integer";
			break;
		case "smallint":
			javaType =  "Integer";
			break;
		default:
			javaType =  "String";
			break;
		}
		return javaType;
	}
	
	private static String getJavaTypeObj(String dataType){
		String javaType = "java.lang.String";
		switch (dataType) {
		case "datetime":
			javaType =  "java.util.Date";
			break;
		case "date":
			javaType =  "java.util.Date";
			break;
		case "int":
			javaType =  "java.lang.Integer";
			break;
		case "timestamp":
			javaType =  "java.util.Date";
			break;
		case "time":
			javaType =  "java.util.Date";
			break;
		case "year":
			javaType =  "java.util.Date";
			break;
		case "bigint":
			javaType =  "java.lang.Integer";
			break;
		case "decimal":
			javaType =  "java.lang.Double";
			break;
		case "double":
			javaType =  "java.lang.Double";
			break;
		case "integer":
			javaType =  "java.lang.Integer";
			break;
		case "float":
			javaType =  "java.lang.Double";
			break;
		case "tinyint":
			javaType =  "java.lang.Integer";
			break;
		case "smallint":
			javaType =  "java.lang.Integer";
			break;
		default:
			javaType =  "java.lang.String";
			break;
		}
		return javaType;
	}
}

TemplateHandle.java(调用模板 生成java文件)

package web.engine.handle;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import com.sun.istack.internal.logging.Logger;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import web.engine.template.TemplateUtil;

public class TemplateHandle {

	private static Logger logger = Logger.getLogger(TemplateHandle.class); 
	
	public static Map<String, String> templateMap = new HashMap<String, String>();
	
	static{
		templateMap.put("dao", "dao.ftl");
		templateMap.put("daoImpl", "daoImpl.ftl");
		templateMap.put("daoXml", "daoXml.ftl");
		templateMap.put("service", "service.ftl");
		templateMap.put("serviceImpl", "serviceImpl.ftl");
		templateMap.put("action", "action.ftl");
		templateMap.put("model", "model.ftl");
	}
	
	/**
	 * 选择模板文件
	 * @param key 模板KEY
	 * @param code ssh,ssm 之类的
	 * @return 模板
	 */
	public static Template checkTemplate(String key,String code){
		Configuration cfg = new Configuration();
        cfg.setDefaultEncoding("utf-8");
        String templates = TemplateUtil.class.getClassLoader().getResource("template").getPath();
        Template temp = null;
        try {
        	//设置模板文件路径
			cfg.setDirectoryForTemplateLoading(new File(templates));
			temp = cfg.getTemplate(code + templateMap.get(key));
		} catch (IOException e) {
			e.printStackTrace();
		}
        return temp;
	}
	
	/**
	 * 生成文件
	 * @param entityName 处理后的表名称(sysUser)
	 * @param path 	文件创建绝对路径
	 * @param key	模板KEY[dao,daoXml,daoImpl,service,serviceImpl,action,model] only on
	 * @param temp	模板
	 * @param map	数据
	 */
	public static void createFiles(String entityName,String path,String key,Template temp,Map<String,Object> map){
		
        try {
        	File docFiles = new File(path + getFiles(key));
			if(!docFiles.exists()){
				docFiles.mkdirs();
			}
			File docFile = new File(path + getFiles(key) + getFileName(entityName,key));
			logger.info("创建:" + path + getFiles(key) + getFileName(entityName,key));
			Writer docout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
			//输出文件
			temp.process(map, docout);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 获取生成文件的名称
	 * @param entityName 处理后的表名称(sysUser)
	 * @param key 模板KEY
	 * @return 文件名称
	 */
	private static String getFileName(String entityName,String key){
		String fileName = "";
		switch (key) {
		case "dao":
			fileName = StringUtil.fomatEntityName(entityName) + "Dao.java";
			break;
		case "daoXml":
			fileName = StringUtil.fomatEntityName(entityName) + "Mapper.xml";
			break;
		case "daoImpl":
			fileName = StringUtil.fomatEntityName(entityName) + "DaoImpl.java";
			break;
		case "service":
			fileName ="I" + StringUtil.fomatEntityName(entityName) + "Service.java";
			break;
		case "serviceImpl":
			fileName = StringUtil.fomatEntityName(entityName) + "ServiceImpl.java";
			break;
		case "action":
			fileName = StringUtil.fomatEntityName(entityName) + "Action.java";
			break;
		case "model":
			fileName = StringUtil.fomatEntityName(entityName) + ".java";
			break;
		default:
			break;
		}
		return fileName;
	}
	
	/**
	 * 获取生成文件的名称
	 * @param entityName 处理后的表名称(sysUser)
	 * @param key 模板KEY
	 * @return 文件名称
	 */
	private static String getFiles(String key){
		String fileName = "";
		switch (key) {
		case "dao":
			fileName ="mapper//";
			break;
		case "daoXml":
			fileName ="mapper//xml//";
			break;
		case "daoImpl":
			fileName ="mapper//impl//";
			break;
		case "service":
			fileName ="service//";
			break;
		case "serviceImpl":
			fileName ="service//impl//";
			break;
		case "action":
			fileName ="controller//";
			break;
		case "model":
			fileName ="model//vo//";
			break;
		default:
			break;
		}
		return fileName;
	}

	
}

TemplateInvoke.java(调用处理类)

package web.engine.handle;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.sun.istack.internal.logging.Logger;

import freemarker.template.Template;
/**
 * 调用处理类
 * @author lx
 *
 */
public class TemplateInvoke {
	
	private static Logger logger = Logger.getLogger(TemplateInvoke.class); 
	
	/**
	 * 需要生成那些文件
	 */
	private static final String key[] = new String[]{"daoXml","action","dao","daoImpl","model","service","serviceImpl"};

	public static void invoke(String path,String page,String tableName){
		logger.info("*************************开始创建对象*************************");
		List<TableColumn> list = TableHandle.getColumns(tableName);
		Set<String> imps = new HashSet<String>();
		TableColumn pkColumn = null;
		for(TableColumn c : list){
			if(!"String".equals(c.getJavaType())){
				imps.add(c.getJavaTypeObj());
			}
			if(!StringUtil.isEmpty(c.getColumnKey()) && "PRI".equals(c.getColumnKey())){
				pkColumn = c;
			}
		}
		String tableComment = TableHandle.getTableComment(tableName);
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("daoPackage", page);
		map.put("tableName", tableName);
		map.put("tableComment", tableComment);
		map.put("entityName", StringUtil.fomatJavaName(tableName));
		map.put("columns", list);
		map.put("pkColumn", pkColumn);
		map.put("imps", imps);
		for(int i = 0; i < key.length; i++){
			Template template = TemplateHandle.checkTemplate(key[i], "");
			TemplateHandle.createFiles(StringUtil.fomatJavaName(tableName), StringUtil.fomatPage(path, page), key[i], template, map);
		}
		logger.info("*************************创建对象结束*************************");
	}
	
}

模板文件这里我就不做过多的解释,具体内容请下载源代码,自己去了解

源代码下载地址:https://download.csdn.net/download/qq_35244741/10842369

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值