Spring mvc+Mybatis+DWZ代码生成器
2016-03-11 12:01
288 查看
目前只支持MySQL数据库,支持多主键、批量删除、生成图片上传、生成编辑器其他数据库需要实现具体的ConnectionManager。
![](http://img.blog.csdn.net/20160311125040590?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
生成器源码结构:
![](http://img.blog.csdn.net/20160311124802453?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
生成器原理是查询数据表的字段信息,封装成数据表对象,通过controller、service、dao、jsp view等模板生成增删改查代码。
支持自定义数据类型转换
![](http://img.blog.csdn.net/20160311125203501?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160311125213736?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
支持自定义字段的Html控件,以下代码指定img字段html元素为image(图片上传控件),descrption字段的Html控件为editor(编辑器),可选的值还有input、select、radio、checkbox、date、datetime,分别表示下拉选项、单选框、复选框、日期和日期时间,默认为input
tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * * search", "img + image", "author *", "isbn * * search", "press *", "price *", "descrption + editor"}));
mapper_xml.ftl
view_list.ftl
代码生成器API:
Gen gen = new Gen();
//设置数据库连接实现类
gen.setConnectionManager(new MySQLConnectionManager());
//设置顶层包名
gen.setBasePackage("com.genTest.gen");
//设置分页实现类名称
gen.setPagerType("QueryPager");
//设置请求尾缀
gen.setReqSuffix(".html");
Map<String,TableConf> tableConfs = new HashMap<String, TableConf>();
//表配置定义
TableConf(String table, String tableChinese, boolean multipleDelete, String[] fieldsConf)
//表配置
tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * * search", "img + image", "author *", "isbn * * search", "press *", "price *", "descrption + editor"}));
//字段配置定义
field, position, html_type, search, cn_name
position: * 列表显示表单显示;. 列表显示表单不显示;+ 列表不显示 表单显示
html_type: input(输入框,默认);radio(单选框);checkbox(多选框);date(日期); datetime(yyyy-MM-dd HH:mm日期时间);editor(编辑器);image(图片上传);*默认
search: search字段搜索;*不用于搜索(默认)
cn_name: 字段中文名,默认为数据表的comment
gen.setTableConf(tableConfs);
//生成目录
gen.setOutput("E:\\work\\workspace2\\genTest");
//do it
gen.doMysql();
代码示例:
生成结果
![](http://img.blog.csdn.net/20160311112714154?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
配置效果(Example):
表结构
![](http://img.blog.csdn.net/20160311114826667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
默认字段的中文名从comment中取,当然也可以在API中给每个字段定义中文名
配置1,默认不指定字段:
![](http://img.blog.csdn.net/20160311115058790?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160311115220218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
配置2,指定字段是否列表显示,是否表单显示,指定字段html元素
![](http://img.blog.csdn.net/20160311115533105?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
配置3,指定搜索字段,配置批量删除:
生成器源码结构:
生成器原理是查询数据表的字段信息,封装成数据表对象,通过controller、service、dao、jsp view等模板生成增删改查代码。
支持自定义数据类型转换
支持自定义字段的Html控件,以下代码指定img字段html元素为image(图片上传控件),descrption字段的Html控件为editor(编辑器),可选的值还有input、select、radio、checkbox、date、datetime,分别表示下拉选项、单选框、复选框、日期和日期时间,默认为input
tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * * search", "img + image", "author *", "isbn * * search", "press *", "price *", "descrption + editor"}));
mapper_xml.ftl
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="html"><?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="${basePackage}.data.${toClassName}Mapper"> <insert id="save" parameterType="${basePackage}.bean.${toClassName}" <#if hasFieldAutoIncrease>useGeneratedKeys="true" keyProperty="${fieldAutoIncrease}"</#if>> insert into ${name}(${fieldString}) values(${fieldWrapString}) </insert> <select id="selectAll" resultType="${basePackage}.bean.${toClassName}"> select * from ${name} </select> <select id="selectByCondition" parameterType="${basePackage}.bean.${toClassName}" resultType="${basePackage}.bean.${toClassName}"> select * from ${name} <where> <#list fields as field> <#if field.dwzType=="date"> <if test="${field.name}!=null"> and DATE(${field.name})=DATE(${r"#{"}${field.name}})</if> <#else> <if test="${field.name}!=null<#if field.searchEnable> and ${field.name}!=<#if field.fuzzySearch>''<#else>-1</#if></#if>"> and ${field.name}<#if field.fuzzySearch> like CONCAT('%','${r"${"}${field.name}}','%')<#else>=${r"#{"}${field.name}}</#if></if> </#if> </#list> </where> <if test="pager!=null"> limit ${r"#{"}pager.offset},${r"#{"}pager.numPerPage}</if> </select> <select id="selectTotal" parameterType="${basePackage}.bean.${toClassName}" resultType="java.lang.Long"> select count(*) from ${name} <where> <#list fields as field> <#if field.dwzType=="date"> <if test="${field.name}!=null"> and DATE(${field.name})=DATE(${r"#{"}${field.name}})</if> <#else> <if test="${field.name}!=null<#if field.searchEnable> and ${field.name}!=<#if field.fuzzySearch>''<#else>-1</#if></#if>"> and ${field.name}<#if field.fuzzySearch> like CONCAT('%','${r"${"}${field.name}}','%')<#else>=${r"#{"}${field.name}}</#if></if> </#if> </#list> </where> </select> <select id="selectSingle" parameterType="<#if hasCompositePk || primeType==toClassName>${basePackage}.bean.</#if>${primeType}" resultType="${basePackage}.bean.${toClassName}"> select * from ${name} <where> <#if primeType!=toClassName> <#if hasCompositePk> <#list primtives as prikey> <if test="${prikey.name}!=null"> and ${prikey.name}=${r"#{"}${prikey.name}}</if> </#list> <#else> <#list primtives as prikey> and ${prikey.name}=${r"#{"}${prikey.name}} </#list> </#if> <#else> <#list fields as field> <if test="${field.name}!=null"> and ${field.name}=${r"#{"}${field.name}}</if> </#list> </#if> </where> </select> <update id="update" parameterType="${basePackage}.bean.${toClassName}"> update ${name} <set> <#list fields as field> <#if field.name!=fieldPrime> <if test="${field.name}!=null">${field.name}=${r"#{"}${field.name}},</if> </#if> </#list> </set> <where> <#list primtives as prikey> <if test="${prikey.name}!=null">and ${prikey.name}=${r"#{"}${prikey.name}} </if> </#list> </where> </update> <delete id="delete" parameterType="<#if hasCompositePk || primeType==toClassName>${basePackage}.bean.</#if>${primeType}" > delete from ${name} <where> <#if primeType!=toClassName> <#if hasCompositePk> <#list primtives as prikey> <if test="${prikey.name}!=null"> and ${prikey.name}=${r"#{"}${prikey.name}}</if> </#list> <#else> <#list primtives as prikey> and ${prikey.name}=${r"#{"}${prikey.name}} </#list> </#if> <#else> <#list fields as field> <if test="${field.name}!=null"> and ${field.name}=${r"#{"}${field.name}}</if> </#list> </#if> </where> </delete> </mapper>
view_list.ftl
<pre name="code" class="html"><%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> <%@ taglib uri="/WEB-INF/mytag.tld" prefix="my" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <#if searchFields?size!=0> <div class="pageHeader"> <form id="pagerForm" method="post" action="${alias}/list${reqSuffix}" onsubmit="return navTabSearch(this);"> <input type="hidden" name="pageNum" value="${r"${"}pager.pageNum}"/> <input type="hidden" name="numPerPage" value="${r"${"}pager.numPerPage}"/> <div class="searchBar"> <table class="searchContent"> <tbody><tr><td> <#list searchFields as field> <#if field.htmlType=="select" || field.htmlType=="radio" || field.htmlType=="checkbox"> ${field.toLabelName }:<select name="${field.name }" class="formInputSmall"><option value="-1">请选择</option></select> <#elseif field.dwzType=="date" || field.htmlType=="date"> ${field.toLabelName }:<input name="${field.name }" class="textInput formInputSmall date" value='<fmt:formatDate value="${r"${"}${toEntityName}Model.${field.name}}" pattern="<#if field.htmlType=="datetime">yyyy-MM-dd HH:mm<#else>yyyy-MM-dd</#if>"/>'/> <#else> <input name="${field.name }" class="formInputSmall" value="${r"${"}${toEntityName}Model.${field.name}}" placeholder="搜索${field.toLabelName }"/> </#if> </#list> </td><td><div class="buttonActive"><div class="buttonContent"><button type="submit">检索</button></div></div></td></tr> </tbody></table></div> </form> </div> </#if> <div class="pageContent"> <#if searchFields?size==0> <form id="pagerForm" method="post" action="${alias}/list${reqSuffix}" onsubmit="return navTabSearch(this);"> <input type="hidden" name="pageNum" value="${r"${"}pager.pageNum}"/> <input type="hidden" name="numPerPage" value="${r"${"}pager.numPerPage}"/> </form> </#if> <div class="panelBar"> <ul class="toolBar"> <li><a href="${alias}/new${reqSuffix}" target="navTab" rel="${toEntityName }AddPage" class="add"><span>新增${nameCn }</span></a></li> <li><a href="${alias}/remove${reqSuffix}?pageNum=${r"${"}pager.pageNum }&id={idstring}" target="ajaxTodo" class="delete" title="确定要删除所选记录?"><span>删除${nameCn }</span></a></li> <#if batchDel> <li><a href="${alias}/edit${reqSuffix}?pageNum=${r"${"}pager.pageNum }&id={idstring}" target="navTab" rel="${toEntityName }EditPage" class="edit"><span>修改${nameCn }</span></a></li> <li><a href="${alias}/batchRemove${reqSuffix}?pageNum=${r"${"}pager.pageNum }" target="selectedTodo" rel="${toEntityName}Ids" postType="string" class="folder" title="确定删除所选记录?"><span>批量删除</span></a></li> </#if> </ul> </div> <table class="table" width="100%" layoutH="<#if searchFields?size==0>75<#else>113</#if>"> <thead> <tr><th><#if batchDel><input type="checkbox" group="${toEntityName}Ids" class="checkboxCtrl"/><#else> </#if></th><#list fields as field><#if field.listEnable><th>${field.toLabelName }</th></#if></#list></tr> </thead> <tbody> <c:forEach items="${r"${"}${toEntityName }List }" var="lo"> <tr target="idstring" rel="<#if primeType!=toClassName><#list primtives as prime>${r"${"}lo.${prime.name}}<#if prime_has_next>~</#if></#list><#else><#list fields as field>${r"${"}lo.${field.name}}<#if field_has_next>~</#if></#list></#if>"> <td><#if batchDel><input name="${toEntityName}Ids" value="<#if primeType!=toClassName><#list primtives as prime>${r"${"}lo.${prime.name}}<#if prime_has_next>~</#if></#list><#else><#list fields as field>${r"${"}lo.${field.name}}<#if field_has_next>~</#if></#list></#if>" target="${toEntityName}Ids" rel="<#if primeType!=toClassName><#list primtives as prime>${r"${"}lo.${prime.name}}<#if prime_has_next>~</#if></#list><#else><#list fields as field>${r"${"}lo.${field.name}}<#if field_has_next>~</#if></#list></#if>" type="checkbox"><#else> </#if></td> <#list fields as field> <#if field.listEnable> <td> <#if field.dwzType=="date" || field.htmlType=="date"> <fmt:formatDate value="${r"${"}lo.${field.name}}" pattern="yyyy-MM-dd"/> <#else> <#if field.htmlType=="image"> <img src="${r"${"}imgDomain}/${r"${"}lo.${field.name} }" style="max-width:200px;"/> <#else> ${r"${"}lo.${field.name} } </#if> </#if> </td> </#if> </#list> </tr> </c:forEach> </tbody> </table> <div class="panelBar"> <div class="pages"> <span> <select class="combox" name="numPerPage" onchange="navTabPageBreak({numPerPage:this.value})"> <option value="20" ${r"${"}pager.numPerPage == 20?"selected":""}>20</option> <option value="100" ${r"${"}pager.numPerPage == 100?"selected":""}>100</option> <option value="200" ${r"${"}pager.numPerPage == 200?"selected":""}>200</option> </select> 共${r"${"}pager.total }条,共${r"${"}pager.pageTotal}页</span> </div> <div class="pagination" targetType="navTab" totalCount="${r"${"}pager.total}" numPerPage="${r"${"}pager.numPerPage}" pageNumShown="10" currentPage="${r"${"}pager.pageNum}"></div> </div> </div>
代码生成器API:
Gen gen = new Gen();
//设置数据库连接实现类
gen.setConnectionManager(new MySQLConnectionManager());
//设置顶层包名
gen.setBasePackage("com.genTest.gen");
//设置分页实现类名称
gen.setPagerType("QueryPager");
//设置请求尾缀
gen.setReqSuffix(".html");
Map<String,TableConf> tableConfs = new HashMap<String, TableConf>();
//表配置定义
TableConf(String table, String tableChinese, boolean multipleDelete, String[] fieldsConf)
//表配置
tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * * search", "img + image", "author *", "isbn * * search", "press *", "price *", "descrption + editor"}));
//字段配置定义
field, position, html_type, search, cn_name
position: * 列表显示表单显示;. 列表显示表单不显示;+ 列表不显示 表单显示
html_type: input(输入框,默认);radio(单选框);checkbox(多选框);date(日期); datetime(yyyy-MM-dd HH:mm日期时间);editor(编辑器);image(图片上传);*默认
search: search字段搜索;*不用于搜索(默认)
cn_name: 字段中文名,默认为数据表的comment
gen.setTableConf(tableConfs);
//生成目录
gen.setOutput("E:\\work\\workspace2\\genTest");
//do it
gen.doMysql();
代码示例:
Map<String,TableConf> tableConfs = new HashMap<String, TableConf>(); /** * Field Conf 参数 (field, position, html_type, search, cn_name) * field: 字段名 * position: 显示配置 * 列表显示表单显示;. 列表显示表单不显示;+ 列表不显示 表单显示 * html_type: 表单元素 input(输入框,默认);radio(单选框);checkbox(多选框);date(日期); datetime(yyyy-MM-dd HH:mm日期时间);editor(编辑器);image(图片上传) * search: 字段是否用于搜索 .(默认);search(字段用于列表搜索) * cn_name: 字段中文名 默认为字段的comment * 各参数如果不作配置可用.代替,表示用默认配置。 * 例如: * title * * search 标题 表示列表和表单都显示,表单元素为默认的input,字段用于搜索,字段中文名为默认的COMMENT * title * input * 表示字段不用于搜索 */ tableConfs.put("msg_show", new TableConf("show", "在线展览", true, new String[]{"id +","begin_time *","end_time *","description + editor","title * * search","addr *","category_id * select","img * image"})); tableConfs.put("msg_content", new TableConf("content", "文章内容", true, new String[]{"id * * 编号","title * * search","content + editor","create_time . date search","category_id * select","img * image","sort_value *","recommend * radio","author *","source *"})); tableConfs.put("msg_banner", new TableConf("banner", "图片轮播", new String[]{"id +", "position * select search", "item_type * select", "item_url *", "item_href *", "img * image", "item_desc + editor"})); tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * * search", "img + image", "author *", "isbn *", "press *", "price *", "descrption + editor"})); tableConfs.put("msg_video", new TableConf("video", "视频", true, new String[]{"id *", "title * * search", "img + image", "author *", "category_id * select search", "view_times .", "description + editor"})); Gen gen = new Gen(); gen.setConnectionManager(new MySQLConnectionManager()); gen.setBasePackage("com.genTest.gen"); gen.setPagerType("QueryPager"); gen.setReqSuffix(".html"); gen.setTableConf(tableConfs); gen.setOutput("E:\\work\\workspace2\\genTest"); gen.doMysql();
生成结果
配置效果(Example):
表结构
默认字段的中文名从comment中取,当然也可以在API中给每个字段定义中文名
配置1,默认不指定字段:
tableConfs.put("msg_book", new TableConf("book", "出版物", new String[]{}));生成效果
配置2,指定字段是否列表显示,是否表单显示,指定字段html元素
tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * ", "img + image", "author *", "isbn *", "press *", "price *", "descrption + editor"}));生成效果
配置3,指定搜索字段,配置批量删除:
tableConfs.put("msg_book", new TableConf("book", "出版物", true, new String[]{"id *", "name * * search", "img + image", "author *", "isbn * search", "press *", "price *", "descrption + editor"}));生成效果
相关文章推荐
- spring MVC
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- JAVA练习---人民币小写转大写
- Myeclipse优化
- Java的calendar类用法
- RxJava之subscribeOn解惑
- Java可变参数传递中可以接收多个对象
- spring(自动检测bean)
- JAVA设置当时时间大小
- Java中正则表达式匹配的语法规则
- java学习第一集:Hello World
- Android eclipse导入项目后出现Unable to resolve target 'android-17'解决方法
- 深入理解Java内存模型之系列篇
- maven 工程启动找不到 Spring ContextLoaderListener 的解决办法