在idea中使用mybtais的自定義模板生成,可以幫我們省去很多重復的代碼。
打開一個項目,我們要修改的主要就兩個文件,一個是生成的mapper接口,另一個是xml文件:
相應的mapper接口模板為:
?
package ${mapperInterface.packageName};import ${tableClass.fullClassName};
import com.scmpt.framework.aop.mybatis.interceptor.unique.UniqueValidation;
import java.util.List;
import org.apache.ibatis.annotations.Param;/**
* @author ${author!}
* @description 針對表【${tableClass.tableName}<#if tableClass.remark?has_content>(${tableClass.remark!})</#if>】的數據庫操作Mapper
* @createDate ${.now?string('yyyy-MM-dd HH:mm:ss')}
* @Entity ${tableClass.fullClassName}
*/
public interface ${mapperInterface.fileName} {@UniqueValidation(table = "${tableClass.tableName}")
int insert(${tableClass.shortClassName} record);${tableClass.shortClassName} getById(Long id);@UniqueValidation(table = "${tableClass.tableName}")
int updateById(${tableClass.shortClassName} record);void deleteRecycle(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);
void recoverRecycle(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);
void deleteBatch(@Param("ids") List<Long> ids,@Param("updateUserId") Long updateUserId);List<Long> getToTranslate(@Param("ids") List<Long> ids);List<${tableClass.shortClassName}> getInfoDoByIds(@Param("ids")List<Long> longList);void insertBatch(@Param("doList") List<${tableClass.shortClassName}> managesDos);
}
我們要引用的注解也好,或者是第三方插件也好。都是提前把對應的包路徑引進來。
相應的mapper的XML文件生成模板為:
?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${mapperInterface.packageName}.${baseInfo.fileName}"><resultMap id="BaseResultMap" type="${tableClass.fullClassName}"><#list tableClass.pkFields as field><id property="${field.fieldName}" column="${field.columnName}" <#if baseInfo.needJdbcType>jdbcType="${field.jdbcType}"</#if>/></#list><#list tableClass.baseFields as field><result property="${field.fieldName}" column="${field.columnName}" <#if baseInfo.needJdbcType>jdbcType="${field.jdbcType}"</#if>/></#list></resultMap><sql id="Base_Column_List"><#list tableClass.allFields as field>${field.columnName}<#sep>,<#if field_index > 0 && field_index%5==0>${"\n "}</#if></#list></sql><select id="getById" parameterType="java.lang.Long" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from ${tableClass.tableName}where <#list tableClass.pkFields as field> ${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>} <#if field_has_next>AND</#if></#list></select><insert id="insert"<#if (tableClass.pkFields?size==1)> keyColumn="${tableClass.pkFields[0].columnName}" keyProperty="${tableClass.pkFields[0].fieldName}" parameterType="${tableClass.fullClassName}" useGeneratedKeys="true"</#if>>insert into ${tableClass.tableName}( <#list tableClass.allFields as field>${field.columnName}<#sep>,<#if field_index > 0 && field_index%5==0>${"\n "}</#if></#list>)values (<#list tableClass.allFields as field>${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>}<#sep>,<#if field_index > 0 && field_index%5==0>${"\n "}</#if></#list>)</insert><update id="updateById" parameterType="${tableClass.fullClassName}">update ${tableClass.tableName}<set><#list tableClass.baseBlobFields as field><if test="${field.fieldName} != null">${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>},</if></#list></set>where <#list tableClass.pkFields as field> ${field.columnName} = ${'#'}{${field.fieldName}<#if baseInfo.needJdbcType>,jdbcType=${field.jdbcType}</#if>} <#if field_has_next>AND</#if></#list></update><update id="recoverRecycle">update ${tableClass.tableName}set is_recycle = 0,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><update id="deleteRecycle">update ${tableClass.tableName}set is_delete = 1,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><update id="deleteBatch">update ${tableClass.tableName}set is_recycle = 1,update_time = now(),update_user_id = ${'#'}{updateUserId}where <#list tableClass.pkFields as field>${field.columnName}</#list> in<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></update><insert id="insertBatch">INSERT INTO ${tableClass.tableName} (<#list tableClass.allFields as field>${field.columnName}<#sep>,</#list>)VALUES<foreach collection="doList" item="item" separator=",">(<#list tableClass.allFields as field>${'#'}{item.${field.fieldName}}<#sep>,</#list>)</foreach></insert><select id="getInfoDoByIds" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List"/>FROM ${tableClass.tableName}WHERE <#list tableClass.pkFields as field>${field.columnName}</#list> IN<foreach collection="ids" item="id" open="(" separator="," close=")">${'#'}{id}</foreach></select><select id="getToTranslate" resultType="java.lang.Long">SELECT tt.<#list tableClass.pkFields as field>${field.columnName}</#list>FROM (<foreach collection="ids" item="id" separator=" UNION ALL ">SELECT ${'#'}{id} AS <#list tableClass.pkFields as field>${field.columnName}</#list></foreach>) ttLEFT JOIN ${tableClass.tableName} omsON tt.<#list tableClass.pkFields as field>${field.columnName}</#list> = oms.<#list tableClass.pkFields as field>${field.columnName}</#list>WHERE oms.<#list tableClass.pkFields as field>${field.columnName}</#list> IS NULL</select>
</mapper>
至此,我們就可以直接點擊模板生成來進行我們自定義的模板生成策略。
ftl文件:?使用的FreeMark模板語言
Freemarker的基本語法及使用大全_freemarker 語法_小碼哥哥哥的博客-CSDN博客
不太懂freemark和模板中變量含義的結合以上理解就可以進行模板自定義了。
要注意的是,我們修改的是default-all這個生成模板,所以,我們也要使用相應的生成策略才可以。
生成的mapper接口為:
可以看到正確輸出了我們相應的格式。
如果想要恢復默認的生成模板,我們可以直接在項目中恢復默認。
如此,就能把我們的模板恢復為靜態的模板了。相應的代碼生成時的映射關系為:
1. 實體類信息(tableClass.*
)
變量名 | 說明 | 示例 |
---|---|---|
tableClass.fullClassName | 類的全限定名 | com.example.system.entity.UserDO |
tableClass.shortClassName | 類的簡稱(不含包名) | UserDO |
tableClass.tableName | 數據庫表名 | sys_user |
tableClass.pkFields | 主鍵字段集合 | [id] |
tableClass.allFields | 所有字段集合 | [id, username, password, ...] |
tableClass.baseFields | 排除主鍵 & BLOB 的字段集合 | [username, password, ...] |
tableClass.baseBlobFields | 排除主鍵,含 BLOB?的字段集合 | [username, password, avatar, ...] |
tableClass.remark | 表注釋 | 用戶信息表 |
2. 字段信息(field.*
)
變量名 | 說明 | 示例 |
---|---|---|
field.fieldName | Java 屬性名 | userName |
field.columnName | 數據庫列名 | user_name |
field.jdbcType | JDBC 類型 | VARCHAR |
field.columnLength | 列長度 | 64 |
field.columnScale | 列精度(小數位) | 2 |
field.columnIsArray | 是否為數組 | false |
field.shortTypeName | Java 類型短名稱 | String |
field.fullTypeName | Java 類型全限定名 | java.lang.String |
field.remark | 字段注釋 | 用戶名 |
field.autoIncrement | 是否自增 | true |
field.nullable | 是否允許 NULL | false |
3. 配置信息(baseInfo.*
)
變量名 | 說明 | 示例 |
---|---|---|
baseInfo.shortClassName | 配置名稱 | UserDO |
baseInfo.tableName | 配置文件名稱 | UserDO |
baseInfo.pkFields | 配置名稱 | id |
baseInfo.allFields | 后綴 | DO |
baseInfo.baseFields | 包名 | com.example.system.entity |
baseInfo.baseBlobFields | 模板內容 | ... |
baseInfo.remark | 相對模塊的資源文件路徑 | src/main/resources |
更多的信息請查看官網:
Mybatis X 插件 | MyBatis-Plus