Spring mvc+Mybatis+DWZ代码生成器

目前只支持MySQL数据库,支持多主键、批量删除、生成图片上传、生成编辑器其他数据库需要实现具体的ConnectionManager。


生成器源码结构:


生成器原理是查询数据表的字段信息,封装成数据表对象,通过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}" οnsubmit="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}" οnsubmit="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" οnchange="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"}));
生成效果







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dyyaries

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值