用Freemarker制作代码生成器生成mybatis.xml和java代码

利用Mybatisplus-generator+freemarker编写一个独属于你的springboot代码生成程序 在 Spring Boot 框架中,我们经常需要进行数据库开发,编写 CRUD 代码是一个重复且繁琐的工作。为了提高开发效率和代码质量,我们可以利用 Mybatisplus-generator+freemarker 自定义代码生成程序。 通过配置 Mybatisplus-generator,我们可以轻松地生成实体类、Mapper、Service、Controller 等常用的代码文件。同时,借助 freemarker 模板引擎,我们可以自定义代码文件的生成规则和规范,让生成的代码更加符合实际业务需求。 阅读详情

一、外键对象简单封装

@Setter
@Getter
public class AssociationObject {
	private String property;
	private String columnPrefix;
	private String javaType;
}

二、类型的判断

            用来判断是否是java中的类型,若是java中的类型,则为不可能为是外键,若是自定义类型,则就该字段就是关联的外键。mybatis.xml生成文件中可以根据是否是外键生成关联查询。

public class JudgeType {
	public static boolean judgeType(String type) {
		String javaType = "";
		if (type.contains(".")) {
			//类型的截取
			int lastIndexOf = type.lastIndexOf(".");
			javaType = type.substring(lastIndexOf + 1);
		} else {
			javaType = type;
		}
		switch (javaType) {
		case "int":
			return true;
		case "Integer":
			return true;
		case "long":
			return true;
		case "Long":
			return true;
		case "double":
			return true;
		case "Double":
			return true;
		case "String":
			return true;
		case "BigDecimal":
			return true;
		case "Boolean":
			return true;
		case "boolean":
			return true;
		case "Date":
			return true;
		default:
			return false;
		}
	}
}

三、类型转换

        将java中的类型转换为数据中的类型,在执行create table的时候要用到。

/**
 * @version 创建时间:2017-1-22 下午7:25:25
 * @Description 描述:类型转换器,把mysql中的类型转为java中的类型
 */
public class TypeConverter {
	/**
	 * @param type
	 *            java中的类型
	 * @return mySql中的数据类型
	 * @Description 描述:把传进来的java类型,类型转换为数据库中的类型
	 */
	public static String javaType2MySqlType(Entry<String, String> entry) {
		String javaType = "";
		if (entry.getValue().contains(".")) {
			// 类型的截取
			int lastIndexOf = entry.getValue().lastIndexOf(".");
			javaType = entry.getValue().substring(lastIndexOf + 1);
		} else {
			javaType = entry.getValue();
		}

		switch (javaType) {

		case "String":
			return entry.getKey() + " VARCHAR(255) ,";

		case "byte[]":
			return entry.getKey() + " BLOB ,";

		case "int":
			return entry.getKey() + " INTEGER ,";

		case "Integer":
			return entry.getKey() + " INTEGER ,";

		case "Boolean":
			return entry.getKey() + " BIT ,";

		case "boolean":
			return entry.getKey() + " BIT ,";

		case "Long":
			return entry.getKey() + " BIGINT ,";

		case "long":
			return entry.getKey() + " BIGINT ,";

		case "float":
			return entry.getKey() + " FLOAT ,";

		case "Float":
			return entry.getKey() + " FLOAT ,";

		case "double":
			return entry.getKey() + " DOUBLE ,";

		case "Double":
			return entry.getKey() + " DOUBLE ,";

		case "BigDecimal":
			return entry.getKey() + " DECIMAL ,";

		case "Date":
			return entry.getKey() + " DATETIME,";

		default:
			return entry.getKey() + "_id Long,";
		}
	}

}

三、实体类相关信息封装

            在freemarker模板方法中行成mybatis.xml时要用到。

@Setter
@Getter
public class ClassInfo {
	private String basePackage; // 基本包
	private String bigClassName; // 大写类名
	private String smallClassName;// 首字母小写的类名
	private LinkedHashMap<String, String> fieldMap = new LinkedHashMap<>();
	private List<String> genericFieldList = new ArrayList<>();
	private LinkedHashMap<String, String> importFieldMap = new LinkedHashMap<>();
	private List<AssociationObject> association = new ArrayList<>();

	private String insert;
	private String delete;
	private String update;
	private String selectByPrimaryKey;
	private String selectAll;
	private String queryForCount;
	private String queryListData;
	private String limit;

