zoukankan      html  css  js  c++  java
  • SpringBoot--Easycode插件自定义模板

      最近准备做个项目,在配置项目环境的时候,使用Easycode插件生成entity,controller,service,dao,mapper,前面只是单纯地介绍了Easycode插件的集成,但由于使用的是Easycode插件默认的模板,导致最终生成的文件与自己想要的效果有所差别。

      所以花了一下午的时间研究如何自定义模板,最终设计出了一套比较完整的模板。

    数据类型映射

      首先打开idea——Settings——OtherSettings——EasyCode

       如图所示,Type Mapper是数据类型映射,简单点来说就是数据库的字段的类型与实体类属性的类型相对应,基本上都默认的对应规则,这其实没什么好说的,如果生成实体类的时候提示某个属性没有找到对应的数据类型,就照猫画虎添加上去就行了。

     

    自定义模板

    实体类entity.java

      首先,这里使用lombok插件来代替Getter、Setter方法;按照模板默认的生成也可以。(复制粘贴替换默认的就行)

     1 ##引入宏定义
     2 $!define
     3 
     4 ##使用宏定义设置回调(保存位置与文件后缀)
     5 #save("/entity", ".java")
     6 
     7 ##使用宏定义设置包后缀
     8 #setPackageSuffix("entity")
     9 
    10 ##使用全局变量实现默认包导入
    11 $!autoImport
    12 import java.io.Serializable;
    13 import lombok.Data;
    14 ##
    15 ####使用宏定义实现类注释信息
    16 ###tableComment("实体类")
    17 @Data
    18 public class $!{tableInfo.name} implements Serializable {
    19     private static final long serialVersionUID = $!tool.serial();
    20 #foreach($column in $tableInfo.fullColumn)
    21     #if(${column.comment})/**
    22     * ${column.comment} 
    23     */
    24     #end
    25 
    26     private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
    27 ##    private $!{tool.getClsNameByFullName($column.type)} $!{tool.firstUpperCase($column.name)};
    28 #end
    29 
    30 
    31 ##若没有使用lombok插件,该段不要注释,按照默认的模板
    32 ###foreach($column in $tableInfo.fullColumn)
    33 ####使用宏定义实现get,set方法
    34 ###getSetMethod($column)
    35 ###end
    36 
    37 }
    View Code

    测试

     

     生成效果(注释对应数据库,折叠起来就行)

    DAO层dao.java

     1 ##定义初始变量
     2 #set($tableName = $tool.append($tableInfo.name, "Dao"))
     3 ##设置回调
     4 $!callback.setFileName($tool.append($tableName, ".java"))
     5 $!callback.setSavePath($tool.append($tableInfo.savePath, "/dao"))
     6 
     7 ##拿到主键
     8 #if(!$tableInfo.pkColumn.isEmpty())
     9     #set($pk = $tableInfo.pkColumn.get(0))
    10 #end
    11 
    12 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}dao;
    13 
    14 import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
    15 import java.util.List;
    16 
    17 /**
    18  * $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
    19  * @author 北林
    20  */
    21 
    22 public interface $!{tableName} {
    23     
    24     //通过ID查询
    25     $!{tableInfo.name} selectById($!pk.shortType $!pk.name);
    26   
    27     //查询所有数据   
    28     List<$!{tableInfo.name}> selectAll();
    29    
    30 ##    //通过实体作为筛选条件查询   
    31 ##    List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
    32     
    33     //新增数据   
    34     int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
    35    
    36     //修改数据   
    37     int updateById($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
    38     
    39     //通过主键id删除数据   
    40     int deleteById($!pk.shortType $!pk.name);
    41 
    42 }
    View Code

    生成效果

     映射文件mapper.xml

     1 ##引入mybatis支持
     2 $!mybatisSupport
     3 
     4 ##设置保存名称与保存位置
     5 $!callback.setFileName($tool.append($!{tableInfo.name}, "Mapper.xml"))
     6 $!callback.setSavePath($tool.append($tableInfo.savePath, "/mapper"))
     7 
     8 ##拿到主键
     9 #if(!$tableInfo.pkColumn.isEmpty())
    10     #set($pk = $tableInfo.pkColumn.get(0))
    11 #end
    12 
    13 <?xml version="1.0" encoding="UTF-8"?>
    14 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    15 <mapper namespace="$!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao">
    16 
    17     <resultMap type="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}" id="$!{tableInfo.name}Map">
    18 #foreach($column in $tableInfo.fullColumn)
    19         <result property="$!{column.name}" column="$!column.obj.name" jdbcType="$!column.ext.jdbcType"/>
    20 #end
    21     </resultMap>
    22     
    23     <sql id="BaseResult">
    24         #allSqlColumn() 
    25     </sql>
    26     
    27     <!--根据id查询-->
    28     <select id="selectById" resultType="$!{tableInfo.savePackageName}.entity.$!{tableInfo.name}">
    29         select<include refid="BaseResult"/>
    30         from $!tableInfo.obj.name
    31         where $!pk.obj.name = #{$!pk.name}
    32     </select>
    33 
    34     <!--查询所有数据-->
    35     <select id="selectAll" resultMap="$!{tableInfo.name}Map">
    36         select<include refid="BaseResult"/>
    37         from $!tableInfo.obj.name
    38     </select>
    39 ##
    40 ##    <!--通过实体作为筛选条件查询-->
    41 ##    <select id="queryAll" resultMap="$!{tableInfo.name}Map">
    42 ##        select<include refid="BaseResult"/>
    43 ##        from $!tableInfo.obj.name
    44 ##        <where>
    45 ###foreach($column in $tableInfo.fullColumn)
    46 ##            <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
    47 ##                and $!column.obj.name = #{$!column.name}
    48 ##            </if>
    49 ###end
    50 ##        </where>
    51 ##    </select>
    52 
    53     <!--新增所有列-->
    54     <insert id="insert" keyProperty="$!pk.name" useGeneratedKeys="true">
    55         insert into $!{tableInfo.obj.name}(<include refid="BaseResult"/>)
    56         values (#null,#foreach($column in $tableInfo.otherColumn)#{$!{column.name}}#if($velocityHasNext), #end#end)
    57     </insert>
    58 
    59     <!--通过主键id修改数据-->
    60     <update id="updateById">
    61         update $!{tableInfo.obj.name}
    62         <set>
    63 #foreach($column in $tableInfo.otherColumn)
    64             <if test="$!column.name != null#if($column.type.equals("java.lang.String")) and $!column.name != ''#end">
    65                 $!column.obj.name = #{$!column.name},
    66             </if>
    67 #end
    68         </set>
    69         where $!pk.obj.name = #{$!pk.name}
    70     </update>
    71 
    72     <!--通过主键id删除-->
    73     <delete id="deleteById">
    74         delete from $!{tableInfo.obj.name} where $!pk.obj.name = #{$!pk.name}
    75     </delete>
    76 
    77 </mapper>
    View Code

    生成效果(部分截图)

       这里需要注意的是映射文件中的id跟dao层的方法名是一一对应的,如果修改了dao层的方法名,映射文件的id也需要修改。

    Service层service.java

      1.首先添加分页插件的依赖

    1   <dependency>
    2             <groupId>com.github.pagehelper</groupId>
    3             <artifactId>pagehelper-spring-boot-starter</artifactId>
    4             <version>1.2.5</version>
    5         </dependency>

      2.设计service.java模板

     1 ##定义初始变量
     2 #set($tableName = $tool.append($tableInfo.name, "Service"))
     3 ##设置回调
     4 $!callback.setFileName($tool.append($tableName, ".java"))
     5 $!callback.setSavePath($tool.append($tableInfo.savePath, "/service"))
     6 
     7 ##拿到主键
     8 #if(!$tableInfo.pkColumn.isEmpty())
     9     #set($pk = $tableInfo.pkColumn.get(0))
    10 #end
    11 
    12 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
    13 
    14 import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
    15 import java.util.List;
    16 import com.github.pagehelper.PageInfo;
    17 
    18 
    19 /**
    20  * $!{tableInfo.comment}($!{tableInfo.name})表服务接口
    21  * @author 北林
    22  */
    23 public interface $!{tableName} {
    24 
    25     //通过ID查询
    26     $!{tableInfo.name} selectById($!pk.shortType $!pk.name);
    27   
    28     //查询所有数据并分页
    29     PageInfo<$!{tableInfo.name}> selectAll(int pageNum, int pageSize);
    30     
    31 ##    //通过实体作为筛选条件查询   
    32 ##    List<$!{tableInfo.name}> queryAll($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
    33     
    34     //新增数据   
    35     int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
    36    
    37     //修改数据   
    38     int updateById($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name}));
    39     
    40     //通过主键id删除数据   
    41     int deleteById($!pk.shortType $!pk.name);
    42 
    43 }
    View Code

    生成效果

    Service层实现类serviceImpl.java

     1 ##定义初始变量
     2 #set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
     3 ##设置回调
     4 $!callback.setFileName($tool.append($tableName, ".java"))
     5 $!callback.setSavePath($tool.append($tableInfo.savePath, "/service/impl"))
     6 
     7 ##拿到主键
     8 #if(!$tableInfo.pkColumn.isEmpty())
     9     #set($pk = $tableInfo.pkColumn.get(0))
    10 #end
    11 
    12 #if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
    13 
    14 import $!{tableInfo.savePackageName}.entity.$!{tableInfo.name};
    15 import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao;
    16 import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
    17 import org.springframework.stereotype.Service;
    18 import org.springframework.beans.factory.annotation.Autowired;
    19 import org.springframework.transaction.annotation.Transactional;
    20 import com.github.pagehelper.PageHelper;
    21 import com.github.pagehelper.PageInfo;
    22 
    23 import javax.annotation.Resource;
    24 import java.util.List;
    25 
    26 /**
    27  * $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
    28  * @author 北林
    29  */
    30 @Service
    31 @Transactional
    32 public class $!{tableName} implements $!{tableInfo.name}Service {
    33    @Autowired
    34     private $!{tableInfo.name}Dao $!tool.firstLowerCase($!{tableInfo.name})Dao;
    35 
    36     /**
    37      * 通过ID查询单条数据
    38      * @param $!pk.name 主键
    39      * @return 实例对象
    40      */
    41     @Override
    42     public $!{tableInfo.name} selectById($!pk.shortType $!pk.name) {
    43         return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectById($!pk.name);
    44     }
    45 
    46     /**
    47      * 查询多条数据
    48      * @param pageNum 查询起始位置
    49      * @param pageSize 查询条数
    50      * @return 对象列表
    51      */
    52     @Override
    53     public PageInfo selectAll(int pageNum, int pageSize) {
    54         PageHelper.startPage(pageNum,pageSize);
    55         List<$!{tableInfo.name}> dataList = $!{tool.firstLowerCase($!{tableInfo.name})}Dao.selectAll();
    56         PageInfo<$!{tableInfo.name}> page = new PageInfo<$!{tableInfo.name}>(dataList);
    57         return page;
    58     }
    59 
    60     /**
    61      * 新增数据
    62      * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
    63      * @return 实例对象
    64      */
    65     @Override
    66     public int insert($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
    67         return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.insert($!tool.firstLowerCase($!{tableInfo.name}));
    68     }
    69 
    70     /**
    71      * 修改数据
    72      * @param $!tool.firstLowerCase($!{tableInfo.name}) 实例对象
    73      * @return 实例对象
    74      */
    75     @Override
    76     public int updateById($!{tableInfo.name} $!tool.firstLowerCase($!{tableInfo.name})) {
    77         return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.updateById($!tool.firstLowerCase($!{tableInfo.name}));
    78     }
    79 
    80     /**
    81      * 通过主键id删除数据
    82      * @param $!pk.name 主键
    83      */
    84     @Override
    85     public int deleteById($!pk.shortType $!pk.name) {
    86         return $!{tool.firstLowerCase($!{tableInfo.name})}Dao.deleteById($!pk.name);
    87     }
    88 }
    View Code

    生成效果(部分截图)

      controller的模板就没有必要设计了,因为需要结合前端以及具体的业务需求。

    总结

      这样一来,就可以根据数据库的表来使用Easycode插件一键生成entity,controller,service,dao,mapper,包含了单表的最基本方法——增删改查,service使用了分页插件,整体下来可以减轻大量的重复工作。当然,新手的话,不建议过早地使用插件!

     最后附上个人测试后的整体项目结构、pom文件以及applicatio.properties设置

     pom.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5     <parent>
     6         <groupId>org.springframework.boot</groupId>
     7         <artifactId>spring-boot-starter-parent</artifactId>
     8         <version>2.2.4.RELEASE</version>
     9         <relativePath/> <!-- lookup parent from repository -->
    10     </parent>
    11     <groupId>com.beilin</groupId>
    12     <artifactId>beilin_oa</artifactId>
    13     <version>0.0.1-SNAPSHOT</version>
    14     <name>beilin_oa</name>
    15     <description>Demo project for Spring Boot</description>
    16 
    17     <properties>
    18         <java.version>1.8</java.version>
    19     </properties>
    20 
    21     <dependencies>
    22         <dependency>
    23             <groupId>org.springframework.boot</groupId>
    24             <artifactId>spring-boot-starter-web</artifactId>
    25         </dependency>
    26 
    27         <dependency>
    28             <groupId>org.mybatis.spring.boot</groupId>
    29             <artifactId>mybatis-spring-boot-starter</artifactId>
    30             <version>2.1.3</version>
    31         </dependency>
    32         <dependency>
    33             <groupId>mysql</groupId>
    34             <artifactId>mysql-connector-java</artifactId>
    35             <version>8.0.15</version>
    36         </dependency>
    37         <!--  分页插件 -->
    38           <dependency>
    39             <groupId>com.github.pagehelper</groupId>
    40             <artifactId>pagehelper-spring-boot-starter</artifactId>
    41             <version>1.2.5</version>
    42         </dependency>
    43 
    44         <dependency>
    45             <groupId>org.springframework.boot</groupId>
    46             <artifactId>spring-boot-devtools</artifactId>
    47             <scope>runtime</scope>
    48             <optional>true</optional>
    49         </dependency>
    50          <dependency>
    51             <groupId>org.projectlombok</groupId>
    52             <artifactId>lombok</artifactId>
    53             <optional>true</optional>
    54         </dependency>
    55         <dependency>
    56             <groupId>org.springframework.boot</groupId>
    57             <artifactId>spring-boot-starter-test</artifactId>
    58             <scope>test</scope>
    59             <exclusions>
    60                 <exclusion>
    61                     <groupId>org.junit.vintage</groupId>
    62                     <artifactId>junit-vintage-engine</artifactId>
    63                 </exclusion>
    64             </exclusions>
    65         </dependency>
    66     </dependencies>
    67 
    68     <build>
    69         <plugins>
    70             <plugin>
    71                 <groupId>org.springframework.boot</groupId>
    72                 <artifactId>spring-boot-maven-plugin</artifactId>
    73             </plugin>
    74         </plugins>
    75         <resources>
    76             <resource>
    77                 <directory>src/main/java</directory>
    78                 <includes>
    79                     <include>**/*.xml</include>
    80                 </includes>
    81             </resource>
    82         </resources>
    83     </build>
    84 
    85 </project>
    View Code

    applicatio.properties 

     1 spring.http.encoding.force=true
     2 spring.http.encoding.charset=UTF-8
     3 spring.http.encoding.enabled=true
     4 server.tomcat.uri-encoding=UTF-8
     5 #分页插件
     6 pagehelper.helper-dialect=mysql
     7 pagehelper.reasonable=true
     8 pagehelper.support-methods-arguments=true
     9 pagehelper.params=count=countSql
    10 
    11 #配置Mysql连接
    12 spring.datasource.url=jdbc:mysql://localhost:3306/beilin_oa?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC
    13 spring.datasource.username=root
    14 spring.datasource.password=root
    15 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    16 #配置mybatis
    17 #配置实体类别名
    18 mybatis.type-aliases-package=com/beilin/entity
    19 #配置xml映射路径
    20 mybatis.mapper-locations=classpath*:com/beilin/mapper/**.xml
    21 #开启驼峰命名法
    22 mybatis.configuration.map-underscore-to-camel-case=true
    View Code

    个人喜欢默认的applicatio.properties,当然applicatio.yml也可以,但要注意格式

    ps:若理解有误,请指正,共同学习进步!

  • 相关阅读:
    Windows下临界区的使用CRITICAL_SECTION
    MFC中消息映射的实现
    Oracle中提供的事件触发机制
    CreateEvent()详解
    内核参数优化之2-1 tcp/ip 标志位报文解析
    内核参数优化之1 keepalive解析
    python之7-3对象的信息/方法获取
    python之7-2类的继承与多态
    python之7-1类
    python之6-3嵌套函数
  • 原文地址:https://www.cnblogs.com/wx60079/p/13481042.html
Copyright © 2011-2022 走看看