弄了一下代码生成器,遇到了一些小问题,记录分享一下。
1.生成get set方法
自动生成get set的时候由于刚刚开始弄,导致了直接把引入宏定义那句代码删除了,导致一直出问题
//就是这句代码。。。。。。为年少无知付出了代价
##引入宏定义
$!define
2.生成代码保存路径、类名、保存文件类型
引入宏定义
##引入宏定义
$!define
##使用宏定义设置保存位置与文件后缀 可以加表达式动态生成包
#save("/java/cn/potato/aisell/domain/$!{tableInfo.obj.name}(生成文件保存位置)", ".java(生成文件后缀)")
##使用宏定义设置包后缀
#setPackageSuffix("domain(当前包的后缀:package com.companyname.modulename.domain;)")
直接引入
##类名的前、后缀
#set($tableName = $tool.append("I(类名前缀,可以直接拼接)",$tableInfo.name("当前表名"), "Service(类名后要加的值)"))
##设置回调(也就是设置文件存储路径和文件存储后缀)
##设置文件存储名 保存该类的名字.java文件
$!callback.setFileName( ${tool.append($tableName, ".java")})
##文件储存路径 可以加表达式
$!callback.setSavePath($tool.append($tableInfo.savePath, "/webapp/WEB-INF/views/$!{tableInfo.obj.name}"))
自己写的几个生成器模板
1.domain
##引入宏定义
$!define
##使用宏定义设置回调(保存位置与文件后缀)
#save("/java/cn/potato/aisell/domain", ".java")
##使用宏定义设置包后缀
#setPackageSuffix("domain")
import javax.persistence.Entity;
import javax.persistence.Table;
##使用宏定义实现类注释信息
#tableComment("实体类")
@Entity
@Table(name = "$!{tableInfo.obj.name}")
public class $!{tableInfo.name} extends BaseDomain{
#foreach($column in $tableInfo.otherColumn)
#if(${column.comment})/**
* ${column.comment}
*/#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
#foreach($column in $tableInfo.otherColumn)
##使用宏定义实现get,set方法
#getSetMethod($column)
#end
}
2.repository
##类名的Repository
#set($tableName = $tool.append($tableInfo.name, "Repository"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/java/cn/potato/aisell/repository"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} extends BaseRepository<$!{tableInfo.name},Long>{
}
3.service
##类名的Repository
#set($tableName = $tool.append("I",$tableInfo.name, "Service"))
##设置回调
##设置文件储存名字($tool.append($tableName, ".java"))
$!callback.setFileName(${tool.append($tableName, ".java")})
##设置文件储存路径,默认使用选中路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/java/cn/potato/aisell/service"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
/**
* $!{tableInfo.comment}($!{tableInfo.name})表数据库访问层
*
* @author $!author
* @since $!time.currTime()
*/
public interface $!{tableName} extends IBaseService<$!{tableInfo.name},Long>{
}
4.serviceImpl
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/java/cn/potato/aisell/service/impl"))
##拿到主键
#if(!$tableInfo.pkColumn.isEmpty())
#set($pk = $tableInfo.pkColumn.get(0))
#end
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.I$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;
/**
* $!{tableInfo.comment}($!{tableInfo.name})表服务实现类
*
* @author $!author
* @since $!time.currTime()
*/
@Service
public class $!{tableName} extends BaseServiceImpl<$!{tableInfo.name},Long> implements I$!{tableInfo.name}Service {
}
5.controller
##设置回调
##设置文件储存名字($tool.append($tableName, ".java"))
$!callback.setFileName(${tool.append($!{tableInfo.name}, "Controller.java")})
##设置文件储存路径,默认使用选中路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/java/cn/potato/aisell/web/controller"))
##类名的Repository
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置包名
#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}web.controller;
##使用全局变量实现默认包导入
$!autoImport
import $!{tableInfo.savePackageName}.common.JsonResult;
import $!{tableInfo.savePackageName}.common.UIpage;
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.query.$!{tableInfo.name}Query;
import $!{tableInfo.savePackageName}.service.I$!{tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@RequestMapping("/$!{tableInfo.obj.name}")
@Controller
public class $!{tableInfo.name}Controller extends BaseController {
@Autowired
private I$!{tableInfo.name}Service $!{tableInfo.obj.name}Service;
/**
* 在所有方法执行前执行
*/
@ModelAttribute(value = "edit$!{tableInfo.name}")
public $!{tableInfo.name} beforeAll(Long id,String _cmd){
if (id!=null && "update".equals(_cmd)) {
//通过id拿到药修改的对象
$!{tableInfo.name} $!{tableInfo.obj.name} = $!{tableInfo.obj.name}Service.findOne(id);
return $!{tableInfo.obj.name};
}
return null;
}
/**
* 页面展示
*/
@RequestMapping("/index")
public String index(){
return "$!{tableInfo.obj.name}/index";
}
/**
* 查询所有数据
*/
@RequestMapping("/list")
@ResponseBody
public List<$!{tableInfo.name}> findAll(){
return $!{tableInfo.obj.name}Service.findAll();
}
/**
* 写一个类专门写分页的方法 直接用
*/
@RequestMapping("/page")
@ResponseBody
public UIpage<$!{tableInfo.name}> page($!{tableInfo.name}Query query){
//queryPage(query) 根据条件查询
return new UIpage<>($!{tableInfo.obj.name}Service.queryPage(query));
}
/**
* 删除数据
*/
@RequestMapping("/delete")
@ResponseBody
public JsonResult delete(Long id){
try {
//ctrl+alt+t
$!{tableInfo.obj.name}Service.delete(id);
return new JsonResult();
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(e.getMessage(), false);
}
}
/**
* 添加数据
*/
@RequestMapping("/save")
@ResponseBody
public JsonResult save($!{tableInfo.name} $!{tableInfo.obj.name}){
return saveOrUpdate($!{tableInfo.obj.name});
}
/**
* 修改数据
*/
@RequestMapping("/update")
@ResponseBody
public JsonResult update(@ModelAttribute(value = "edit$!{tableInfo.name}")$!{tableInfo.name} $!{tableInfo.obj.name}){
return saveOrUpdate($!{tableInfo.obj.name});
}
private JsonResult saveOrUpdate($!{tableInfo.name} $!{tableInfo.obj.name}){
try {
$!{tableInfo.obj.name}Service.save($!{tableInfo.obj.name});
return new JsonResult();
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(e.getMessage(), false);
}
}
}
6.query
##引入宏定义
$!define
##使用宏定义设置回调(保存位置与文件后缀)
#save("/java/cn/potato/aisell/query", "Query.java")
##使用宏定义设置包后缀
#setPackageSuffix("query")
##使用全局变量实现默认包导入
$!autoImport
import $!{tableInfo.savePackageName}.domain.$!{tableInfo.name};
import com.github.wenhao.jpa.Specifications;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;
public class $!{tableInfo.name}Query extends BaseQuery {
#foreach($column in $tableInfo.otherColumn )
#if(${column.comment})/**
* ${column.comment}
*/#end
private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
@Override
public Specification creatSpec() {
Specification<$!{tableInfo.name}> spec = Specifications.<$!{tableInfo.name}>and()
.like(StringUtils.isNotBlank(name),"name","%"+name+"%")
.build();
return spec;
}
#foreach($column in $tableInfo.otherColumn)
##使用宏定义实现get,set方法 没法生成getset
#getSetMethod($column)
#end
}
7.js
##设置回调
##设置文件储存名字($tool.append($tableName, ".java"))
$!callback.setFileName( ${tool.append($!{tableInfo.obj.name}, ".js")})
##设置文件储存路径,默认使用选中路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/webapp/js/model"))
##类名的Repository
#set($tableName =$!{tableInfo.obj.name})
$(function () {
//经常使用的元素放在外部
var $!{tableInfo.obj.name}DataGrid = $("#$!{tableInfo.obj.name}DataGrid");
var $!{tableInfo.obj.name}Dialog = $("#$!{tableInfo.obj.name}Dialog");
var $!{tableInfo.obj.name}Form = $("#$!{tableInfo.obj.name}Form");
//为所有的有data-method的属性的元素添加事件
$("*[data-method]").on("click",function () {
var methodName = $(this).data("method");
itsource[methodName]();
})
//添加咱们的事件
itsource ={
//弹出添加框
add(){
//显示密码框
$!{tableInfo.obj.name}Dialog.find("div[show]").show();
$!{tableInfo.obj.name}Dialog.find("div[show]>input").textbox("enable");
//弹出添加框并绝对居中
$!{tableInfo.obj.name}Dialog.dialog("open").dialog("center");
//清空form表单中的数据
$!{tableInfo.obj.name}Form.form("clear");
},
//弹出修改框
edit(){
//1.获取到选中的行
var row = $!{tableInfo.obj.name}DataGrid.datagrid("getSelected");
//2.如果没有拿到这一行,给出提示
if(!row){
$.messager.alert('警告','请选中一行!',"warning");
return;
}
//隐藏密码框
$!{tableInfo.obj.name}Dialog.find("div[show]").hide();
$!{tableInfo.obj.name}Dialog.find("div[show]>input").textbox("disable");
//弹出添加框并绝对居中
$!{tableInfo.obj.name}Dialog.dialog("open").dialog("center");
//清空form表单中的数据
$!{tableInfo.obj.name}Form.form("clear");
//进行数据回显
$!{tableInfo.obj.name}Form.form("load",row);
},
//1.弹出 2.提交
//保存(添加与修改)功能
save() {
//准备默认的url路径
var url = "/$!{tableInfo.obj.name}/save";
//获到表单中的Id(有id就是修改)
var $!{tableInfo.obj.name}Id = $("#$!{tableInfo.obj.name}Id").val();
if($!{tableInfo.obj.name}Id){
url = "/$!{tableInfo.obj.name}/update?_cmd=update";
}
//表单的提交
$!{tableInfo.obj.name}Form.form('submit', {
//提交的路径
url: url,
//提交前的一些代码设置,主要用于做验证
//如果通过返回true,如果没有通过返回false(阻止提交)
onSubmit: function () {
return $(this).form('validate');
},
//保存成功,刷新页面,保存失败,给出提示
//注意:这里返回的是一个json字符串:{"success":true,"msg":null}
// 不是json对象,我们是没办法直接拿它的值的
success: function (data) {
var result = JSON.parse(data);
if(result.success){
//删除成功刷新页面
$!{tableInfo.obj.name}DataGrid.datagrid("reload");
}else{
//删除失败给出提示
$.messager.alert('错误',`失败的原因是:${result.msg}`,"error");
}
//关闭
$!{tableInfo.obj.name}Dialog.dialog("close");
}
})
},
//删除
remove(){
//1.获取到选中的行
var row = $!{tableInfo.obj.name}DataGrid.datagrid("getSelected");
//2.如果没有拿到这一行,给出提示
if(!row){
$.messager.alert('警告','请选中一行!',"warning");
return;
}
//3.有这一行,给出删除提示
$.messager.confirm('确认','您确认想要删除记录吗?',function(r){
if (r){
//4.确定删除->Ajax删除即可
$.get("/$!{tableInfo.obj.name}/delete",{id:row.id},function(result){
if(result.success){
//删除成功刷新页面
$!{tableInfo.obj.name}DataGrid.datagrid("reload");
}else{
//删除失败给出提示
$.messager.alert('错误',`失败的原因是:${result.msg}`,"error");
}
})
}
});
},
//查询数据(自己想办法)
search(){
//获取到相应的参数值
//拼接成一个json
var params = $("#searchForm").serializeObject();
$!{tableInfo.obj.name}DataGrid.datagrid("load",params);
},
//关闭弹出框
closeDlg(){
$!{tableInfo.obj.name}Dialog.dialog('close');
}
}
})
8.index
##设置回调
##设置文件储存名字($tool.append($tableName, ".java"))
$!callback.setFileName( "index.jsp")
##设置文件储存路径,默认使用选中路径
$!callback.setSavePath($tool.append($tableInfo.savePath, "/webapp/WEB-INF/views/$!{tableInfo.obj.name}"))
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/11/9
Time: 10:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%--easyui的样式--%>
<link rel="stylesheet" type="text/css" href="/easyui/themes/default/easyui.css">
<%--easyui的图标样式--%>
<link rel="stylesheet" type="text/css" href="/easyui/themes/icon.css">
<%--easyui的颜色包--%>
<link rel="stylesheet" type="text/css" href="/easyui/themes/color.css">
<%--jquery的js--%>
<script type="text/javascript" src="/easyui/jquery.min.js"></script>
<%--jquery的扩展js--%>
<script type="text/javascript" src="/easyui/plugin/jquery.jdirk.js"></script>
<%--easyui的核心js--%>
<script type="text/javascript" src="/easyui/jquery.easyui.min.js"></script>
<%--easyui的国际化--%>
<script type="text/javascript" src="/easyui/locale/easyui-lang-zh_CN.js"></script>
<%--引入当前domain对应的js--%>
<script type="text/javascript" src="/js/model/$!{tableInfo.obj.name}.js"></script>
</head>
<body>
<%--当前列表的工具栏--%>
<div id="toolbar">
<a href="#" data-method="add" class="easyui-linkbutton" data-options="iconCls:'icon-add',plain:true">添加</a>
<a href="#" data-method="edit" class="easyui-linkbutton" data-options="iconCls:'icon-edit',plain:true">修改</a>
<a href="#" data-method="remove" class="easyui-linkbutton" data-options="iconCls:'icon-remove',plain:true">删除</a>
<%--查询功能--%>
<form id="searchForm">
名称: <input name="name" id="name" class="easyui-textbox" style="width:80px">
<a href="#" data-method="search" class="easyui-linkbutton" iconCls="icon-search">搜索</a>
</form>
</div>
<%--当前页的列表展示--%>
<table class="easyui-datagrid" id="$!{tableInfo.obj.name}DataGrid"
data-options="url:'/$!{tableInfo.obj.name}/page',fit:true,toolbar:'#toolbar',
fitColumns:true,singleSelect:true,pagination:true">
<thead>
<tr>
<th data-options="field:'name',width:100">名称</th>
</tr>
</thead>
</table>
<%-- 添加弹出框(添加和修改) --%>
<div id="$!{tableInfo.obj.name}Dialog" class="easyui-dialog" style="width:400px" data-options="title:'数据操作',closed:true,modal:true,border:'thin',buttons:'#dlg-buttons'">
<form id="$!{tableInfo.obj.name}Form" method="post" novalidate style="margin:0;padding:20px 50px">
<input id="$!{tableInfo.obj.name}Id" type="hidden" name="id" />
<div style="margin-bottom:10px">
<input name="name" class="easyui-textbox" required="true" label="名称:" style="width:100%">
</div>
</form>
</div>
<div id="dlg-buttons">
<a href="javascript:void(0)" data-method="save" class="easyui-linkbutton c6" iconCls="icon-ok" style="width:90px">保存</a>
<a href="javascript:void(0)" data-method="closeDlg" class="easyui-linkbutton" iconCls="icon-cancel" style="width:90px">取消</a>
</div>
</body>
</html>
还有几个父类
BaseDomain
package cn.potato.aisell.domain;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
/**
* 注解,配置springData的一部分 告诉spring这是一个父类
*/
@MappedSuperclass
public class BaseDomain {
@Id
@GeneratedValue
protected Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
BaseQuery
package cn.potato.aisell.query;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
public abstract class BaseQuery {
//当前页
private int currentPage = 1;
//每页条数
private int pagesize = 10;
//排序字段名
private String orderName;
//排序方式 true 降序 false升序
private Boolean orderType = true;
//前端页面需要的值 将pagesize和currentPage转化一下
private int page;
private int rows;
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.pagesize = rows;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.currentPage = page;
}
//加抽象方法 保证子类都必须复写
public abstract Specification creatSpec();
//排序方法
public Sort creatSort(){
//如果orderName不为空才创建排序方法
if (StringUtils.isNotBlank(orderName)){
//判断orderType的值 true就是Sort.Direction.DESC false就是Sort.Direction.ASC
Sort sort = new Sort(orderType?Sort.Direction.DESC:Sort.Direction.ASC);
return sort;
}
return null;
}
public int getCurrentPage() {
return currentPage;
}
//springData拿到的是起始页 0 但是默认当前页是1,在springDate中是第二页
public int getJpaPage(){
return currentPage-1;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
public Boolean getOrderType() {
return orderType;
}
public void setOrderType(Boolean orderType) {
this.orderType = orderType;
}
}
BaseRepository
package cn.potato.aisell.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable;
/**
* 告诉spring这不是一个bean
* @param <T> 这是传的对象
* @param <ID> 这是主键
*/
@NoRepositoryBean
public interface BaseRepository<T,ID extends Serializable>
extends JpaRepository<T,ID>,JpaSpecificationExecutor<T> {
}
IBaseService
package cn.potato.aisell.service;
import cn.potato.aisell.query.BaseQuery;
import org.springframework.data.domain.Page;
import java.io.Serializable;
import java.util.List;
public interface IBaseService<T,ID extends Serializable> {
//增加和修改方法 没有ID就是新增 有ID就是修改 都是save方法
void save(T t);
void delete(ID id);
T findOne(ID id);
List<T> findAll();
//1.根据查询条件查找对应的数据
List<T> queryAll(BaseQuery query);
//2.根据查询条件查找到对应的分页数据
Page<T> queryPage(BaseQuery query);
//3.根据JPQL进行查询
//Object ...params 传的参数 可以有多个参数
List<Object> queryJpql(String jpql,Object ...params);
}
BaseServiceImpl
package cn.potato.aisell.service.impl;
import cn.potato.aisell.query.BaseQuery;
import cn.potato.aisell.repository.BaseRepository;
import cn.potato.aisell.service.IBaseService;
import org.apache.velocity.runtime.directive.Foreach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.io.Serializable;
import java.util.List;
public class BaseServiceImpl<T,ID extends Serializable> implements IBaseService<T,ID> {
@Autowired
private BaseRepository<T,ID> baseRepository;
@PersistenceContext
private EntityManager entityManager;
@Override
public void save(T t) {
baseRepository.save(t);
}
@Override
public void delete(ID id) {
baseRepository.delete(id);
}
@Override
public T findOne(ID id) {
return baseRepository.findOne(id);
}
@Override
public List<T> findAll() {
return baseRepository.findAll();
}
/**
*
* @param query
* @return
*/
@Override
public List<T> queryAll(BaseQuery query) {
//拿到排序
Sort sort =query.creatSort();
//拿到查寻条件
Specification<T> spec = query.creatSpec();
List<T> list = baseRepository.findAll(spec, sort);
return list;
}
@Override
public Page<T> queryPage(BaseQuery query) {
//先排序和分页
Sort sort = query.creatSort();
Pageable pageable = new PageRequest(query.getJpaPage(),query.getPagesize(),sort);
Specification spec = query.creatSpec();
Page<T> page = baseRepository.findAll(spec, pageable);
return page;
}
@Override
public List<Object> queryJpql(String jpql, Object... params) {
//拿到query对象 jpql语句
Query query = entityManager.createQuery(jpql);
//遍历 然后把数据放到quert中
for (int i = 0; i < params.length; i++) {
query.setParameter(i,params[i]);
}
return query.getResultList();
}
}
JsonResult
package cn.potato.aisell.common;
public class JsonResult {
private String msg;
private Boolean success = true;
public JsonResult(){}
public JsonResult(Boolean success,String msg){
this.msg = msg;
this.success = success;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
}
UIPage
package cn.potato.aisell.common;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* 传给前台的分页数据
* @param <T>
*/
public class UIpage<T> {
private Long total;
private List<T> rows;
public UIpage(Page<T> page){
this.total=page.getTotalElements();
this.rows=page.getContent();
}
public Long getTotal() {
return total;
}
public void setTotal(Long total) {
this.total = total;
}
public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
}
}