JAVA从入门到精通之使用freemarker生成自定义代码
小标 2018-07-19 来源 : 阅读 645 评论 0

摘要:本文主要向大家介绍了JAVA从入门到精通的使用freemarker生成自定义代码,通过具体的内容向大家展示,希望对大家在JAVA从入门到精通的路上走的更远。

本文主要向大家介绍了JAVA从入门到精通的使用freemarker生成自定义代码,通过具体的内容向大家展示,希望对大家在JAVA从入门到精通的路上走的更远。

如题所示,生成自定义模板的数据库三件套 javabean/javaclient/sqlMap

使用到Lombok、freemarker

 

 1 package com.generator.db.domain; 2  3 import java.util.List; 4 import java.util.Set; 5  6 import lombok.Data; 7  8 @Data 9 public class Table {10     /** 包名 */11     private String packageName;12 13     /** 表说明 */14     private String common;15     /** 表名称 */16     private String tableName;17     /** 类名 */18     private String className;19     /** 表字段(普通字段) */20     private List<Column> columns;21     /** 表字段(主键字段) */22     private List<Column> primaryKeyColumns;23 24     /** 主键类型 */25     private String primaryKeysType;26     /** 主键类包名 */27     private String primaryKeysPackageName;28     /** 需要导入的包 */29     private Set<String> importPackages;30 }

 

 

package com.generator.db.domain;

import lombok.Data;

 

@Datapublic class Column {

    /** 所在表 */

    private String tableName;

    /** 字段说明 */

    private String common;

    /** 列名 */

    private String columnName;

    /** java属性名 */

    private String propertyName;

    /** 数据库类型 */

    private String jdbcType;

    /** java类型 全限定名 */

    private String javaType;

    /** java类型 类名 */

    private String simpleJavaType;

    /** java类型是否需要导包 即 是否不在java.lang包下 */

    private String needImportPackage;

    /** 数据长度 */

    private int length;

    /** 是否可以为空 */

    private String isNull;

    /** 是否是主键 */

    private String isPrimaryKey;

}

 

上述是读取数据库的表信息跟字段信息,接下来是表名跟字段名的命名转换规则接口

 

1 package com.generator.convert;2 3 @FunctionalInterface4 public interface DBNameConvert {5     String convert(String name);6 }

 

