先在數據庫中設計表,而後使用下面工具生成實體類和mapper,配置可根據需求自行更改java
package com.xgh.educmbs.util; 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; 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 = "xghtestdb"; // 對應模塊名稱(根據本身模塊作相應調整!!!務必修改^_^) 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 = "com.yunxiaoyuan." + moduleName + ".entity"; private final String mapper_package = "com.yunxiaoyuan." + moduleName + ".mapper"; 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.3.86: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 \"-//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(); // 通用結果列 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(); } } }