package com.song;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 自动生成MyBatis的实体类、实体映射XML文件、Mapper
*
* @author WYS
* @date 2014-11-8
* @version v1.0
*/
@SuppressWarnings ( "hiding" )
public class EntityUtil {
/**
**********************************使用前必读*******************
**
** 使用前请将moduleName更改为自己模块的名称即可(一般情况下与数据库名一致),其他无须改动。
**
***********************************************************
*/
private final String type_char = "char" ;
private final String type_date = "date" ;
private final String type_timestamp = "timestamp" ;
private final String type_int = "int" ;
private final String type_bigint = "bigint" ;
private final String type_text = "text" ;
private final String type_bit = "bit" ;
private final String type_decimal = "decimal" ;
private final String type_blob = "blob" ;
private final String moduleName = "group" ; // 对应模块名称(根据自己模块做相应调整!!!务必修改^_^)
private final String bean_path = "d:/entity_bean" ;
private final String mapper_path = "d:/entity_mapper" ;
private final String xml_path = "d:/entity_mapper/xml" ;
private final String bean_package = "net.yunxiaoyuan." + moduleName + ".entity" ;
private final String mapper_package = "net.yunxiaoyuan." + moduleName + ".mapper" ;
private final String driverName = "com.mysql.jdbc.Driver" ;
private final String user = "test" ;
private final String password = "test" ;
private final String url = "jdbc:mysql://192.168.1.253:3306/" + moduleName + "?characterEncoding=utf8" ;
private String tableName = null ;
private String beanName = null ;
private String mapperName = null ;
private Connection conn = null ;
private void init() throws ClassNotFoundException, SQLException {
Class.forName(driverName);
conn = DriverManager.getConnection(url, user, password);
}
/**
* 获取所有的表
*
* @return
* @throws SQLException
*/
private List<String> getTables() throws SQLException {
List<String> tables = new ArrayList<String>();
PreparedStatement pstate = conn.prepareStatement( "show tables" );
ResultSet results = pstate.executeQuery();
while ( results.next() ) {
String tableName = results.getString( 1 );
// if ( tableName.toLowerCase().startsWith("yy_") ) {
tables.add(tableName);
// }
}
return tables;
}
private void processTable( String table ) {
StringBuffer sb = new StringBuffer(table.length());
String tableNew = table.toLowerCase();
String[] tables = tableNew.split( "_" );
String temp = null ;
for ( int i = 1 ; i < tables.length ; i++ ) {
temp = tables[i].trim();
sb.append(temp.substring( 0 , 1 ).toUpperCase()).append(temp.substring( 1 ));
}
beanName = sb.toString();
mapperName = beanName + "Mapper" ;
}
private String processType( String type ) {
if ( type.indexOf(type_char) > - 1 ) {
return "String" ;
} else if ( type.indexOf(type_bigint) > - 1 ) {
return "Long" ;
} else if ( type.indexOf(type_int) > - 1 ) {
return "Integer" ;
} else if ( type.indexOf(type_date) > - 1 ) {
return "java.util.Date" ;
} else if ( type.indexOf(type_text) > - 1 ) {
return "String" ;
} else if ( type.indexOf(type_timestamp) > - 1 ) {
return "java.util.Date" ;
} else if ( type.indexOf(type_bit) > - 1 ) {
return "Boolean" ;
} else if ( type.indexOf(type_decimal) > - 1 ) {
return "java.math.BigDecimal" ;
} else if ( type.indexOf(type_blob) > - 1 ) {
return "byte[]" ;
}
return null ;
}
private String processField( String field ) {
StringBuffer sb = new StringBuffer(field.length());
//field = field.toLowerCase();
String[] fields = field.split( "_" );
String temp = null ;
sb.append(fields[ 0 ]);
for ( int i = 1 ; i < fields.length ; i++ ) {
temp = fields[i].trim();
sb.append(temp.substring( 0 , 1 ).toUpperCase()).append(temp.substring( 1 ));
}
return sb.toString();
}
/**
* 将实体类名首字母改为小写
*
* @param beanName
* @return
*/
private String processResultMapId( String beanName ) {
return beanName.substring( 0 , 1 ).toLowerCase() + beanName.substring( 1 );
}
/**
* 构建类上面的注释
*
* @param bw
* @param text
* @return
* @throws IOException
*/
private BufferedWriter buildClassComment( BufferedWriter bw, String text ) throws IOException {
bw.newLine();
bw.newLine();
bw.write( "/**" );
bw.newLine();
bw.write( " * " );
bw.newLine();
bw.write( " * " + text);
bw.newLine();
bw.write( " * " );
bw.newLine();
bw.write( " **/" );
return bw;
}
/**
* 构建方法上面的注释
*
* @param bw
* @param text
* @return
* @throws IOException
*/
private BufferedWriter buildMethodComment( BufferedWriter bw, String text ) throws IOException {
bw.newLine();
bw.write( "\t/**" );
bw.newLine();
bw.write( "\t * " );
bw.newLine();
bw.write( "\t * " + text);
bw.newLine();
bw.write( "\t * " );
bw.newLine();
bw.write( "\t **/" );
return bw;
}
/**
* 生成实体类
*
* @param columns
* @param types
* @param comments
* @throws IOException
*/
private void buildEntityBean( List<String> columns, List<String> types, List<String> comments, String tableComment )
throws IOException {
File folder = new File(bean_path);
if ( !folder.exists() ) {
folder.mkdir();
}
File beanFile = new File(bean_path, beanName + ".java" );
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(beanFile)));
bw.write( "package " + bean_package + ";" );
bw.newLine();
bw.write( "import java.io.Serializable;" );
bw.newLine();
//bw.write("import lombok.Data;");
// bw.write("import javax.persistence.Entity;");
bw = buildClassComment(bw, tableComment);
bw.newLine();
bw.write( "@SuppressWarnings(\"serial\")" );
bw.newLine();
// bw.write("@Entity");
//bw.write("@Data");
//bw.newLine();
bw.write( "public class " + beanName + " implements Serializable {" );
bw.newLine();
bw.newLine();
int size = columns.size();
for ( int i = 0 ; i < size ; i++ ) {
bw.write( "\t/**" + comments.get(i) + "**/" );
bw.newLine();
bw.write( "\tprivate " + processType(types.get(i)) + " " + processField(columns.get(i)) + ";" );
bw.newLine();
bw.newLine();
}
bw.newLine();
// 生成get 和 set方法
String tempField = null ;
String _tempField = null ;
String tempType = null ;
for ( int i = 0 ; i < size ; i++ ) {
tempType = processType(types.get(i));
_tempField = processField(columns.get(i));
tempField = _tempField.substring( 0 , 1 ).toUpperCase() + _tempField.substring( 1 );
bw.newLine();
// bw.write("\tpublic void set" + tempField + "(" + tempType + " _" + _tempField + "){");
bw.write( "\tpublic void set" + tempField + "(" + tempType + " " + _tempField + "){" );
bw.newLine();
// bw.write("\t\tthis." + _tempField + "=_" + _tempField + ";");
bw.write( "\t\tthis." + _tempField + " = " + _tempField + ";" );
bw.newLine();
bw.write( "\t}" );
bw.newLine();
bw.newLine();
bw.write( "\tpublic " + tempType + " get" + tempField + "(){" );
bw.newLine();
bw.write( "\t\treturn this." + _tempField + ";" );
bw.newLine();
bw.write( "\t}" );
bw.newLine();
}
bw.newLine();
bw.write( "}" );
bw.newLine();
bw.flush();
bw.close();
}
/**
* 构建Mapper文件
*
* @throws IOException
*/
private void buildMapper() throws IOException {
File folder = new File(mapper_path);
if ( !folder.exists() ) {
folder.mkdirs();
}
File mapperFile = new File(mapper_path, mapperName + ".java" );
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(mapperFile), "utf-8" ));
bw.write( "package " + mapper_package + ";" );
bw.newLine();
bw.newLine();
bw.write( "import " + bean_package + "." + beanName + ";" );
bw.newLine();
bw.write( "import org.apache.ibatis.annotations.Param;" );
bw = buildClassComment(bw, mapperName + "数据库操作接口类" );
bw.newLine();
bw.newLine();
// bw.write("public interface " + mapperName + " extends " + mapper_extends + "<" + beanName + "> {");
bw.write( "public interface " + mapperName + "{" );
bw.newLine();
bw.newLine();
// ----------定义Mapper中的方法Begin----------
bw = buildMethodComment(bw, "查询(根据主键ID查询)" );
bw.newLine();
bw.write( "\t" + beanName + " selectByPrimaryKey ( @Param(\"id\") Long id );" );
bw.newLine();
bw = buildMethodComment(bw, "删除(根据主键ID删除)" );
bw.newLine();
bw.write( "\t" + "int deleteByPrimaryKey ( @Param(\"id\") Long id );" );
bw.newLine();
bw = buildMethodComment(bw, "添加" );
bw.newLine();
bw.write( "\t" + "int insert( " + beanName + " record );" );
bw.newLine();
bw = buildMethodComment(bw, "添加 (匹配有值的字段)" );
bw.newLine();
bw.write( "\t" + "int insertSelective( " + beanName + " record );" );
bw.newLine();
bw = buildMethodComment(bw, "修改 (匹配有值的字段)" );
bw.newLine();
bw.write( "\t" + "int updateByPrimaryKeySelective( " + beanName + " record );" );
bw.newLine();
bw = buildMethodComment(bw, "修改(根据主键ID修改)" );
bw.newLine();
bw.write( "\t" + "int updateByPrimaryKey ( " + beanName + " record );" );
bw.newLine();
// ----------定义Mapper中的方法End----------
bw.newLine();
bw.write( "}" );
bw.flush();
bw.close();
}
/**
* 构建实体类映射XML文件
*
* @param columns
* @param types
* @param comments
* @throws IOException
*/
private void buildMapperXml( List<String> columns, List<String> types, List<String> comments ) throws IOException {
File folder = new File(xml_path);
if ( !folder.exists() ) {
folder.mkdirs();
}
File mapperXmlFile = new File(xml_path, mapperName + ".xml" );
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(mapperXmlFile)));
bw.write( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" );
bw.newLine();
bw.write( "<!DOCTYPE mapper PUBLIC \"-////DTD Mapper 3.0//EN\" " );
bw.newLine();
bw.write( " \"http:///dtd/mybatis-3-mapper.dtd\">" );
bw.newLine();
bw.write( "<mapper namespace=\"" + mapper_package + "." + mapperName + "\">" );
bw.newLine();
bw.newLine();
/*bw.write("\t<!--实体映射-->");
bw.newLine();
bw.write("\t<resultMap id=\"" + this.processResultMapId(beanName) + "ResultMap\" type=\"" + beanName + "\">");
bw.newLine();
bw.write("\t\t<!--" + comments.get(0) + "-->");
bw.newLine();
bw.write("\t\t<id property=\"" + this.processField(columns.get(0)) + "\" column=\"" + columns.get(0) + "\" />");
bw.newLine();
int size = columns.size();
for ( int i = 1 ; i < size ; i++ ) {
bw.write("\t\t<!--" + comments.get(i) + "-->");
bw.newLine();
bw.write("\t\t<result property=\""
+ this.processField(columns.get(i)) + "\" column=\"" + columns.get(i) + "\" />");
bw.newLine();
}
bw.write("\t</resultMap>");
bw.newLine();
bw.newLine();
bw.newLine();*/
// 下面开始写SqlMapper中的方法
// this.outputSqlMapperMethod(bw, columns, types);
buildSQL(bw, columns, types);
bw.write( "</mapper>" );
bw.flush();
bw.close();
}
private void buildSQL( BufferedWriter bw, List<String> columns, List<String> types ) throws IOException {
int size = columns.size();
// 通用结果列
bw.write( "\t<!-- 通用查询结果列-->" );
bw.newLine();
bw.write( "\t<sql id=\"Base_Column_List\">" );
bw.newLine();
bw.write( "\t\t id," );
for ( int i = 1 ; i < size ; i++ ) {
bw.write( "\t" + columns.get(i));
if ( i != size - 1 ) {
bw.write( "," );
}
}
bw.newLine();
bw.write( "\t</sql>" );
bw.newLine();
bw.newLine();
// 查询(根据主键ID查询)
bw.write( "\t<!-- 查询(根据主键ID查询) -->" );
bw.newLine();
bw.write( "\t<select id=\"selectByPrimaryKey\" resultType=\""
+ processResultMapId(beanName) + "\" parameterType=\"java.lang." + processType(types.get( 0 )) + "\">" );
bw.newLine();
bw.write( "\t\t SELECT" );
bw.newLine();
bw.write( "\t\t <include refid=\"Base_Column_List\" />" );
bw.newLine();
bw.write( "\t\t FROM " + tableName);
bw.newLine();
bw.write( "\t\t WHERE " + columns.get( 0 ) + " = #{" + processField(columns.get( 0 )) + "}" );
bw.newLine();
bw.write( "\t</select>" );
bw.newLine();
bw.newLine();
// 查询完
// 删除(根据主键ID删除)
bw.write( "\t<!--删除:根据主键ID删除-->" );
bw.newLine();
bw.write( "\t<delete id=\"deleteByPrimaryKey\" parameterType=\"java.lang." + processType(types.get( 0 )) + "\">" );
bw.newLine();
bw.write( "\t\t DELETE FROM " + tableName);
bw.newLine();
bw.write( "\t\t WHERE " + columns.get( 0 ) + " = #{" + processField(columns.get( 0 )) + "}" );
bw.newLine();
bw.write( "\t</delete>" );
bw.newLine();
bw.newLine();
// 删除完
// 添加insert方法
bw.write( "\t<!-- 添加 -->" );
bw.newLine();
bw.write( "\t<insert id=\"insert\" parameterType=\"" + processResultMapId(beanName) + "\">" );
bw.newLine();
bw.write( "\t\t INSERT INTO " + tableName);
bw.newLine();
bw.write( " \t\t(" );
for ( int i = 0 ; i < size ; i++ ) {
bw.write(columns.get(i));
if ( i != size - 1 ) {
bw.write( "," );
}
}
bw.write( ") " );
bw.newLine();
bw.write( "\t\t VALUES " );
bw.newLine();
bw.write( " \t\t(" );
for ( int i = 0 ; i < size ; i++ ) {
bw.write( "#{" + processField(columns.get(i)) + "}" );
if ( i != size - 1 ) {
bw.write( "," );
}
}
bw.write( ") " );
bw.newLine();
bw.write( "\t</insert>" );
bw.newLine();
bw.newLine();
// 添加insert完
//--------------- insert方法(匹配有值的字段)
bw.write( "\t<!-- 添加 (匹配有值的字段)-->" );
bw.newLine();
bw.write( "\t<insert id=\"insertSelective\" parameterType=\"" + processResultMapId(beanName) + "\">" );
bw.newLine();
bw.write( "\t\t INSERT INTO " + tableName);
bw.newLine();
bw.write( "\t\t <trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\" >" );
bw.newLine();
String tempField = null ;
for ( int i = 0 ; i < size ; i++ ) {
tempField = processField(columns.get(i));
bw.write( "\t\t\t<if test=\"" + tempField + " != null\">" );
bw.newLine();
bw.write( "\t\t\t\t " + columns.get(i) + "," );
bw.newLine();
bw.write( "\t\t\t</if>" );
bw.newLine();
}
bw.newLine();
bw.write( "\t\t </trim>" );
bw.newLine();
bw.write( "\t\t <trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\" >" );
bw.newLine();
tempField = null ;
for ( int i = 0 ; i < size ; i++ ) {
tempField = processField(columns.get(i));
bw.write( "\t\t\t<if test=\"" + tempField + "!=null\">" );
bw.newLine();
bw.write( "\t\t\t\t #{" + tempField + "}," );
bw.newLine();
bw.write( "\t\t\t</if>" );
bw.newLine();
}
bw.write( "\t\t </trim>" );
bw.newLine();
bw.write( "\t</insert>" );
bw.newLine();
bw.newLine();
//--------------- 完毕
// 修改update方法
bw.write( "\t<!-- 修 改-->" );
bw.newLine();
bw.write( "\t<update id=\"updateByPrimaryKeySelective\" parameterType=\"" + processResultMapId(beanName) + "\">" );
bw.newLine();
bw.write( "\t\t UPDATE " + tableName);
bw.newLine();
bw.write( " \t\t <set> " );
bw.newLine();
tempField = null ;
for ( int i = 1 ; i < size ; i++ ) {
tempField = processField(columns.get(i));
bw.write( "\t\t\t<if test=\"" + tempField + " != null\">" );
bw.newLine();
bw.write( "\t\t\t\t " + columns.get(i) + " = #{" + tempField + "}," );
bw.newLine();
bw.write( "\t\t\t</if>" );
bw.newLine();
}
bw.newLine();
bw.write( " \t\t </set>" );
bw.newLine();
bw.write( "\t\t WHERE " + columns.get( 0 ) + " = #{" + processField(columns.get( 0 )) + "}" );
bw.newLine();
bw.write( "\t</update>" );
bw.newLine();
bw.newLine();
// update方法完毕
// ----- 修改(匹配有值的字段)
bw.write( "\t<!-- 修 改-->" );
bw.newLine();
bw.write( "\t<update id=\"updateByPrimaryKey\" parameterType=\"" + processResultMapId(beanName) + "\">" );
bw.newLine();
bw.write( "\t\t UPDATE " + tableName);
bw.newLine();
bw.write( "\t\t SET " );
bw.newLine();
tempField = null ;
for ( int i = 1 ; i < size ; i++ ) {
tempField = processField(columns.get(i));
bw.write( "\t\t\t " + columns.get(i) + " = #{" + tempField + "}" );
if ( i != size - 1 ) {
bw.write( "," );
}
bw.newLine();
}
bw.write( "\t\t WHERE " + columns.get( 0 ) + " = #{" + processField(columns.get( 0 )) + "}" );
bw.newLine();
bw.write( "\t</update>" );
bw.newLine();
bw.newLine();
}
/**
* 获取所有的数据库表注释
*
* @return
* @throws SQLException
*/
private Map<String, String> getTableComment() throws SQLException {
Map<String, String> maps = new HashMap<String, String>();
PreparedStatement pstate = conn.prepareStatement( "show table status" );
ResultSet results = pstate.executeQuery();
while ( results.next() ) {
String tableName = results.getString( "NAME" );
String comment = results.getString( "COMMENT" );
maps.put(tableName, comment);
}
return maps;
}
public void generate() throws ClassNotFoundException, SQLException, IOException {
init();
String prefix = "show full fields from " ;
List<String> columns = null ;
List<String> types = null ;
List<String> comments = null ;
PreparedStatement pstate = null ;
List<String> tables = getTables();
Map<String, String> tableComments = getTableComment();
for ( String table : tables ) {
columns = new ArrayList<String>();
types = new ArrayList<String>();
comments = new ArrayList<String>();
pstate = conn.prepareStatement(prefix + table);
ResultSet results = pstate.executeQuery();
while ( results.next() ) {
columns.add(results.getString( "FIELD" ));
types.add(results.getString( "TYPE" ));
comments.add(results.getString( "COMMENT" ));
}
tableName = table;
processTable(table);
// this.outputBaseBean();
String tableComment = tableComments.get(tableName);
buildEntityBean(columns, types, comments, tableComment);
buildMapper();
buildMapperXml(columns, types, comments);
}
conn.close();
}
public static void main( String[] args ) {
try {
new EntityUtil().generate();
// 自动打开生成文件的目录
Runtime.getRuntime().exec( "cmd /c start explorer D:\\" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
|