	public ClassInfo(Class<?> clazz) throws Exception {
		String pkgName = clazz.getPackage().getName();
		this.basePackage = pkgName.substring(0, pkgName.lastIndexOf("."));
		this.bigClassName = clazz.getSimpleName();
		this.smallClassName = this.bigClassName.substring(0, 1).toLowerCase() + this.bigClassName.substring(1);
		this.getObjectFiled(clazz);
	}

	public void getObjectFiled(Class<?> clazz) throws Exception {
		// 创建父类对象
		Object currentObject = clazz.getDeclaredConstructor().newInstance();
		if (currentObject instanceof BaseDomain) {
			Field[] fields = clazz.getDeclaredFields();
			for (Field field : fields) {
				// java中的修饰码 如public 1 private 2 protect 4 static 8
				if (field.getModifiers() < 8) {
					// 集合类型的不添加
					if (!field.getType().getName().endsWith("List") && !field.getType().getName().endsWith("Map")) {
						this.fieldMap.put(field.getName(), field.getType().getName());
					}
				}
			}
			// 递归调用父类中的方法
			getObjectFiled(clazz.getSuperclass());
		}
	}
}


四、代码生成器MyGenerator具体实现

           详情可以参考ftl入门到放弃。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * @version 创建时间:2017-2-22 下午11:21:27
 * @Description 描述:Mybatis代码生成器
 */
public class MyGenerator {
	private static final int FEILDL_ENGTH = 1;// 统一定义截取字符串的长度为多少字母

	public static void main(String[] args) throws Exception {

		ClassInfo info = new ClassInfo(BlogType.class);

		// 创建表
		createTable(info);

		// 生成xml文件
		createMyBatisXML(info, "Mapper.xml", "src/main/java/{0}/mapper/{1}Mapper.xml");

		// mapper接口
		createMapper(info, "Mapper.java", "src/main/java/{0}/mapper/{1}Mapper.java");

		// 生成QueryOBject
		createQueryObject(info, "QueryObject.java", "src/main/java/{0}/query/{1}QueryObject.java");

		// 生成Service接口
		createService(info, "IService.java", "src/main/java/{0}/service/I{1}Service.java");

		// 生成Service实现类
		createServiceImpl(info, "ServiceImpl.java", "src/main/java/{0}/service/impl/{1}ServiceImpl.java");
	}

