autoCode提供了一组velocity变量,这些变量包含了数据库表,字段,java类字段信息
运用这些变量我们就能构建出一个自己需要的模板文件
首先来看下变量列表:
前面是变量名,后面是对变量的说明
接下来我们就用这些变量来编写一个模板
这里有一张后台用户表back_user,它有三个字段,如图
现在我们要根据这张表生成一个Entity,那模板内容如下:
假设包名为test
package ${context.packageName}.entity; public class ${context.javaBeanName} { #foreach($column in $columns) private ${column.javaType} ${column.javaFieldName}; #end #foreach(${column} in ${columns}) public void set${column.javaFieldNameUF}(${column.javaType} ${column.javaFieldName}){ this.${column.javaFieldName} = ${column.javaFieldName}; } public ${column.javaType} get${column.javaFieldNameUF}(){ return this.${column.javaFieldName}; } #end }
使用代码生成器生成后的代码如下:
package test.entity; public class BackUser { private String username; private String password; private Date addTime; public void setUsername(String username){ this.username = username; } public String getUsername(){ return this.username; } public void setPassword(String password){ this.password = password; } public String getPassword(){ return this.password; } public void setAddTime(Date addTime){ this.addTime = addTime; } public Date getAddTime(){ return this.addTime; } }
接下来我们编写一个复杂的例子,编写一个mybatis的配置文件模板
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="${context.packageName}.dao.${context.javaBeanName}Dao"> <resultMap id="queryResultMap" type="${context.packageName}.entity.${context.javaBeanName}"> #foreach($column in $columns) <result column="${column.columnName}" property="${column.javaFieldName}" jdbcType="${column.mybatisJdbcType}" /> #end </resultMap> <select id="find" parameterType="${context.packageName}.entity.${context.javaBeanName}" resultMap="queryResultMap"> SELECT * FROM ${table.tableName} t WHERE 1=1 #foreach($column in $columns) <if test="${column.javaFieldName}!=null"> AND ${column.columnName} = #{${column.javaFieldName},jdbcType=${column.mybatisJdbcType}} </if> #end ORDER BY ${context.javaPkName} desc </select> <insert id="save" parameterType="${context.packageName}.entity.${context.javaBeanName}" #if(${pkColumn.isIdentity}) keyProperty="${context.javaPkName}" keyColumn="${context.pkName}" useGeneratedKeys="true" #end > INSERT INTO ${table.tableName} ( #set ($i=0) #foreach($column in $columns) #if(!${column.isIdentityPk}) #if($i > 0),#end ${column.columnName} #set($i=$i+1) #end #end ) VALUES ( #set ($i=0) #foreach($column in $columns) #if(!${column.isIdentityPk}) #if($i > 0),#end #{${column.javaFieldName},jdbcType=${column.mybatisJdbcType}} #set($i=$i+1) #end #end ) </insert> <update id="update" parameterType="${context.packageName}.entity.${context.javaBeanName}"> UPDATE ${table.tableName} SET #set ($i=0) #foreach($column in $columns) #if(!${column.isPk}) #if($i > 0),#end ${column.columnName}=#{${column.javaFieldName},jdbcType=${column.mybatisJdbcType}} #set($i=$i+1) #end #end WHERE ${context.pkName} = #{${context.javaPkName},jdbcType=${context.mybatisPkType}} </update> <select id="get" resultMap="queryResultMap" parameterType="java.io.Serializable"> SELECT * FROM ${table.tableName} WHERE ${context.pkName} = #{${context.javaPkName},jdbcType=${context.mybatisPkType}} </select> <delete id="del" parameterType="${context.packageName}.entity.${context.javaBeanName}"> DELETE FROM ${table.tableName} WHERE ${context.pkName} = #{${context.javaPkName},jdbcType=${context.mybatisPkType}} </delete> </mapper>
生成后的代码:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="test.dao.BackUserDao"> <resultMap id="queryResultMap" type="test.entity.BackUser"> <result column="username" property="username" jdbcType="VARCHAR" /> <result column="password" property="password" jdbcType="VARCHAR" /> <result column="add_time" property="addTime" jdbcType="TIMESTAMP" /> </resultMap> <select id="find" parameterType="test.entity.BackUser" resultMap="queryResultMap"> SELECT * FROM back_user t WHERE 1=1 <if test="username!=null"> AND username = #{username,jdbcType=VARCHAR} </if> <if test="password!=null"> AND password = #{password,jdbcType=VARCHAR} </if> <if test="addTime!=null"> AND add_time = #{addTime,jdbcType=TIMESTAMP} </if> ORDER BY username desc </select> <insert id="save" parameterType="test.entity.BackUser"> INSERT INTO back_user ( username , password , add_time ) VALUES ( #{username,jdbcType=VARCHAR} , #{password,jdbcType=VARCHAR} , #{addTime,jdbcType=TIMESTAMP} ) </insert> <update id="update" parameterType="test.entity.BackUser"> UPDATE back_user SET password=#{password,jdbcType=VARCHAR} , add_time=#{addTime,jdbcType=TIMESTAMP} WHERE username = #{username,jdbcType=VARCHAR} </update> <select id="get" resultMap="queryResultMap" parameterType="java.io.Serializable"> SELECT * FROM back_user WHERE username = #{username,jdbcType=VARCHAR} </select> <delete id="del" parameterType="test.entity.BackUser"> DELETE FROM back_user WHERE username = #{username,jdbcType=VARCHAR} </delete> </mapper>
我们取一个update语句来分析:
<update id="update" parameterType="${context.packageName}.entity.${context.javaBeanName}">
UPDATE ${table.tableName} // 表名
SET
#set ($i=0) // 定义一个变量$i=0
#foreach($column in $columns) // 循环列
#if(!${column.isPk}) // 如果不是主键,因为主键是不能被修改的
#if($i > 0),#end // 这里添加逗号,从第二个开始就开始加逗号
${column.columnName}=#{${column.javaFieldName},jdbcType=${column.mybatisJdbcType}} // 修改字段
#set($i=$i+1) // 每次循环后变量加1
#end
#end
WHERE ${context.pkName} = #{${context.javaPkName},jdbcType=${context.mybatisPkType}} // 主键=#{java主键}
</update>
由此可以看出这套velocity语法可以满足大部分要求,当然特殊的地方还是需要自己去修改.毕竟代码生成器也不是外能的