package com.skycc;
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
*
*/
@SuppressWarnings("hiding")
public class myEntityUtil {
/**
**********************************使用前必讀*******************
**
** 使用前請將moduleName更改爲自己模塊的名稱即可(一般情況下與數據庫名一致),其他無須改動。
**
***********************************************************
*/
private final String type_char = "char";
private final String type_varchar = "varchar";
private final String type_date = "date";
private final String type_timestamp = "timestamp";
private final String type_int = "int";
private final String type_float = "float";
private final String type_double = "double";
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 = "jianzhan"; // 對應模塊名稱(根據自己模塊做相應調整!!!務必修改^_^)
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 = "bean";
private final String mapper_package = "com.skycc.mapper.jianzhan";
private final String driverName = "com.mysql.jdbc.Driver";
private final String user = "root";
private final String password = "root";
private final String url = "jdbc:mysql://192.168.1.197:3306/" + moduleName + "?characterEncoding=gbk";
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 "VARCHAR";
} else if ( type.indexOf(type_bigint) > -1 ) {
return "Long".toUpperCase();
} else if ( type.indexOf(type_int) > -1 ) {
return "Integer".toUpperCase();
}else if ( type.indexOf(type_float) > -1 ) {
return "Float".toUpperCase();
}else if ( type.indexOf(type_double) > -1 ) {
return "double".toUpperCase();
} else if ( type.indexOf(type_date) > -1 ) {
return "Date".toUpperCase();
} else if ( type.indexOf(type_text) > -1 ) {
return "VARCHAR";
} else if ( type.indexOf(type_varchar) > -1 ) {
return "VARCHAR";
} else if ( type.indexOf(type_timestamp) > -1 ) {
return "Date".toUpperCase();
} else if ( type.indexOf(type_bit) > -1 ) {
return "Boolean".toUpperCase();
} else if ( type.indexOf(type_decimal) > -1 ) {
return "DECIMAL".toUpperCase();
} else if ( type.indexOf(type_blob) > -1 ) {
return "byte[]";
}
return null;
}
private String BeanprocessType( 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_float) > -1 ) {
return "Float";
}else if ( type.indexOf(type_double) > -1 ) {
return "Double";
} 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_varchar) > -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 "Double";
} 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 com.skycc.core.entity.BasicEntity;");
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 BasicEntity,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 " + BeanprocessType(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 = BeanprocessType(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.write("\tpublic String getId() {");
// bw.write("\treturn null;");
// bw.write("}");
// bw.newLine();
// bw.write("public void setId(String id) {");
// bw.write("}");
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 com.skycc.core.dao.BaseDao;");
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 + " extends BaseDao{");
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 \"-//mybatis.org//DTD Mapper 3.0//EN\" ");
bw.newLine();
bw.write(" \"http://mybatis.org/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();
//resultMap
bw.write("\t<resultMap id=\""+beanName+"ResultMap\" type=\""+bean_package+"."+beanName+"\">");
for ( int i = 0 ; i < size ; i++ ) {
if(i==0){
bw.newLine();
bw.write("\t<id column=\""+columns.get(i)+"\" property=\""+processField(columns.get(i))+"\" jdbcType=\""+processType(types.get(i))+"\" />");
bw.newLine();
}else{
bw.newLine();
bw.write("\t<result column=\""+columns.get(i)+"\" property=\""+processField(columns.get(i))+"\" jdbcType=\""+processType(types.get(i))+"\" />");
bw.newLine();
}
}
bw.write("\t</resultMap>");
bw.newLine();
// insert
bw.write("\t<insert id=\"insert\" parameterType=\""+bean_package+"."+beanName+"\">");
bw.newLine();
bw.write("\tinsert into "+tableName);
bw.newLine();
bw.write("\t<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
for ( int i = 0 ; i < size ; i++ ) {
bw.newLine();
bw.write("\t<if test=\""+processField(columns.get(i))+" != null\">"+columns.get(i)+",</if>");
bw.newLine();
}
bw.write("\t</trim>");
bw.newLine();
bw.write("\t<trim prefix=\"values (\" suffix=\")\" suffixOverrides=\",\">");
for ( int i = 0 ; i < size ; i++ ) {
bw.newLine();
bw.write("\t<if test=\""+processField(columns.get(i))+" != null\">#{"+processField(columns.get(i))+",jdbcType="+processType(types.get(i))+"},</if>");
bw.newLine();
}
bw.write("\t</trim>");
bw.newLine();
bw.write("\t</insert>");
bw.newLine();
bw.newLine();
//update
bw.write("\t<update id=\"update\" parameterType=\""+bean_package+"."+beanName+"\">");
bw.newLine();
bw.write("\tupdate "+tableName);
bw.newLine();
bw.write("\t<set>");
for ( int i = 1 ; i < size ; i++ ) {
bw.newLine();
bw.write("\t<if test=\""+processField(columns.get(i))+" != null\">"+columns.get(i)+" = #{"+processField(columns.get(i))+",jdbcType="+processType(types.get(i))+"},</if>");
bw.newLine();
}
bw.write("\t</set>");
bw.newLine();
bw.write("\twhere "+columns.get(0)+" = #{"+processField(columns.get(0))+",jdbcType="+processType(types.get(0))+"}");
bw.newLine();
bw.write("\t</update>");
bw.newLine();
bw.newLine();
//刪除根據實體
// <delete id="deleteByEntity" parameterType="map">
// delete from t_sys_label
// <include refid="whereSearch" />
// </delete>
bw.write("\t<delete id=\"deleteByEntity\" parameterType=\"map\">");
bw.newLine();
bw.write("\tdelete from "+tableName);
bw.newLine();
bw.write("\t<include refid=\"whereSearch\" />");
bw.newLine();
bw.write("\t</delete>");
bw.newLine();
bw.newLine();
//detele
bw.write("\t<delete id=\"deleteById\" parameterType=\"java.lang.String\">");
bw.newLine();
bw.write("\tdelete from "+tableName);
bw.newLine();
bw.write("\twhere "+columns.get(0)+" = #{"+processField(columns.get(0))+",jdbcType="+processType(types.get(0))+"}");
bw.newLine();
bw.write("\t</delete>");
bw.newLine();
bw.newLine();
//totalByEntity
bw.write("\t<select id=\"totalByEntity\" resultType=\"int\" parameterType=\"int\">");
bw.newLine();
bw.write("\tselect count(*) from "+tableName);
bw.newLine();
bw.write("\t<include refid=\"whereSearch\" />");
bw.newLine();
bw.write("\t</select>");
bw.newLine();
bw.newLine();
//分頁查詢
// <select id="selectByPage" resultMap="SysLabelResultMap">
// select * from t_sys_label
// <include refid="whereSearch" />
// <if test="null != searchKeyWords and '' != searchKeyWords">
// and (f_lbName LIKE '%${searchKeyWords}%' or fLbContent LIKE '%${searchKeyWords}%')
// </if>
// LIMIT #{startNumber},#{endNumber}
// </select>
bw.write("\t<select id=\"selectByPage\" resultMap=\""+beanName+"ResultMap\">");
bw.newLine();
bw.write("\tselect * from "+tableName);
bw.newLine();
bw.write("\t<include refid=\"whereSearch\" />");
bw.newLine();
bw.write("\tLIMIT #{startNumber},#{endNumber}");
bw.newLine();
bw.write("\t</select>");
bw.newLine();
bw.newLine();
//selectById
bw.write("\t<select id=\"selectById\" resultMap=\""+beanName+"ResultMap\">");
bw.newLine();
bw.write("\tselect * from "+tableName);
bw.newLine();
bw.write("\twhere "+columns.get(0)+" = #{"+processField(columns.get(0))+",jdbcType=VARCHAR}");
bw.newLine();
bw.write("\t</select>");
bw.newLine();
bw.newLine();
//selectByEntity
bw.write("\t<select id=\"selectByEntity\" resultMap=\""+beanName+"ResultMap\" parameterType=\"int\">");
bw.newLine();
bw.write("\tselect * from "+tableName);
bw.newLine();
bw.write("\t<include refid=\"whereSearch\" />");
bw.newLine();
bw.write("\t</select>");
bw.newLine();
bw.newLine();
//whereSearch
bw.write("\t<sql id=\"whereSearch\">");
bw.newLine();
bw.write("\t<where>");
// bw.write("\t<if test=\"null != id and '' != id\">");
// bw.write("\tid = #{id,jdbcType=VARCHAR}");
// bw.write("\t</if>");
for ( int i = 0 ; i < size ; i++ ) {
bw.write("\t<if test=\"null != "+processField(columns.get(i))+" and '' != "+processField(columns.get(i))+"\">");
bw.newLine();
bw.write("\tand "+columns.get(i)+" = #{"+processField(columns.get(i))+",jdbcType="+processType(types.get(i))+"}");
bw.newLine();
bw.write("\t</if>");
bw.newLine();
}
bw.write("\t</where>");
bw.newLine();
bw.write("\t</sql>");
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 myEntityUtil().generate();
// 自動打開生成文件的目錄
Runtime.getRuntime().exec("cmd /c start explorer D:\\");
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} catch ( SQLException e ) {
e.printStackTrace();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
mybatis 自動生成實體類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.