	@SuppressWarnings("deprecation")
	private static Configuration config = new Configuration();
	static {
		try {
			config.setDirectoryForTemplateLoading(new File("templates"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void createQueryObject(ClassInfo info, String templateFile, String targetFile) throws Exception {
		createFile(info, templateFile, targetFile);
		System.out.println("生成" + info.getBigClassName() + "QueryObject");
	}

	public static void createMapper(ClassInfo info, String templateFile, String targetFile) throws Exception {
		createFile(info, templateFile, targetFile);
		System.out.println("生成" + info.getBigClassName() + "Mapper接口");
	}

	public static void createService(ClassInfo info, String templateFile, String targetFile) throws Exception {
		createFile(info, templateFile, targetFile);
		System.out.println("生成I" + info.getBigClassName() + "Service接口");
	}

	public static void createServiceImpl(ClassInfo info, String templateFile, String targetFile) throws Exception {
		createFile(info, templateFile, targetFile);
		System.out.println("生成" + info.getBigClassName() + "ServiceImpl实现");
	}

	public static void createController(ClassInfo info, String templateFile, String targetFile) throws Exception {
		createFile(info, templateFile, targetFile);
		System.out.println("生成" + info.getBigClassName() + "Controller文件");
	}

	// 数据库表的创建
	public static void createTable(ClassInfo info) throws SQLException {
		StringBuilder sql = new StringBuilder();
		sql.append("CREATE TABLE ").append(info.getBigClassName());
		LinkedHashMap<String, String> propertys = info.getFieldMap();
		ListIterator<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(propertys.entrySet())
				.listIterator(propertys.size());
		sql.append(" ( ");
		while (list.hasPrevious()) {
			Map.Entry<String, String> entry = list.previous();
			if ("id".equals(entry.getKey())) {
				// 主键拼接
				sql.append("id " + "BIGINT PRIMARY KEY auto_increment ,");
			} else {
				// 非主键拼接
				sql.append(TypeConverter.javaType2MySqlType(entry));
			}
		}
		sql.append(" ); ");
		sql.deleteCharAt(sql.lastIndexOf(","));
		// 创建连接
		Connection con = JDBCUtil.getConnection();
		PreparedStatement ps = con.prepareStatement(sql.toString());
		boolean result = ps.execute();
		if (result) {
			throw new RuntimeException("创建表" + info.getBigClassName() + "异常!!!");
		} else {
			System.out.println("创建表" + info.getBigClassName() + "成功!");
		}

	}

	// 其他java文件的创建
	private static void createFile(ClassInfo info, String templateFile, String targetFile) throws Exception {
		// System.out.println(MessageFormat.format("你好{0},明天去{1}", "小强","打球"));
		Template template = config.getTemplate(templateFile);
		targetFile = MessageFormat.format(targetFile, info.getBasePackage().replace(".", "/"), info.getBigClassName());
		System.out.println(templateFile);
		System.out.println(targetFile);
		File file = new File(targetFile);
		// 如果文件存在则报错,不会覆盖以前的文件
		if (file.exists()) {
			throw new RuntimeException(file.getName() + "已经存在!");
		}
		File parentFile = file.getParentFile();
		// 创建文件目录
		if (!parentFile.exists()) {
			parentFile.mkdirs();
		}
		template.process(info, new FileWriter(file));
	}

	// Mybatis文件的创建
	private static void createMyBatisXML(ClassInfo info, String templateFile, String targetFile) throws Exception {

		LinkedHashMap<String, String> propertys = info.getFieldMap();
		LinkedHashMap<String, String> importFieldMap = info.getImportFieldMap();
		List<String> genericFieldList = info.getGenericFieldList();
		List<AssociationObject> association = info.getAssociation();
		StringBuilder insert1 = new StringBuilder().append("insert into " + info.getBigClassName() + "  (");
		StringBuilder insert2 = new StringBuilder().append("  values( ");

		StringBuilder delete = new StringBuilder().append("delete from " + info.getBigClassName() + " where id =#{id}");

		StringBuilder update = new StringBuilder().append("update " + info.getBigClassName() + " set ");

		StringBuilder selectselectByPrimaryKey = new StringBuilder().append("select ");

		ListIterator<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(propertys.entrySet())
				.listIterator(propertys.size());
		while (list.hasPrevious()) {

			String key = list.previous().getKey();

			System.out.println(key);
			String value = propertys.get(key);
			if (JudgeType.judgeType(value)) {
				// 插入时不需要主键
				if (!key.equals("id")) {
					genericFieldList.add(key);
					insert1.append(" " + key + " ,");
					insert2.append(" #{" + key + "} ,");
					update.append(" " + key + "=#{" + key + "}, ");
				}
				selectselectByPrimaryKey
						.append(info.getSmallClassName().subSequence(0, MyGenerator.FEILDL_ENGTH) + "." + key + ", ");
			} else {
				// 外键关联的相关属性
				AssociationObject associationObject = new AssociationObject();
				associationObject.setColumnPrefix(key.substring(0, MyGenerator.FEILDL_ENGTH) + "_");
				associationObject.setProperty(key);
				associationObject.setJavaType(value);
				association.add(associationObject);
				insert1.append(" " + key + "_id ,");
				insert2.append(" #{" + key + ".id} ,");

				update.append(" " + key + "_id=#{" + key + ".id}, ");
				int index = value.lastIndexOf(".");
				value = value.substring(index + 1);

				importFieldMap.put(key, value);

			}
		}
		int index = insert1.lastIndexOf(",");
		String str1 = insert1.substring(0, index) + " )";
		index = insert2.lastIndexOf(",");
		String str2 = insert2.substring(0, index) + " )";
		// 增加
		info.setInsert(str1 + str2);
		System.out.println("增加操作  " + str1 + str2);

		// 删除
		info.setDelete(delete.toString());
		System.out.println("删除操作  " + delete.toString());

		index = update.lastIndexOf(",");
		String subUpdate = update.substring(0, index);
		subUpdate = subUpdate + " where id=#{id}";
		// 更改操作
		info.setUpdate(subUpdate);
		System.out.println("更改操作  " + subUpdate);
		// 判断是否有外键
		if (importFieldMap.size() <= 0) {
			index = selectselectByPrimaryKey.lastIndexOf(",");
			String str = selectselectByPrimaryKey.substring(0, index);

			// 条数的查询
			String queryForCount = "select count(" + info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH)
					+ ".id" + ") from " + info.getBigClassName() + " "
					+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH);
			info.setQueryForCount(queryForCount);
			System.out.println("查询条数  " + queryForCount);

			// 查询结果集
			info.setQueryListData(str + " from " + info.getSmallClassName() + " "
					+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH));
			System.out.println("查询所有  " + str + " from " + info.getSmallClassName() + " "
					+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH));
			// 分页相关
			info.setLimit("limit #{currentPage},#{pageSize}");

			str = str + " from " + info.getSmallClassName() + " where "
					+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH) + ".id=#{id}";

			// 根据主键的查询
			info.setSelectByPrimaryKey(str);
			System.out.println("主键查询  " + str);

		} else {
			Set<Entry<String, String>> entrySet = importFieldMap.entrySet();
			for (Entry<String, String> entry : entrySet) {
				selectselectByPrimaryKey.append(entry.getKey().substring(0, MyGenerator.FEILDL_ENGTH) + ".id as "
						+ entry.getKey().substring(0, MyGenerator.FEILDL_ENGTH) + "_id ,");
			}
			index = selectselectByPrimaryKey.lastIndexOf(",");
			String str = selectselectByPrimaryKey.substring(0, index);
			str = str + " from " + info.getBigClassName() + "  "
					+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH);
			for (Entry<String, String> entry : entrySet) {
				str = str + " left join " + entry.getValue() + " "
						+ entry.getKey().substring(0, MyGenerator.FEILDL_ENGTH) + " on " + "("
						+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH) + "." + entry.getKey()
						+ "_id=" + entry.getKey().substring(0, MyGenerator.FEILDL_ENGTH) + ".id)";
			}

			String queryForCount = "select count(" + info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH)
					+ ".id" + ") from " + info.getBigClassName() + " "
					+ info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH);
			info.setQueryForCount(queryForCount);
			System.out.println("查询条数  " + queryForCount);

			// 查询结果集
			info.setQueryListData(str);
			System.out.println("查询所有  " + str);
			// 分页相关
			info.setLimit("limit #{start},#{pageSize}");

			str = str + " where " + info.getSmallClassName().substring(0, MyGenerator.FEILDL_ENGTH) + ".id=#{id}";

			// 根据主键的查询
			info.setSelectByPrimaryKey(str);
			System.out.println("主键查询  " + str);
		}

		Template template = config.getTemplate(templateFile);
		targetFile = MessageFormat.format(targetFile, info.getBasePackage().replace(".", "/"), info.getBigClassName());
		File file = new File(targetFile);
		File parentFile = file.getParentFile();
		// 创建文件目录
		if (!parentFile.exists()) {
			parentFile.mkdirs();
		}
		// 生成xml文件
		template.process(info, new FileWriter(file));
	}
}

