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语法可以满足大部分要求,当然特殊的地方还是需要自己去修改.毕竟代码生成器也不是外能的