再然后就是数据库拿表跟字段信息了

 

  1 package com.generator.db;  2   3 import java.sql.Connection;  4 import java.sql.DatabaseMetaData;  5 import java.sql.DriverManager;  6 import java.sql.ResultSet;  7 import java.sql.SQLException;  8 import java.util.ArrayList;  9 import java.util.HashMap; 10 import java.util.List; 11 import java.util.Map; 12 import java.util.stream.Collectors; 13  14 import com.generator.convert.DBNameConvert; 15 import com.generator.db.domain.Column; 16 import com.generator.db.domain.Table; 17  18 public final class DBUtils { 19     public static String URL; 20     public static String USERNAME; 21     public static String PASSWORD; 22     private static final String BOOLEAN_STRING_TRUE = "true"; 23     private static final String BOOLEAN_STRING_FALSE = "false"; 24  25     /** 表名 */ 26     public static final String TABLE_NAME = "TABLE_NAME"; 27     /** 列名 */ 28     public static final String COLUMN_NAME = "COLUMN_NAME"; 29     /** 备注 */ 30     public static final String REMARKS = "REMARKS"; 31     /** 数据类型 */ 32     public static final String DATA_TYPE = "DATA_TYPE"; 33     /** 列长度 */ 34     public static final String COLUMN_SIZE = "COLUMN_SIZE"; 35     /** 是否可以为NULL */ 36     public static final String NULLABLE = "NULLABLE"; 37  38     public static void init(String url, String username, String password) { 39         URL = url; 40         USERNAME = username; 41         PASSWORD = password; 42     } 43  44     public static Connection getConn() { 45         Connection connection = null; 46         try { 47             connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 48         } catch (Exception e) { 49             e.printStackTrace(); 50         } 51         return connection; 52     } 53  54     public static List<Table> getTablesInfo(String packageName, DBNameConvert tableConvert, 55             DBNameConvert columnConvert) { 56         List<Table> tables = getTables(packageName, tableConvert); 57         List<Column> columns = getColumns(columnConvert); 58  59         Map<String, List<Column>> columnsMap = columns.stream().collect(Collectors.groupingBy(Column::getTableName)); 60         List<Table> primaryKeysClasses = new ArrayList<>(); 61         tables.forEach(t -> { 62             List<Column> allColumns = columnsMap.get(t.getTableName()); 63             List<Column> tablePrimaryKeys = t.getPrimaryKeyColumns(); 64             Map<String, Column> tablePrimaryKeysMap = tablePrimaryKeys.stream() 65                     .collect(Collectors.toMap(Column::getColumnName, table -> table)); 66  67             /** 对集合中的列设置是否主键标识 */ 68             allColumns.forEach(c -> { 69                 if (tablePrimaryKeysMap.get(c.getColumnName()) != null) { 70                     c.setIsPrimaryKey(BOOLEAN_STRING_TRUE); 71                 } else { 72                     c.setIsPrimaryKey(BOOLEAN_STRING_FALSE); 73                 } 74             }); 75  76             List<Column> pkColumns = allColumns.stream().filter(c -> BOOLEAN_STRING_TRUE.equals(c.getIsPrimaryKey())) 77                     .collect(Collectors.toList()); 78             /** 将多个主键移除普通列 */ 79             Map<String, Column> removePKColumns = pkColumns.stream() 80                     .collect(Collectors.toMap(Column::getColumnName, table -> table)); 81             allColumns = allColumns.stream().filter(c -> removePKColumns.get(c.getColumnName()) == null) 82                     .collect(Collectors.toList()); 83              84             if (pkColumns.size() > 1) { 85                 Table primaryKeysClass = new Table(); 86                 primaryKeysClass.setColumns(pkColumns); 87                 primaryKeysClass.setPackageName(t.getPackageName() + ".base"); 88                 primaryKeysClass.setClassName(t.getClassName() + "Key"); 89                 primaryKeysClasses.add(primaryKeysClass); 90  91                 t.setPrimaryKeysPackageName(primaryKeysClass.getPackageName()); 92                 t.setPrimaryKeysType(primaryKeysClass.getClassName()); 93             } else { 94                 t.setPrimaryKeysType(pkColumns.get(0).getJavaType()); 95             } 96             t.setPrimaryKeyColumns(pkColumns); 97             t.setColumns(allColumns); 98  99             t.setImportPackages(100                     t.getColumns().stream().filter(c -> c.getNeedImportPackage().equals(BOOLEAN_STRING_TRUE))101                             .map(Column::getJavaType).collect(Collectors.toSet()));102         });103 104         tables.addAll(primaryKeysClasses);105 106         return tables;107     }108 109     private static List<Table> getTables(String packageName, DBNameConvert tableConvert) {110         List<Table> tables = new ArrayList<>();111         Connection conn = getConn();112         try {113             DatabaseMetaData metaData = conn.getMetaData();114             ResultSet tablesResultSet = metaData.getTables(conn.getCatalog(), "%", "%", new String[] { "TABLE" });115             Table table = null;116             Column primaryKeysColumn = null;117             List<Column> primaryKeysColumns = null;118             while (tablesResultSet.next()) {119                 table = new Table();120                 primaryKeysColumns = new ArrayList<>();121                 table.setPackageName(packageName);122                 table.setTableName(tablesResultSet.getString(TABLE_NAME));123                 table.setCommon(tablesResultSet.getString(REMARKS));124                 table.setClassName(tableConvert.convert(table.getTableName()));125                 ResultSet primaryKeysResultSet = metaData.getPrimaryKeys(conn.getCatalog(), "%", table.getTableName());126                 while (primaryKeysResultSet.next()) {127                     primaryKeysColumn = new Column();128                     primaryKeysColumn.setColumnName(primaryKeysResultSet.getString(COLUMN_NAME));129                     primaryKeysColumns.add(primaryKeysColumn);130                 }131 132                 table.setPrimaryKeyColumns(primaryKeysColumns);133                 tables.add(table);134             }135         } catch (SQLException e) {136             e.printStackTrace();137         }138         return tables;139     }140 141     private static List<Column> getColumns(DBNameConvert columnConvert) {142         List<Column> columns = new ArrayList<>();143         Connection conn = getConn();144         try {145             DatabaseMetaData metaData = conn.getMetaData();146             ResultSet columnsResultSet = metaData.getColumns(conn.getCatalog(), "%", "%", "%");147             Column column = null;148             Map<Integer, String> intTypeMapper = intTypeMapper();149             Map<String, String> jdbcJavaTypeMapper = jdbcJavaTypeMapper();150             while (columnsResultSet.next()) {151                 column = new Column();152                 column.setTableName(columnsResultSet.getString(TABLE_NAME));153                 column.setColumnName(columnsResultSet.getString(COLUMN_NAME));154                 column.setCommon(columnsResultSet.getString(REMARKS));155                 /** jdbcType从数字映射到字符串类型 */156                 column.setJdbcType(intTypeMapper.get(columnsResultSet.getInt(DATA_TYPE)));157                 /** javaType从数据库类型映射到java类型 */158                 column.setJavaType(jdbcJavaTypeMapper.get(column.getJdbcType()));159                 column.setNeedImportPackage(BOOLEAN_STRING_TRUE);160                 if(column.getJavaType().indexOf(".")<0||column.getJavaType().startsWith("java.lang.")) {161                     column.setNeedImportPackage(BOOLEAN_STRING_FALSE);162                 }163                 column.setSimpleJavaType(column.getJavaType());164                 column.setLength(columnsResultSet.getInt(COLUMN_SIZE));165                 column.setIsNull(String.valueOf(columnsResultSet.getInt(NULLABLE) > 0));166 167                 column.setSimpleJavaType(column.getJavaType().substring(column.getJavaType().lastIndexOf(".") + 1));168                 /** 属性名转换 */169                 column.setPropertyName(columnConvert.convert(column.getColumnName()));170                 columns.add(column);171             }172         } catch (SQLException e) {173             e.printStackTrace();174         }175         return columns;176 177     }178 179     public static Map<Integer, String> intTypeMapper() {180         Map<Integer, String> map = new HashMap<>();181         map.put(-7, "BIT");182         map.put(-6, "TINYINT");183         map.put(5, "SMALLINT");184         map.put(4, "INTEGER");185         map.put(-5, "BIGINT");186         map.put(6, "FLOAT");187         map.put(7, "REAL");188         map.put(8, "DOUBLE");189         map.put(2, "NUMERIC");190         map.put(3, "DECIMAL");191         map.put(1, "CHAR");192         map.put(12, "VARCHAR");193         map.put(-1, "LONGVARCHAR");194         map.put(91, "DATE");195         map.put(92, "TIME");196         map.put(93, "TIMESTAMP");197         map.put(-2, "BINARY");198         map.put(-3, "VARBINARY");199         map.put(-4, "LONGVARBINARY");200         map.put(0, "NULL");201         map.put(1111, "OTHER");202         map.put(2000, "JAVA_OBJECT");203         map.put(2001, "DISTINCT");204         map.put(2002, "STRUCT");205         map.put(2003, "ARRAY");206         map.put(2004, "BLOB");207         map.put(2005, "CLOB");208         map.put(2006, "REF");209         map.put(70, "DATALINK");210         map.put(16, "BOOLEAN");211         map.put(-8, "ROWID");212         map.put(-15, "NCHAR");213         map.put(-9, "NVARCHAR");214         map.put(-16, "LONGNVARCHAR");215         map.put(2011, "NCLOB");216         map.put(2009, "SQLXML");217         map.put(2012, "REF_CURSOR");218         map.put(2013, "TIME_WITH_TIMEZONE");219         map.put(2014, "TIMESTAMP_WITH_TIMEZONE");220         return map;221     }222 223     public static Map<String, String> jdbcJavaTypeMapper() {224         Map<String, String> map = new HashMap<>();225         map.put("CHAR", "java.lang.String");226         map.put("VARCHAR", "java.lang.String");227         map.put("LONGVARCHAR", "java.lang.String");228         map.put("NUMERIC", "java.math.BigDecimal");229         map.put("DECIMAL", "java.math.BigDecimal");230         map.put("BIT", "boolean");231         map.put("BOOLEAN", "boolean");232         map.put("TINYINT", "byte");233         map.put("SMALLINT", "short");234         map.put("INTEGER", "int");235         map.put("BIGINT", "long");236         map.put("REAL", "float");237         map.put("FLOAT", "double");238         map.put("DOUBLE", "double");239         map.put("BINARY", "byte[]");240         map.put("VARBINARY", "byte[]");241         map.put("LONGVARBINARY", "byte[]");242         map.put("DATE", "java.time.LocalDate");243         map.put("TIME", "java.time.LocalTime");244         map.put("TIMESTAMP", "java.time.LocalDateTime");245         map.put("CLOB", "com.mysql.jdbc.Clob");246         map.put("BLOB", "com.mysql.jdbc.Blob");247         map.put("ARRAY", "Array");248         map.put("STRUCT", "Struct");249         map.put("REF", "Ref");250         map.put("DATALINK", "java.net.URL");251         return map;252     }253 }

 