五、模板示意图

 


IService.java文件模板:

package ${basePackage}.service;

import java.util.List;

import ${basePackage}.page.PageResult;
import ${basePackage}.domain.${bigClassName};
import ${basePackage}.query.${bigClassName}QueryObject;

public interface I${bigClassName}Service {

	void insert(${bigClassName} ${smallClassName});

	void delete(${bigClassName} ${smallClassName});

	${bigClassName} select(${bigClassName} ${smallClassName});

	void update(${bigClassName} ${smallClassName});

	PageResult query(${bigClassName}QueryObject qo);

	List<${bigClassName}> queryForList(${bigClassName}QueryObject qo);

}


Mapper.java接口模板:

package ${basePackage}.mapper;

import java.util.List;

import ${basePackage}.domain.${bigClassName};
import ${basePackage}.query.${bigClassName}QueryObject;

public interface ${bigClassName}Mapper {
	
	void insert(${bigClassName} ${smallClassName});

	void delete(${bigClassName} ${smallClassName});

	void update(${bigClassName} ${smallClassName});
	
	${bigClassName} select(${bigClassName} ${smallClassName});
	
	int queryTotalCount(${bigClassName}QueryObject qo);

	List<${bigClassName}> queryListData(${bigClassName}QueryObject qo);
}

