摘要
我觉得学的稍微好点的同学还是看的比较流畅的;我一直用我的思路去写出代码;就是想让大家不要去死记一些无聊又容易忘记的代码;我们作为开发者流程原理是很重要的;我的个人思路就(一)开始给人感觉一步一步开始搭建;目前咋们搭建好项目可以与数据库交互了,那么接下来我就想着;能不能将我的代码都是一键生成;这样的话开发的速度就又得提高;对于老手经常熟悉idea的开发者;都知道使用eazy code插件来自动生成;而今天我使用的就是属于自己一整套模板;而不是eazy code里面的模板;也就是生成自己写好的模板。但是我这里的话;可以给你们先来介绍介绍一下eazy coed插件以及如何使用。
介绍一下eazy code及使用
首先教大家在idea连接本地数据库:
选择自己数据库类型;然后填写自己的数据库信息:
在连接之前可以点击Test Connection先测试一下;出现Successful就表明连接成功。
然后下载eazy code 插件;直接File->Settings->Plugins在这个页面上面点击Marketplace直接搜索eazy code 然后点击安装重启;重启后File->Settings->Other Settings->eazy code 点击重置默认配置就可以了。怎么用呢;之前我们已经连接好数据库了;我们在idea中再次打开数据库;这个时候注意一点很多人连接上数据库但是打开没表;原因是自己没选择;点击0 of xx(数量)下面就有选择了显示了。
然后对要生成的表右击;选择点击如下:
然后就会弹出选择的一些生成代码选项:
虽然是很简单;所以生成的东西也就会很简单;但是对于一些很多不满足这些的开发来说;这个都是些小ks;因为有许多开发者更想自动生成许多;自己也就改改一下就行;所以说有些开发者高手就是懒出来的;对于初学者来说这已经感觉到莫大的恩赐了;下面我要教的是另外自己定义的插件模板,所以该动起来就方便多了,别人的终究还是别人的;搞一套自己的还是舒适得多。话不多说;开始:
首先原理我在这里声明一下:
一句话概括:就是从数据库中查询到的所有信息填充渲染到模板里面。
第一步:
加载velocity模板包:
<!--velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
第二步:
然后加载一整套模板:
vm模板文件内容我就将所有的代码放在一起;你们到时候在最下面下载就可以了。
我这一套模板的样式和js都是根据目前大家开发者都会使用的比如jquery;bootstrap;我也是为了演示给大家看看;加载一些样式;自己定义的模板当然随便自己定义样式页面。
第三步:
既然是已经将模板拷贝到项目中了;刚说是将查询到的数据信息填充到这个模板里;那么首先还得先获取到数据;在mybatisMapper中建立一个GenMapper.xml文件
<?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="com.lp.demo.gen.mapper.GenMapper">
<resultMap type="TableInfo" id="TableInfoResult">
<id property="tableName" column="table_name"/>
<result property="tableComment" column="table_comment"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
<resultMap type="ColumnInfo" id="ColumnInfoResult">
<id property="columnName" column="column_name"/>
<result property="dataType" column="data_type"/>
<result property="columnComment" column="column_comment"/>
</resultMap>
<sql id="selectGenVo">
select table_name, table_comment, create_time, update_time
from information_schema.tables
</sql>
<select id="selectTableList" parameterType="TableInfo" resultMap="TableInfoResult">
<include refid="selectGenVo"/>
where table_comment <![CDATA[ <> ]]> '' and table_schema = (select database())
<if test="tableName != null and tableName != ''">
AND table_name like concat('%', #{tableName}, '%')
</if>
<if test="tableComment != null and tableComment != ''">
AND table_comment like concat('%', #{tableComment}, '%')
</if>
<--<if test="params != null and params.beginTime != ''"><!-- 开始时间检索 -->
and date_format(create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
</if>
<if test="params != null and params.endTime != ''"><!-- 结束时间检索 -->
and date_format(create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
</if>-->
</select>
<select id="selectTableByName" parameterType="String" resultMap="TableInfoResult">
<include refid="selectGenVo"/>
where table_comment <![CDATA[ <> ]]> '' and table_schema = (select database())
and table_name = #{tableName}
</select>
<select id="selectTableColumnsByName" parameterType="String" resultMap="ColumnInfoResult">
select column_name, data_type, column_comment
from information_schema.columns
where table_name = #{tableName}
and table_schema = (select database())
order by ordinal_position
</select>
</mapper>
这个就是来查询到关于表及字段的信息内容;注释:
<–
and date_format(create_time,’%y%m%d’) >= date_format(#{params.beginTime},’%y%m%d’)
and date_format(create_time,’%y%m%d’) <= date_format(#{params.endTime},’%y%m%d’)
–>这一段代码我是用到基类;所谓的基类就是该父类;我这里只是做了一个基类的封装;将各个使用到的相同的属性提取出来。你们在这里可以用order by create_time代替或者你在(TableInfo)bean类多加几个属性。
以及整个结构目录搭建:
第四步:
当然就是一系类大家最熟悉操作;做domain类,mapper映射;service层以及最终交给serviceImpl实现层做最终的处理;这些都是一些基本开发人员的熟练的东西了,写完这些后;我们将在serviceImpl层做最终的处理;这里最重要的就是理解这个工具类和初始化模板;数据我们是可以拿到了;但是问题就是如何将数据填充到模板里呢;这才是最重要的实现:
首先我们先要拿到模板;所以这里定义一个工具类:
package com.lp.demo.gen.util;
import java.util.ArrayList;
import java.util.List;
import com.lp.demo.common.DateUtils;
import com.lp.demo.common.StringUtils;
import com.lp.demo.constant.CommonMap;
import com.lp.demo.constant.Constants;
import com.lp.demo.framework.config.GenConfig;
import com.lp.demo.gen.domain.ColumnInfo;
import com.lp.demo.gen.domain.TableInfo;
import org.apache.velocity.VelocityContext;
/**
* 代码生成器 工具类
*
* @author ruoyi
*/
public class GenUtils {
/**
* 项目空间路径
*/
private static final String PROJECT_PATH = "main/java/com/lp/demo";
/**
* mybatis空间路径
*/
private static final String MYBATIS_PATH = "main/resources/mybatisMapper";
/**
* html空间路径
*/
private static final String TEMPLATES_PATH = "main/resources/templates";
/**
* 设置列信息
*/
public static List<ColumnInfo> transColums(List<ColumnInfo> columns) {
// 列信息
List<ColumnInfo> columsList = new ArrayList<>();
for (ColumnInfo column : columns) {
// 列名转换成Java属性名
String attrName = StringUtils.convertToCamelCase(column.getColumnName());
column.setAttrName(attrName);
column.setAttrname(StringUtils.uncapitalize(attrName));
// 列的数据类型,转换成Java类型
String attrType = CommonMap.javaTypeMap.get(column.getDataType());
column.setAttrType(attrType);
columsList.add(column);
}
return columsList;
}
/**
* 获取模板信息
*
* @return 模板列表
*/
public static VelocityContext getVelocityContext(TableInfo table) {
// java对象数据传递到模板文件vm
VelocityContext velocityContext = new VelocityContext();
String packageName = GenConfig.getPackageName();
velocityContext.put("tableName", table.getTableName());
velocityContext.put("tableComment", replaceKeyword(table.getTableComment()));
velocityContext.put("primaryKey", table.getPrimaryKey());
velocityContext.put("className", table.getClassName());
velocityContext.put("classname", table.getClassname());
velocityContext.put("moduleName", GenUtils.getModuleName(packageName));
velocityContext.put("columns", table.getColumns());
velocityContext.put("package", packageName + "." + table.getClassname());
velocityContext.put("author", GenConfig.getAuthor());
velocityContext.put("datetime", DateUtils.getDate());
return velocityContext;
}
/**
* 获取模板信息
*
* @return 模板列表
*/
public static List<String> getTemplates() {
List<String> templates = new ArrayList<String>();
templates.add("templates/vm/java/domain.java.vm");
templates.add("templates/vm/java/Mapper.java.vm");
templates.add("templates/vm/java/Service.java.vm");
templates.add("templates/vm/java/ServiceImpl.java.vm");
templates.add("templates/vm/java/Controller.java.vm");
templates.add("templates/vm/xml/Mapper.xml.vm");
templates.add("templates/vm/html/list.html.vm");
templates.add("templates/vm/html/add.html.vm");
templates.add("templates/vm/html/edit.html.vm");
templates.add("templates/vm/sql/sql.vm");
return templates;
}
/**
* 表名转换成Java类名
*/
public static String tableToJava(String tableName) {
if (Constants.AUTO_REOMVE_PRE.equals(GenConfig.getAutoRemovePre())) {
tableName = tableName.substring(tableName.indexOf("_") + 1);
}
if (StringUtils.isNotEmpty(GenConfig.getTablePrefix())) {
tableName = tableName.replace(GenConfig.getTablePrefix(), "");
}
return StringUtils.convertToCamelCase(tableName);
}
/**
* 获取文件名
*/
public static String getFileName(String template, TableInfo table, String moduleName) {
// 小写类名
String classname = table.getClassname();
// 大写类名
String className = table.getClassName();
String javaPath = PROJECT_PATH + "/" + moduleName + "/";
String mybatisPath = MYBATIS_PATH + "/" + moduleName + "/" + className;
String htmlPath = TEMPLATES_PATH + "/" + moduleName + "/" + classname;
if (StringUtils.isNotEmpty(classname)) {
javaPath += classname.replace(".", "/") + "/";
}
if (template.contains("domain.java.vm")) {
return javaPath + "domain" + "/" + className + ".java";
}
if (template.contains("Mapper.java.vm")) {
return javaPath + "mapper" + "/" + className + "Mapper.java";
}
if (template.contains("Service.java.vm")) {
return javaPath + "service" + "/" + "I" + className + "Service.java";
}
if (template.contains("ServiceImpl.java.vm")) {
return javaPath + "service" + "/" + className + "ServiceImpl.java";
}
if (template.contains("Controller.java.vm")) {
return javaPath + "controller" + "/" + className + "Controller.java";
}
if (template.contains("Mapper.xml.vm")) {
return mybatisPath + "Mapper.xml";
}
if (template.contains("list.html.vm")) {
return htmlPath + "/" + classname + ".html";
}
if (template.contains("add.html.vm")) {
return htmlPath + "/" + "add.html";
}
if (template.contains("edit.html.vm")) {
return htmlPath + "/" + "edit.html";
}
if (template.contains("sql.vm")) {
return classname + "Menu.sql";
}
return null;
}
/**
* 获取模块名
*
* @param packageName 包名
* @return 模块名
*/
public static String getModuleName(String packageName) {
int lastIndex = packageName.lastIndexOf(".");
int nameLength = packageName.length();
String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength);
return moduleName;
}
public static String replaceKeyword(String keyword) {
String keyName = keyword.replaceAll("(?:表|信息)", "");
return keyName;
}
public static void main(String[] args) {
System.out.println(StringUtils.convertToCamelCase("user_name"));
System.out.println(replaceKeyword("岗位信息表"));
System.out.println(getModuleName("com.ruoyi.project.system"));
}
}
该类主要就是获取模板以及将表转换为java类型;前面定义的路径是生成文件的层次路径而不是将文件生成到那个的路径。 还有就是模板的初始化类;这个类将在初始化数据前先初始化模板;
package com.lp.demo.gen.util;
import java.util.Properties;
import com.lp.demo.constant.Constants;
import org.apache.velocity.app.Velocity;
/**
* VelocityEngine工厂
*
* @author RuoYi
*/
public class VelocityInitializer {
/**
* 初始化vm方法
*/
public static void initVelocity() {
Properties p = new Properties();
try {
// 加载classpath目录下的vm文件
p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 定义字符集
p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
// 初始化Velocity引擎,指定配置Properties
Velocity.init(p);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
**第五步:**所有的东西可以说是都准备好了;就是如何调用了;下面从controller来做一步一步的调用讲解:
代码生成的具体操作是(serviceImpl)实现类做的:
项目下载地址:https://pan.baidu.com/s/117pvxwxng3qRaJS5r0KHNg
提取码:7qdt
总结:velocity引擎与mybtis相结合;你们学会了么;欢迎大家多多评论;第一时间为大家解惑,谢谢大家的支持!