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}" 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+Mybatis+DWZ程式碼生成器
目前只支援MySQL資料庫,支援多主鍵、批量刪除、生成圖片上傳、生成編輯器其他資料庫需要實現具體的ConnectionManager。 生成器原始碼結構: 生成器原理是查詢資料表的欄位資訊,封裝成資料表物件,通過controller、service、dao、jsp vi
mybatis註解實現 spring mvc + mybatis+velocity 框架 (附完整專案程式碼)
最近學習了一下mybatis結合網上的一些列子搭建的一個網站的框架,前端顯示用的velocity引擎,資料訪問使用mybatis+oracle,檢視訪問控制spring mvc,框架主要包括一些基本的增刪改操作以及攔截器,廢話不多說了直接開始吧!! 程式碼下載
分布式服務--spring mvc +mybatis + Dubbo+Zookeeper+Proxy+Restful
spring mvc+my batis kafka dubbo+zookeerper restful redis分布式緩存 雲服務子系統:後臺管理系統、Restfu服務系統、Dubbo服務/管控/監控中心Zookeeper註冊中心、報表分析系統、日誌記錄系統、定時調度系統搜索引擎系統、分布式文
java企業架構 spring mvc +mybatis + KafKa+Flume+Zookeeper
spring mvc spring springmvc+mybatis redis分布式緩存 restful分布式服務 dubbo + springmvc 平臺簡介 Jeesz是一個分布式的框架,提供項目模塊化、服務化、熱插拔的思想,高度封裝安全性的Java EE快速開
eclipse搭建maven project的spring4 spring mvc mybatis
framework sta port cti https oca web工程 nis lang 一,先確定已經安裝好了Eclipse Java EE IDE for Web Developers我用的是如下版本 Version: Neon.3 Release (4.6.3)
好文分享--java企業架構 spring mvc +mybatis + KafKa+Flume+Zookeeper分布式架構
分布式框架 Maven Springmvc mybatis Dubbo ZooKeeper Redis FastDFS ActiveMQ 開發工具 1.Eclipse IDE:采用Maven項目管理,模塊化。 2.代碼生成:通過界面方式簡單配置,自動生
Spring+Spring MVC+Mybatis+Maven搭建多模塊項目(二)
自己 var user inf 接口 work 過程 cal ber 基於第一篇文章《Spring+Spring MVC+Mybatis+Maven搭建多模塊項目(一)》的基礎上,寫一個完整的示例,從頁面到Dao層的整個過程 1、先在bug.model模塊下創建com.bu
SMM框架的搭建和測試(Spring MVC+MyBatis)
meta true model spa const -i ssp pan div Spring MVC:MVC框架,通過Model-View-Controller模式很好的將數據,業務與展現進行分離。 MyBatis:數據持久層框架 我這裏使用的是MyEclipse 2
java電子商務系統源碼 Spring MVC+mybatis+spring boot+spring security
電子商務平臺 word 解決方案 功能 截圖 mybatis 互聯 包括 數據監控 鴻鵠雲商大型企業分布式互聯網電子商務平臺,推出PC+微信+APP+雲服務的雲商平臺系統,其中包括B2B、B2C、C2C、O2O、新零售、直播電商等子平臺。 分布式、微服務、雲架構電子商
spring mvc+mybatis ios android整合cms內容發布平臺
減少 連接 jquer 登錄 jdk版本 sso href com 分享圖片 開發語言: java、ios、android 部署平臺: linux、window jdk版本:JDK1.7以上版本 開發工具: eclipse、idea等 服務器中間件:Tomcat
基於Vue+Spring MVC+MyBatis+Shiro+Dubbo開發的分布式後臺管理系統
java dubbo shiro vue 分布式 最近項目中使用了shiro做權限管理,在開發過程中也踩了一些坑,於是便有了開發個應用鞏固一下所學知識的想法,正好在開發的過程裏學習一下Vue開發。技術棧方面,現在前後端分離大行其道,於是也采用了前後端分離的模式,前端基於Vue+Elemen
spring mvc +mybatis + KafKa+Flume+Zookeeper分布式架構
可用 src fast ges mvc schedule cit size fas 開發工具 1.Eclipse IDE:采用Maven項目管理,模塊化。 2.代碼生成:通過界面方式簡單配置,自動生成相應代碼,目前包括三種生成方式(增刪改查):單表、一對多、樹結構。生成後的
java企業架構 spring mvc +mybatis + KafKa+Flume+Zookeep
activit res dea cms art restful work 管理 數據庫讀寫分離 開發工具 1.Eclipse IDE:采用Maven項目管理,模塊化。 2.代碼生成:通過界面方式簡單配置,自動生成相應代碼,目前包括三種生成方式(增刪改查):單表、一對多、樹結
Spring4 + Spring MVC + MyBatis 整合思路
ack ans bean shape 特性 smu locale serial shmat 1、Spring框架的搭建這個很簡單,只需要web容器中註冊org.springframework.web.context.ContextLoaderListener,並指定spri
spring入門(六) spring mvc+mybatis
odi 創建 mode utf from 針對 namespace tid oca 1.引入依賴 1 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> 2 <depe
MyBatis-Plus程式碼生成器,根據表名生成各個模組的程式碼
根據表名生成Entity、Mapper、Mapper XML、Service、Controller 等各個模組的程式碼,程式碼如下(根據官網demo修改的),可以正常執行 package com; import com.baomidou.mybatisplus.annotation.DbTyp
通過idea建立Maven專案整合Spring+spring mvc+mybatis
寫這篇文章是為了整理一下idea下整合maven專案的步驟,也為了以後讓室友們參考 建立專案 File→new→project
IDEA多模組SSM框架搭建(IDEA+tomcat+maven+mysql+spring+spring mvc+mybatis)總結
Tomcat版本:8.5.27 jdk版本:1.8 Idea版本:2017.3.5 1.建立一個根模組 不勾選任何值,直接next 根模組建立成功如下: src目錄不需要可以刪除 2.建立javadao模組
SSM(Spring+Spring MVC+Mybatis)開發前臺後功能完整的java開源部落格管理系統
專案描述 本專案通過SSM(SpringMVC+Mybatis+Spring)框架編寫的一個人部落格管理系統,使用hexo主題,以及MAVEN進行對專案管理,並且前端具有粒子和點選愛心效果.後端的頁面框架為bootstrap.資料庫為mysql. 執行(執行)環境 jdk8+tomcat8+mysql+
Java架構-Spring MVC+Mybatis+cms實現UC瀏覽器文章相關功能
最近公司在模擬UC瀏覽器做一個簡單的cms系統,主要針對於企業內部的文章瀏覽需求,這邊考慮使用者大多用mobile瀏覽文章內容,故使用原生的ios和android進行開發,後面也會整合html5。 使用前後端分離解決方案(服務化的方式) 文章分為普通型別、視訊型別