Mapper.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="${basePackage}.mapper.${bigClassName}Mapper">
	<resultMap id="${smallClassName}ResultMap" type="${basePackage}.domain.${bigClassName}">
		<id column="id" property="id" jdbcType="BIGINT" />
		<#list genericFieldList as genericField>
		<result column="${genericField}" property="${genericField}" />
		</#list>
		<#list association as item>
		<association property="${item.property}" columnPrefix="${item.columnPrefix}"
			javaType="${item.javaType}">
			<!-- 对象的关联 -->
			<id property="id" column="id"></id>
		</association>
		</#list>

	</resultMap>

	<insert id="insert" useGeneratedKeys="true" keyProperty="id">
		${insert}
	</insert>

	<delete id="delete">
		${delete}
	</delete>

	<update id="update">
		${update}
	</update>

	<select id="select" resultMap="${smallClassName}ResultMap">
		${selectByPrimaryKey}
	</select>

	<select id="queryTotalCount" resultType="int">
		${queryForCount}
	</select>

	<select id="queryListData" resultMap="${smallClassName}ResultMap">
		${queryListData}
		<if test="pageSize>=0">
			${limit}
		</if>
	</select>

</mapper>

QueryObject.java模板代码:

package ${basePackage}.query;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class ${bigClassName}QueryObject extends QueryObject {

}

ServiceImpl.java模板代码:

package ${basePackage}.service.impl;

import java.util.List;

import ${basePackage}.page.PageResult;

import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import ${basePackage}.domain.${bigClassName};
import ${basePackage}.mapper.${bigClassName}Mapper;
import ${basePackage}.query.${bigClassName}QueryObject;
import ${basePackage}.service.I${bigClassName}Service;


@Service
public class ${bigClassName}ServiceImpl implements I${bigClassName}Service {

	@Autowired
	private ${bigClassName}Mapper ${smallClassName}Mapper;

	@Override
	public void insert(${bigClassName} ${smallClassName}) {

		${smallClassName}Mapper.insert(${smallClassName});
	}
	
	@Override
	public void delete(${bigClassName} ${smallClassName}){
		
		${smallClassName}Mapper.delete(${smallClassName});
	}
	
	@Override
	public void update(${bigClassName} ${smallClassName}) {
		this.${smallClassName}Mapper.update(${smallClassName});
	}
    

	@Override
	public ${bigClassName} select(${bigClassName} ${smallClassName}) {
		return this.${smallClassName}Mapper.select(${smallClassName});
	}

	@Override
	public PageResult query(${bigClassName}QueryObject qo) {
		
		int count = ${smallClassName}Mapper.queryTotalCount(qo);
		
		if (count > 0) {
			List<${bigClassName}> list = ${smallClassName}Mapper.queryListData(qo);
			return new PageResult(qo.getCurrentPage(), qo.getPageSize(), count, list);
		}
		return PageResult.empty(qo.getPageSize());
	}

	@Override
	public List<${bigClassName}> queryForList(${bigClassName}QueryObject qo) {
		return ${smallClassName}Mapper.queryListData(qo);
	}
}

Mybatis-Plus使用freemarker模板快速生成代码 【代码】Mybatis-Plus使用freemarker模板快速生成代码。 阅读详情

相关推荐

【Mybatis/Mybatis-plus】:代码生成器之模板引擎方式(freemarker)

前言 代码生成器模板 mybatis-plus + Freemarker模板引擎 导入相关依赖 <!-- 若要整合springboot,需要注意版本之间的问题 springboot版本对于mybatis-plus-boot-starter不兼容 ·--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter<

源僧 3473

FreeMarker 生成Java、mybatis文件

FreeMarker 生成Java、mybatis文件 将mysql数据库表通过FreeMarker生成对应的Java文件和对应的mybatis文件。 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程...

weixin_30549175的博客 320

【JAVA实例】代码生成器的原理讲解以及实际使用

原理:利用Freemarker技术,通过java加载Freemarker模板,将前台输入的参数填入模板里面,通过FileZip压缩一个zip包,然后自动下载下来 1.预先定义好模板   2.界面输入相关参数   3.解析模板生成代码并下载 最后放出源代码: package com.et.controller.system

jxausea的专栏 6470

[瞎折腾]使用freemarker编写MyBatis的Mapper.xml自动生成工具

为什么80%的码农都做不了架构师?>>> ...

weixin_34080951的博客 775

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路

本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。

weixin_29220405的博客 263

MATLAB仿真耗散孤子共振与金兹堡-朗道方程解析

