For a relatively large business system, we always add, delete, modify, paste, copy, think always let people have a kind of resistance in the heart. What is the way to automatically generate some classes, configuration files, or interfaces under normal development progress?
Feeling in the immediate want to do a relatively large business system, think of that endless additions and deletions to check, paste copy, immediately after the brain rises a cool breeze. So I thought of a generator that would look for or write a Java code, so that there would be more time to do something else in the normal development schedule.
Less gossip, first summed up the demand:
I need this tool to be able to read the database table structure, through the analysis of the field type, name and so on to get the various variables needed, according to the template to generate the corresponding Pojo class, hibernate XML configuration file, DAO and Service interfaces and classes.
The demand looks very simple, but one is not done such a small tool, the second is the technology does not pass, so still thought of looking for open source code to take over according to their own needs to change.
So found Rapid-generator this open source tool, students can download Rapid-generator direct use, according to their needs to write a good template on the line.
Because of the special circumstances of their own projects and company norms and other factors, but also want to learn the design of others, so I have the source of the deletion and functional changes.
Look at the main classes:
Table: An object created from a table structure.
Column: An object that is created from each column in the table.
Generator: Generator Core class, primarily responsible for generating final Java code files based on table objects and reading Freemarker templates.
Generatorcontrol: Controls some of the parameters of the build process, such as file overwrite, file encoding, and so on.
Generatorproperties: Reads the configuration file's class, the configuration file includes the database connection information and some basic parameter configuration.
Let's take a look at the authoring of templates:
Pojo Template:
< #include "/java_copyright.include" > < #assign classname = table.classname > < #assign classNameLower = className?uncap_first> package ${basepackage}.pojo.${mpackage}.${table.classnamefirstlower}; < #include "/java_imports.include" > import com.linkage.agri.pojo.base.BaseEntity; public class ${classname} extends baseentity { private static final long serialVersionUID = 5454155825314635342L; < #list table.columns as column > /** * ${column.remarks} */ private ${column.simplejavatype} ${ Column.columnnamelower}; &NBSP;&NBSp; </#list > < @generateJavaColumns/> < #macro generatejavacolumns> < #list table.columns as column> < #if column.isDateTimeColumn> public string get${column.columnname}string () { return dateconvertutils.format (Get${column.columnname} (), FORMAT_${ Column.constantname}); &NBSP;&NBSP;&NBSP;&NBSP} public void set${column.columnname} String (String ${column.columnnamelower}) { set$ {Column.columnname} (Dateconvertutils.parse (${column.columnnamelower}, format_${column.constantname},${column.simplejavatype} . Class)); } &NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&Nbsp;</#if > public void set${ Column.columnname} (${column.simplejavatype} ${column.columnnamelower}) { this.${column.columnNameLower} = ${column.columnNameLower}; &NBSP;&NBSP;&NBSP;&NBSP} public ${ Column.simplejavatype} get${column.columnname} () { return this.${column.columnNameLower};   </#list > </#macro >
The basic grammar of Freemarker can be seen in the Freemarker Chinese manual.
${} can refer to many variables, including: Environment variables, table objects, configuration variables, and so on, these variables are installed in a map, if you have special needs, of course, can modify the source code to load more variable values.
Note: When a variable is an object, the properties of the Access object are accessed through the Get method. For example, ${table.classnamefirstlower} is a Getnamefirstlower () method that refers to a Table object, even if the property is not namefirstlower in the Table object.
And take a look at the DAO template I wrote:
< #include "/java_copyright.include" > < #assign classname = table.classname > < #assign classNameLower = className?uncap_first> package ${basepackage}.dao.${mpackage}.${table.classnamefirstlower}; import java.math.bigdecimal; import java.util.list; import java.util.map; import com.linkage.agri.dao.base.abstracthibernatedao; import com.linkage.agri.exception.daoexception; import ${basepackage}.pojo.${mpackage}.${classnamelower}.${classname}; < #include "/java_imports.include"