代码中有注释信息,相信应该不难理解,接下来就是生成代码的动作了

 

  1 package com.generator.convert;  2   3 import java.io.File;  4 import java.io.FileOutputStream;  5 import java.io.IOException;  6 import java.io.OutputStreamWriter;  7 import java.io.Writer;  8 import java.util.List;  9  10 import com.generator.db.DBUtils; 11 import com.generator.db.domain.Table; 12  13 import freemarker.template.Configuration; 14 import freemarker.template.Template; 15 import freemarker.template.TemplateException; 16 import freemarker.template.TemplateExceptionHandler; 17 import lombok.AllArgsConstructor; 18 import lombok.Data; 19 import lombok.NoArgsConstructor; 20  21 @Data 22 @AllArgsConstructor 23 @NoArgsConstructor 24 public class Generator { 25     /** 数据库配置 */ 26     private DBSetting dbSetting; 27     /** 模板配置 */ 28     private TemplateSetting templateSetting; 29     /** javaModel配置 */ 30     private JavaModelSetting javaModelSetting; 31     /** sqlMap配置 */ 32     private SqlMapSetting sqlMapSetting; 33     /** 生成文件目录配置 */ 34     private FileSetting fileSetting; 35  36     /** javabean包名称 */ 37     private String javaBeanPackageName; 38     /** javaClient包名称 */ 39     private String javaClientPackageName; 40  41     public void generator() throws IOException, TemplateException { 42         Configuration conf = getConf(); 43         DBUtils.init(dbSetting.getDbUrl(), dbSetting.getDbUserName(), dbSetting.getDbPassWord()); 44         List<Table> tables = DBUtils.getTablesInfo(javaBeanPackageName, javaModelSetting.tableConvert, 45                 javaModelSetting.columnConvert); 46  47         /** 获取模板 */ 48         Template javaModelTemplate = conf.getTemplate(templateSetting.getJavaModelTemplate()); 49         Template sqlMapTemplate = conf.getTemplate(templateSetting.getSqlMapTemplate()); 50         Template javaClientTemplate = conf.getTemplate(templateSetting.getJavaClientTemplate()); 51         Template sqlMapExtendTemplate = conf.getTemplate(templateSetting.getSqlMapExtendTemplate()); 52  53         File javaModelPath = initDir(fileSetting.getJavaModel()); 54         File javaClientPath = initDir(fileSetting.getJavaClient()); 55         File sqlMapPath = initDir(fileSetting.getSqlMap()); 56         tables.forEach(t -> { 57  58             try (Writer javaModelWriter = new OutputStreamWriter( 59                     new FileOutputStream(new File(javaModelPath, t.getClassName() + ".java")))) { 60                 javaModelTemplate.process(t, javaModelWriter); 61             } catch (Exception e) { 62                 e.printStackTrace(); 63             } 64  65             /** 即该table实际上是一个表的符合主键类,无需生成javabean以外的client及sqlMap */ 66             if (t.getTableName() != null) { 67                 try (Writer javaClientWriter = new OutputStreamWriter( 68                         new FileOutputStream(new File(javaClientPath, t.getClassName() + "Mapper.java"))); 69                         Writer sqlMapWriter = new OutputStreamWriter( 70                                 new FileOutputStream(new File(sqlMapPath, t.getClassName() + "Mapper.xml"))); 71                         Writer sqlMapExtendWriter = new OutputStreamWriter( 72                                 new FileOutputStream(new File(sqlMapPath, t.getClassName() + "ExtendMapper.xml")))) { 73                     javaClientTemplate.process(t, javaClientWriter); 74                      75                     /** 因为生成sqlMap要用到不止table对象的字段,所以添加sqlMapSetting来存放table属性,传入模板的对象是Generator自己,省的再要定义bean而且又嵌套属性 */ 76                     sqlMapSetting.setTable(t); 77                     sqlMapTemplate.process(this, sqlMapWriter); 78                     sqlMapExtendTemplate.process(this, sqlMapExtendWriter); 79                 } catch (Exception e) { 80                     e.printStackTrace(); 81                 } 82             } 83         }); 84     } 85  86     private static File initDir(String path) { 87         File file = new File(path); 88         if (!file.exists()) { 89             file.mkdirs(); 90         } 91         return file; 92     } 93  94     private Configuration getConf() throws IOException { 95         Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); 96         cfg.setDirectoryForTemplateLoading(new File(templateSetting.getTemplateDir())); 97         cfg.setDefaultEncoding("UTF-8"); 98         cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); 99         return cfg;100     }101 102     @Data103     @AllArgsConstructor104     @NoArgsConstructor105     public static class FileSetting {106         /** 生成文件根路径(不要也罢,这个无所谓,只要下面3个值OK就好) */107         private String baseDir;108         /** javaBean生成目录 */109         private String javaModel;110         /** javaClient生成目录 */111         private String javaClient;112         /** sqlMap生成目录 */113         private String sqlMap;114     }115 116     @Data117     @AllArgsConstructor118     @NoArgsConstructor119     public static class DBSetting {120         /** 数据库链接 */121         private String dbUrl;122         /** 数据库用户名 */123         private String dbUserName;124         /** 数据库密码 */125         private String dbPassWord;126     }127 128     @Data129     @AllArgsConstructor130     @NoArgsConstructor131     public static class TemplateSetting {132         /** 模板目录 */133         private String templateDir;134         /** javabean模板文件 */135         private String javaModelTemplate;136         /** javaClient模板文件 */137         private String javaClientTemplate;138         /** sqlMap模板文件 */139         private String sqlMapTemplate;140         /** sqlMap拓展模板文件 */141         private String sqlMapExtendTemplate;142     }143 144     @Data145     @AllArgsConstructor146     @NoArgsConstructor147     public static class JavaModelSetting {148         /** 表名转类名实现 */149         private DBNameConvert tableConvert;150         /** 列名转属性名实现 */151         private DBNameConvert columnConvert;152     }153 154     @Data155     @AllArgsConstructor156     @NoArgsConstructor157     public static class SqlMapSetting {158         /** 表信息 */159         private Table table;160     }161 }

 