耗散孤子共振(DSR)是非线性光学中的特殊脉冲现象,通过平衡非线性效应、色散与能量耗散实现稳定传输。其核心数学模型金兹堡-朗道方程(GLE)描述了光脉冲在增益介质中的演化规律,采用分步傅里叶方法(SSFM)可高效求解这类非线性偏微分方程。该技术在光纤激光器设计、高速光通信系统优化等领域具有重要价值,特别是在需要高能量脉冲保持稳定传输的场景。MATLAB数值仿真为理解DSR物理机制提供了直观工具,通过参数扫描可验证脉冲能量与宽度的线性关系特征,并为实际器件设计提供预测依据。

weixin_31240035的博客 256

使用FreeMarker和Mybatis Generator实现的代码生成工具

日常开发过程中,经常需要快速生成一些简易代码,该工具使用 FreeMarker 和 Mybatis Generator 实现,可以通过表名自动生成 Model、Mapper、Service、Controller,另外还集成了通用Mapper(tk.mybatis),除了一些特殊的业务逻辑之外不需要写任何 SQL,只需要写好实体类及 Mapper 文件中对应的字段即可支持相应的增删改查方法,大大提高了开发效率。 - 生成实体类,集成 Lombok 插件,实体类包含表注释 - 生成 Mapper.xml文件,

fangyunzhe的博客 1008

从零开始:用AutoLisp为AutoCAD定制专属工具栏(2023最新版)

本文详细介绍了如何利用AutoLisp语言为AutoCAD定制专属工具栏,以提升绘图效率。内容涵盖从环境配置、AutoLisp基础语法到实战开发的全过程,指导用户编写自动化脚本、封装功能函数,并最终通过CUI编辑器创建和部署个性化工具栏按钮,是2023年CAD用户实现工作流自动化与个性化的实用指南。

4k5l6j7h8的博客 299

SpringBoot中几种好用的代码生成器(基于Mybatis-plus生成entity、mapper、xml等)

熟悉Spring框架的同学一定都知道MVC开发模式吧,控制器(Controller)、业务类(Service)、持久层(Repository)、数据库映射(Mapper)、各种DO类构成了我们服务端的代码。初学的时候,觉得新鲜手写这些东西不觉得有啥,但是写久了就会觉得很烦。好不容易在数据库中写完了一遍字段,在Java代码又要写一遍,不仅很枯燥,关键是还容易写错!!!这种工具不仅有,而且有很多,首先推荐一个最最简单的:在线版Java代码生成器 如果有用过bejson在线工具的小伙伴,应该很熟悉,不过这个工具有

summon的博客 1万+

CDD那些事 - DID and SecurityAccess

本文介绍了SecurityAccessSID27的安全访问配置流程:1.通过StateGroups添加Level2群组;2.在Classes定义L2子功能;3.配置4步解锁流程,选择对应解锁等级;4.在DiagnosticInstance设置请求响应。同时说明了DID配置的两种方式:在DIDs页面定义或通过Identification页面创建,前者定义更全面。文章还提到ServiceList支持view/edit模式,其中edit模式可配置DID的多服务支持(如同时支持SID22读取和SID2E写入),但该

ziteng21的博客 255

基于深度学习的水质预测:多参数监测与预测

首先,我们需要收集水质监测的多参数数据。收集到的数据应包括不同时间点的水质参数值以及相应的水质等级标签,用于训练和评估深度学习模型。同时,数据的质量和数量对于模型的性能也有重要影响,因此在实际应用中需要充分考虑数据的采集和处理过程。总之,基于深度学习的水质预测可以通过收集水质监测的多参数数据并使用适当的深度学习模型进行训练和预测来实现。通过以上的深度学习模型,我们可以利用水质监测的多参数数据进行水质预测。这种基于深度学习的方法可以提高水质预测的准确性和稳定性,为水质监测和环境保护提供有力支持。

web_bug407的博客 1102

比MyBatis Generator更强大的代码生成器

本文通过FreeMarker快速生成项目的基础代码,可以快速实现 Mybatis、Mybatis Plus和SpringData JPA 三种不同ORM框架的基础代码,有了该工具,从零启动一个项目不再困难。

Herishwater的博客 1917

C++高级数据结构算法 | 二叉树的四种遍历算法详解(递归与非递归实现)

二叉树遍历方法 、前序遍历算法 、中序遍历算法 、后序遍历算法 、层序遍历算法

ZY-JIMMY 2562

3种模板引擎对比:Velocity、Freemarker、Beetl在MyBatis-Plus代码生成器中如何选择

MyBatis-Plus代码生成器(mybatis-plus-code-generator)是一款把数据库表一键逆向成 entity、mapper、service 等 Java 代码的可视化工具。而它底层渲染代码的能力,完全交给**模板引擎**——项目同时内置了 **Velocity、Freemarker、Beetl** 三款引擎。选错引擎,轻则报错,重则生成的代码风格不合团队习惯。本文用一张对比

gitblog_00666的博客 858

【脑电信号】脑电信号EEG形态学滤波处理【含Matlab源码 4023期】

脑电信号EEG形态学滤波处理 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 823

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1142

mybatis-plus自动代码生成器

/ strategy.setInclude(new Scanner("表名,多个英文逗号分割").toString().split(","));// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!//生成基本ColumnList。//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别。//生成基本ResultMap。//如果存在文件是否覆盖。//是否覆盖以前文件。//是否打开生成目录。// 允许生成模板文件。

chenghuang的博客 1323

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mybatis Plus————代码生成器

代码生成器MyBatis Plus是MyBatis的扩展框架,而代码生成器是MP的核心功能之一,另外还有 “条件构造器”和“通用CRUD”等功能。步骤演示mp的代码生成器有两种方式自动生成代码,一种是通过main方法来执行程序,另一种是通过maven插件build产生。第二种方法需要在pom.xml中添加大量的配置信息,因此本人偏向于使用第一种方式。步骤如下:一、添加mybatis plus依赖:...

Morty的技术乐园 11万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MybatisPlus代码自动生成器+Freemarker模板引擎

public class CodeGenerator { //代码自动生成 /* * <p> * 读取控制台内容 * </p> * */ public static String scanner(String tip){ Scanner scanner=new Scanner(System.in); StringBuilder help =new StringBuilder(); .

qq_44783288的博客 2752

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MyBatis-Plus代码生成器

MyBatis-Plus代码生成器是基于数据库表结构自动生成标准CRUD代码的工具,该工具显著提升开发效率,避免重复编码工作。

2401_84284464的博客 784

FreeMarker代码生成器和Mybatis-plus代码生成器之一

本文详解了使用FreeMarker模板引擎来为后端快速生成增删改查文件,以及相应的Vue文件

weixin_45440755的博客 1266

mybatis-plus学习与实践(一)代码生成器整合swagger2生成CRUD接口

最近看到一句话:自从用了mybatis-plus,泡妞时间一大把了。是不是很羡慕,听名字就知道plus就是mybatis增强版,就跟iphone和iphone-plus一样,iphone-plus肯定更好用。 现在我们就一起先了解一下代码生成器,官网上有模板,网上也有很多博客,但是拿下来后会发现,虽然生成表对应的各个类了,但是并没有具体的CRUD方法,现在我们就看看官方gitee上面的源码,试着搭...

Java旅途 5679

java代码mybatis代码生成器插件

引言 mybatis-generator-maven-plugin、MyBatisPlus 对比。 1、mybatis-generator-maven-plugin插件深度更深,对mybatis提供的操作更仔细,不仅有简单的增删改查,还可以动态的使用where语句来操作。 2、MyBatisPlus插件主要提供了一些模板来操作,主要的模板有:velocity 模板引擎, 默认、freemar...

qq_34227896的博客 1万+

代码生成器:MyBatis-Plus代码生成自定义模版

代码生成器:Mybatis-plus代码生成自定义模版简述添加依赖复制maven包内的模版自定义模版内容为方便后续调用,封装了自定义模版的AutoGenerator调用运行结果 简述 AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。 添加依赖 MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模

zhilonng的博客 3589

mybatis-plus代码生成器的配置在生成实体类时去掉表的前缀(如:表g_user生成User.java)

官网上的代码生成器的示例代码中使用的是setTablePrefix()方法进行设置的 strategy.setTablePrefix(pakeageConfig.getModuleName() + "_"); 其中packageConfig.getModuleName() 获取的packageConfig中的值,实际上就是在命令行中输入的值。这个值通过传入到 setModuleName() 方法...

weixin_39520967的博客 1万+

MyBatis-Plus代码生成器,如何自定义代码生成路径

1. 导入代码生成依赖 主要依赖于mybatis-plus-generator和模板引擎,这里使用的是freemarker,也可以使用其他模板引擎。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring...

qq_29550537的博客 1万+
上一篇: js原生ajax请求代码示例
下一篇: mybatis逆向工程生成mapper文件
SimpleSimpleSimples
博客等级 码龄10年 6451粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值