之所以把相关配置项都重新定义了一个内部类,是方便区分哪个属性是跟那块内容相关的,接下来是我个人的4个自定义模板

每个人可以根据Table跟Column的属性说明去定义自己的模板

 

 1 package ${packageName}; 2  3 <#if importPackages?exists> 4 <#list importPackages as package> 5 import ${package}; 6 </#list> 7 </#if> 8 <#if primaryKeysPackageName?exists > 9 import ${primaryKeysPackageName}.${primaryKeysType};10 </#if>11 /**12  *  13  */14 public class ${className}<#if primaryKeysType?exists> extends ${primaryKeysType}</#if>{15     <#list columns as column> 16     /** ${column.common} */17     private ${column.simpleJavaType} ${column.propertyName};18     </#list>19 20     <#list columns as column>21     public void set${column.propertyName?cap_first}(${column.simpleJavaType} ${column.propertyName}){22         this.${column.propertyName} = ${column.propertyName};23     }24     public ${column.simpleJavaType} get${column.propertyName?cap_first}(){25         return this.${column.propertyName};26     }27 28     </#list>29 }

 

 

package ${packageName};

import com.generator.db.BaseMapper;import ${packageName}.${className};import ${primaryKeysPackageName}.${primaryKeysType};

public interface ${className}Mapper extends BaseMapper<${className},${primaryKeysType}>{

 

}

 

 

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "//mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="${javaClientPackageName}.${sqlMapSetting.table.className}Mapper">

  <resultMap id="BaseResultMap" type="${javaBeanPackageName}.${sqlMapSetting.table.className}">

      <#list sqlMapSetting.table.primaryKeyColumns as column>

      <id column="${column.columnName}" jdbcType="${column.jdbcType}" property="${column.propertyName}" />

      </#list>

      <#list sqlMapSetting.table.columns as column>

      <result column="${column.columnName}" jdbcType="${column.jdbcType}" property="${column.propertyName}" />

      </#list>

  </resultMap>

  

  <sql id="Base_Column_List">

      <#if sqlMapSetting.table.primaryKeyColumns?exists>

    <#list sqlMapSetting.table.primaryKeyColumns as column>${column.columnName}<#if column_has_next>,</#if></#list>,

      </#if>

      <#list sqlMapSetting.table.columns as column>${column.columnName}<#if column_has_next>,</#if></#list>

  </sql>

  

  <select id="selectByPrimaryKey" parameterType="<#if sqlMapSetting.table.primaryKeysPackageName?exists >${sqlMapSetting.table.primaryKeysPackageName}.</#if>${sqlMapSetting.table.primaryKeysType}" resultMap="BaseResultMap">

    select

    <include refid="Base_Column_List" />

    from ${sqlMapSetting.table.tableName}

    where

    <#list sqlMapSetting.table.primaryKeyColumns as column>

        ${column.columnName} = ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

        <#if column_has_next>and </#if>

    </#list>

  </select>

  <delete id="deleteByPrimaryKey"  parameterType="<#if sqlMapSetting.table.primaryKeysPackageName?exists >${sqlMapSetting.table.primaryKeysPackageName}.</#if>${sqlMapSetting.table.primaryKeysType}">

    delete from ${sqlMapSetting.table.tableName}

    where

    <#list sqlMapSetting.table.primaryKeyColumns as column>

        ${column.columnName} = ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

        <#if column_has_next>and </#if>

    </#list>

  </delete>

  <insert id="insert" parameterType="${javaBeanPackageName}.${sqlMapSetting.table.className}">

      insert into ${sqlMapSetting.table.tableName} (

      <#if sqlMapSetting.table.primaryKeyColumns?exists>

    <#list sqlMapSetting.table.primaryKeyColumns as column>${column.columnName}<#if column_has_next>,</#if></#list>,</#if>

    <#list sqlMapSetting.table.columns as column>${column.columnName}<#if column_has_next>,</#if></#list>)

    values (

    <#if sqlMapSetting.table.primaryKeyColumns?exists>

    <#list sqlMapSetting.table.primaryKeyColumns as column>${"#"}{${column.columnName},jdbcType=${column.jdbcType}}<#if column_has_next>,</#if></#list>,</#if>

    <#list sqlMapSetting.table.columns as column>${"#"}{${column.columnName},jdbcType=${column.jdbcType}}<#if column_has_next>,</#if></#list>))

  </insert>

  <insert id="insertSelective" parameterType="${javaBeanPackageName}.${sqlMapSetting.table.className}">

    insert into ${sqlMapSetting.table.tableName} (

    <trim prefix="(" suffix=")" suffixOverrides=",">

    <#list sqlMapSetting.table.primaryKeyColumns as column>

    <if test="${column.propertyName} != null">

        ${column.columnName},

    </if>

    </#list>

    <#list sqlMapSetting.table.columns as column>

    <if test="${column.propertyName} != null">

        ${column.columnName},

    </if>

    </#list>

    )

    </trim>

    <trim prefix="values (" suffix=")" suffixOverrides=",">

    <#list sqlMapSetting.table.primaryKeyColumns as column>

    <if test="${column.propertyName} != null">

        ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

    </if>

    </#list>

    <#list sqlMapSetting.table.columns as column>

    <if test="${column.propertyName} != null">

        ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

    </if>

    </#list>

    </trim>

  </insert>

  <update id="updateByPrimaryKeySelective" parameterType="${javaBeanPackageName}.${sqlMapSetting.table.className}">

    update ${sqlMapSetting.table.tableName}

    <set>

    <#list sqlMapSetting.table.columns as column>

    <if test="${column.propertyName} != null">

        ${column.columnName} = ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

    </if>

    </#list>

    </set>

    where

    <#list sqlMapSetting.table.primaryKeyColumns as column>

        ${column.columnName} = ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

        <#if column_has_next>and</#if>

    </#list>

  </update>

  <update id="updateByPrimaryKey" parameterType="${javaBeanPackageName}.${sqlMapSetting.table.className}">

    update sys_user

    set

    <#list sqlMapSetting.table.columns as column>

    ${column.columnName} = ${""}{${column.propertyName},jdbcType=${column.jdbcType}}<#if column_has_next>,</#if>

    </#list>

    where

    <#list sqlMapSetting.table.primaryKeyColumns as column>

        ${column.columnName} = ${"#"}{${column.propertyName},jdbcType=${column.jdbcType}}

        <#if column_has_next>and </#if>

    </#list>

  </update></mapper>

 

1 <?xml version="1.0" encoding="UTF-8"?>2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "//mybatis.org/dtd/mybatis-3-mapper.dtd">3 <mapper namespace="${javaClientPackageName}.${sqlMapSetting.table.className}Mapper">4 5 </mapper>

对了  补上模板中的BaseMapper.java,凑齐一套,说不定还有人可以直接拿来用。

 

 1 package com.generator.mapper; 2  3 public interface BaseMapper<MODEL,KEY> { 4      5     int deleteByPrimaryKey(KEY key); 6      7     int insert(MODEL model); 8      9     int insertSelective(MODEL model);10     11     MODEL selectByPrimaryKey(KEY key);12     13     int updateByPrimaryKey(MODEL model);14     15     int updateByPrimaryKeySelective(MODEL model);16 }

 

还有遗漏的pom依赖

 

<project xmlns="//maven.apache.org/POM/4.0.0"

    xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.utils</groupId>

    <artifactId>generator</artifactId>

    <version>0.0.1-SNAPSHOT</version>

 

    <dependencies>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <version>1.16.20</version>

            <scope>provided</scope>

        </dependency>

        <dependency>

            <groupId>org.freemarker</groupId>

            <artifactId>freemarker</artifactId>

            <version>2.3.23</version>

        </dependency>

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.38</version>

        </dependency>

    </dependencies></project>

 

 

打完收工

第一次写博客.希望能坚持并且能帮助到一些需要的人!

freemarker第一次使用,语法什么的都是临时百度能生效就成,哈哈.

javabean.ftl中的get/set方法也可以省略掉 加上lombok的Data注解即可 

上传代码之前将sqlmap属性改成了sqlMap,eclipse使用快捷键alt+shift+R修改属性名,调用到getSqlmap方法的名字没有级联改变,原因就不言而喻了,这应该确实算是使用lombok的一点不足(虽然,改属性名这个操作,几乎不存在,能改善最好了)

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程