官方文档可参考:

https://baomidou.com/pages/779a6e/#快速入门

  

工具需要的依赖

<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion> <parent>
<groupId>cn.ymcd</groupId>
<artifactId>comm-sample</artifactId>
<version>1.0.0</version>
</parent> <artifactId>comm-sample-mp-generator</artifactId>
<name>comm-sample-mp-generator</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.1.0.7.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.ini4j</groupId>
<artifactId>ini4j</artifactId>
<version>0.5.4</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- 主类的位置,例如上图文件,主类配置应为: -->
<!-- <mainClass>top.nihilwater.App</mainClass> -->
<mainClass>cn.ymcd.comm.sample.mp.generator.MainApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

代码部分

代码部分只有一个主类:

package cn.ymcd.comm.sample.mp.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.ini4j.Profile;
import org.ini4j.Wini; import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* @projectName: comm-sample-mp-generator - 副本
* @author: Cloud9
* @date: 2022年05月31日 13:48
* @version: 1.0
*/
public class MainApplication { private static Wini windowsConfigIniFile; private final static String STATUS_TRUE = "true";
private final static String STATUS_FALSE = "false"; private static String commonPath = null; private static GlobalConfig globalConfig;
private static DataSourceConfig dataSourceConfig;
private static PackageConfig packageConfig;
private static TemplateConfig templateConfig;
private static StrategyConfig strategyConfig; static {
try {
windowsConfigIniFile = new Wini(new File("config.ini")); commonPath = windowsConfigIniFile
.get("global-config")
.get("output-directory", "C:\\Users\\Administrator\\Desktop\\Sample"); globalConfig = getGlobalConfig();
dataSourceConfig = getDataSourceConfig();
packageConfig = getPackageConfig();
templateConfig = getTemplateConfig();
strategyConfig = getStrategyConfig(); } catch (IOException e) {
e.printStackTrace();
} } private static boolean getBooleanValue(String value) {
return "true".equals(value);
} private static DateType getDateTypeValue(String value) {
DateType dateType = null;
switch (value) {
case "default":
dateType = DateType.ONLY_DATE;
break;
case "sql-type":
dateType = DateType.SQL_PACK;
break;
case "new-type":
dateType = DateType.TIME_PACK;
break;
}
return dateType;
} private static IdType getIdTypeValue(String value) {
IdType idType = null;
switch (value) {
case "0":
idType = IdType.AUTO;
break;
case "1":
idType = IdType.NONE;
break;
case "2":
idType = IdType.INPUT;
break;
case "3":
idType = IdType.ID_WORKER;
break;
case "4":
idType = IdType.UUID;
break;
case "5":
idType = IdType.ID_WORKER_STR;
break;
}
return idType;
} /**
* 全局配置
* @param
* @return com.baomidou.mybatisplus.generator.config.GlobalConfig
* @author Cloud9
* @createTime 2022/5/31 14:33
*
*/
private static GlobalConfig getGlobalConfig() {
Profile.Section section = windowsConfigIniFile.get("global-config");
GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setOutputDir(commonPath + "/src/main/java");
globalConfig.setAuthor(section.get("author", "cloud9")); globalConfig.setOpen(getBooleanValue(section.get("open-after-complete", STATUS_FALSE)));
globalConfig.setFileOverride(getBooleanValue(section.get("overwrite", STATUS_TRUE)));
globalConfig.setActiveRecord(getBooleanValue(section.get("ar-mode", STATUS_FALSE)));
globalConfig.setSwagger2(getBooleanValue(section.get("enable-swagger2", STATUS_FALSE)));
globalConfig.setKotlin(getBooleanValue(section.get("kotlin-mode", STATUS_FALSE))); // 主键策略
globalConfig.setIdType(getIdTypeValue(section.get("id-type", "0"))); // 日期类型选择
globalConfig.setDateType(getDateTypeValue(section.get("date-type", "default"))); // 文件格式命名
globalConfig.setEntityName(section.get("entity-format", "%sDTO"));
globalConfig.setMapperName(section.get("mapper-format", "%sDAO"));
// globalConfig.setXmlName(section.get("xml-format", "%sMapper"));
// globalConfig.setServiceName(section.get("service-format", "I%sService"));
// globalConfig.setServiceImplName(section.get("service-impl-format", "%sServiceImpl"));
// globalConfig.setControllerName(section.get("controller-format", "%sController"));
return globalConfig;
} /**
* 获取库名
* @param
* @return java.lang.String
* @author Cloud9
* @createTime 2022/5/31 14:54
*
*/
private static String getSchemaValue() {
Profile.Section section = windowsConfigIniFile.get("db-config");
String connectUrl = section.get("connectUrl");
int i1 = connectUrl.lastIndexOf("/") + 1;
int i2 = connectUrl.lastIndexOf("?");
return connectUrl.substring(i1, i2 == -1 ? connectUrl.length() -1 : i2);
} /**
* 数据源配置
* @param
* @return com.baomidou.mybatisplus.generator.config.DataSourceConfig
* @author Cloud9
* @createTime 2022/5/31 14:33
*
*/
private static DataSourceConfig getDataSourceConfig() {
Profile.Section section = windowsConfigIniFile.get("db-config");
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl(section.get("connectUrl"));
dsc.setSchemaName(getSchemaValue());
dsc.setDriverName(section.get("driverClass"));
dsc.setUsername(section.get("username"));
dsc.setPassword(section.get("password")); dsc.setDbQuery(new MySqlQuery());
dsc.setDbType(DbType.MYSQL);
dsc.setTypeConvert(new MySqlTypeConvert());
return dsc;
} /**
* 包配置
* @param
* @return com.baomidou.mybatisplus.generator.config.PackageConfig
* @author Cloud9
* @createTime 2022/5/31 14:54
*
*/
private static PackageConfig getPackageConfig() {
Profile.Section section = windowsConfigIniFile.get("package-config");
PackageConfig pkgConfig = new PackageConfig();
pkgConfig.setParent(section.get("parent")); pkgConfig.setModuleName(section.get("module", "test"));
pkgConfig.setEntity(section.get("entity", "po"));
pkgConfig.setXml(section.get("xml", "mapper"));
pkgConfig.setMapper(section.get("mapper", "dao"));
pkgConfig.setService(section.get("service", "service"));
pkgConfig.setServiceImpl(section.get("service-impl", "service.impl"));
pkgConfig.setController(section.get("controller", "controller"));
return pkgConfig;
} /**
* 模板配置
* @param
* @return com.baomidou.mybatisplus.generator.config.TemplateConfig
* @author Cloud9
* @createTime 2022/5/31 14:53
*
*/
private static TemplateConfig getTemplateConfig() {
// 配置模板
TemplateConfig templateConfig = new TemplateConfig(); // 配置自定义输出模板
// 指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController(); templateConfig.setXml(null);
templateConfig.setEntity("tpl/entity.java");
templateConfig.setController("tpl/controller.java");
templateConfig.setEntityKt("tpl/entity.kt");
templateConfig.setMapper("tpl/mapper.java");
templateConfig.setService("tpl/service.java");
templateConfig.setServiceImpl("tpl/serviceImpl.java");
return templateConfig;
} /**
* 注入配置
* @param
* @return com.baomidou.mybatisplus.generator.InjectionConfig
* @author Cloud9
* @createTime 2022/5/31 15:14
*
*/
private static InjectionConfig getInjectionConfig() {
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
}; // 如果模板引擎是 freemarker
String templatePath = "/tpl/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm"; // 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return
commonPath
+ "/src/main/resources/mapper/"
+ packageConfig.getModuleName()
+ "/"
+ tableInfo.getMapperName()
+ StringPool.DOT_XML;
}
});
/*
* cfg.setFileCreate(new IFileCreate() {
*
* @Override public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { //
* 判断自定义文件夹是否需要创建 checkDir("调用默认方法创建的目录"); return false; } });
*/
cfg.setFileOutConfigList(focList);
return cfg;
} /**
* 策略配置
* @param
* @return com.baomidou.mybatisplus.generator.config.StrategyConfig
* @author Cloud9
* @createTime 2022/5/31 15:14
*
*/
private static StrategyConfig getStrategyConfig() {
Profile.Section section = windowsConfigIniFile.get("strategy-config");
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); //strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
strategyConfig.setEntityLombokModel(getBooleanValue(section.get("lombok-model", STATUS_TRUE)));
strategyConfig.setRestControllerStyle(getBooleanValue(section.get("rest-controller", STATUS_TRUE))); strategyConfig.setSuperControllerClass(section.get("super-controller", "cn.ymcd.comm.base.BaseController"));
strategyConfig.setSuperServiceImplClass(section.get("super-service-impl", "com.baomidou.mybatisplus.extension.service.impl.ServiceImpl")); strategyConfig.setInclude(includesHandle((section.get("includes").split(",")))); //strategy.setSuperEntityColumns("id");
strategyConfig.setControllerMappingHyphenStyle(getBooleanValue(section.get("hyphen-style", STATUS_TRUE)));
strategyConfig.setTablePrefix(packageConfig.getModuleName() + "_"); return strategyConfig;
} private static String[] includesHandle(String[] includes) {
for (int i = 0; i < includes.length; i++) includes[i] = includes[i].trim();
return includes;
} private static AutoGenerator getAutoGenerator() {
AutoGenerator mpg = new AutoGenerator();
mpg.setGlobalConfig(globalConfig);
mpg.setDataSource(dataSourceConfig);
mpg.setPackageInfo(packageConfig);
mpg.setCfg(getInjectionConfig());
mpg.setStrategy(strategyConfig);
mpg.setTemplate(templateConfig);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
return mpg;
} public static void main(String[] args) {
getAutoGenerator().execute();
}
}

  

还是走配置文件设置参数:

config.ini 放在项目的目录下面,不是src里面

[global-config]
# 输出目录
output-directory = C:\Users\Administrator\Desktop\AISW-TEST # 创建者
author = dzz # 完成后打开目录
open-after-complete = true # 覆写输出
overwrite = true # 开启Swagger2注解
enable-swagger2 = false # ActiveRecord 模式
ar-mode = false # 转换科特林代码
kotlin-mode = false # 生成的时间类型,(default, sql-type, new-type)
date-type = default # 主键生成策略 (0 1 2 3 4 5)
id-type = 0 # 实体类文件命名格式
entity-format = %sDTO # 映射接口文件命名格式
mapper-format = %sDAO # 映射接口文件命名格式
xml-format = %sMapper # 服务接口文件命名格式
service-format = I%sService # 服务实现文件命名格式
service-impl-format = %sServiceImpl # 控制器文件命名格式
controller-format = %sController [db-config]
# 连接配置参数
connectUrl = jdbc:mysql://192.168.209.11:3306/ymcd_aisw?useSSL=false&serverTimeZone=GMT
driverClass = com.mysql.jdbc.Driver
username = root
password = 123456 [package-config]
# 包名配置
parent = cn.cloud9.sample
module = test
entity = po
mapper = dao
xml = mapper
service = service
service-impl = service.impl
controller = controller [strategy-config]
# 开启Lombok注解?
lombok-model = true
# 是否@RestController
rest-controller = true # 指定生成的表名,多个用逗号进行分隔
includes = aisw_netplace, aisw_netplace_sync_log # 继承的控制器类名
super-controller = cn.ymcd.comm.base.BaseController # 继承的服务实现类名
super-service-impl = cn.ymcd.comm.base.BaseService # 接口地址 驼峰转至连字符
hyphen-style = true

模板部分

因为设置模板文件路径,所以是采用自定义模板来输出

templateConfig.setXml(null);
templateConfig.setEntity("tpl/entity.java");
templateConfig.setController("tpl/controller.java");
templateConfig.setEntityKt("tpl/entity.kt");
templateConfig.setMapper("tpl/mapper.java");
templateConfig.setService("tpl/service.java");
templateConfig.setServiceImpl("tpl/serviceImpl.java");

Controller.java.ftl

package ${package.Controller};

import org.springframework.web.bind.annotation.RequestMapping;

<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if> /**
* ${table.name!} ${table.comment!} 前端控制器
*
* @projectName:
* @author:${author}
* @date:${date}
* @version 1.0
*/
<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@RequestMapping("${r'${api.path}'}<#if package.ModuleName??>/${package.ModuleName}</#if>")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass} {
<#else>
public class ${table.controllerName} {
</#if> }
</#if>

  

entity.java.ftl

package ${package.Entity};

<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
</#if> /**
* ${table.name!} ${table.comment!} 实体类
*
* @projectName:
* @author:${author}
* @date:${date}
* @version 1.0
*/
<#if entityLombokModel>
@Data
<#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)
<#else>
@EqualsAndHashCode(callSuper = false)
</#if>
@Accessors(chain = true)
</#if>
<#if table.convert>
@TableName("${table.name}")
</#if>
<#if swagger2>
@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#else>
public class ${entity} implements Serializable {
</#if> <#if entitySerialVersionUID>
private static final long serialVersionUID = 1L;
</#if>
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
<#if field.keyFlag>
<#assign keyPropertyName="${field.propertyName}"/>
</#if> <#if field.comment!?length gt 0>
<#if swagger2>
@ApiModelProperty(value = "${field.comment}")
<#else>
/**
* ${field.comment}
*/
</#if>
</#if>
<#if field.keyFlag>
<#-- 主键 -->
<#if field.keyIdentityFlag>
@TableId(value = "${field.name}", type = IdType.AUTO)
<#elseif idType??>
@TableId(value = "${field.name}", type = IdType.${idType})
<#elseif field.convert>
@TableId("${field.name}")
</#if>
<#-- 普通字段 -->
<#elseif field.fill??>
<#-- ----- 存在字段填充设置 ----->
<#if field.convert>
@TableField(value = "${field.name}", fill = FieldFill.${field.fill})
<#else>
@TableField(fill = FieldFill.${field.fill})
</#if>
<#elseif field.convert>
@TableField("${field.name}")
</#if>
<#-- 乐观锁注解 -->
<#if (versionFieldName!"") == field.name>
@Version
</#if>
<#-- 逻辑删除注解 -->
<#if (logicDeleteFieldName!"") == field.name>
@TableLogic
</#if>
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ----------> <#if !entityLombokModel>
<#list table.fields as field>
<#if field.propertyType == "boolean">
<#assign getprefix="is"/>
<#else>
<#assign getprefix="get"/>
</#if>
public ${field.propertyType} ${getprefix}${field.capitalName}() {
return ${field.propertyName};
} <#if entityBuilderModel>
public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
<#else>
public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
</#if>
this.${field.propertyName} = ${field.propertyName};
<#if entityBuilderModel>
return this;
</#if>
}
</#list>
</#if> <#if entityColumnConstant>
<#list table.fields as field>
public static final String ${field.name?upper_case} = "${field.name}"; </#list>
</#if>
<#if activeRecord>
@Override
protected Serializable pkVal() {
<#if keyPropertyName??>
return this.${keyPropertyName};
<#else>
return null;
</#if>
} </#if>
<#if !entityLombokModel>
@Override
public String toString() {
return "${entity}{" +
<#list table.fields as field>
<#if field_index==0>
"${field.propertyName}=" + ${field.propertyName} +
<#else>
", ${field.propertyName}=" + ${field.propertyName} +
</#if>
</#list>
"}";
}
</#if>
}

  

mapper.java.ftl

package ${package.Mapper};

import ${package.Entity}.${entity};
import ${superMapperClassPackage}; /**
* ${table.name!} ${table.comment!} Mapper 接口
*
* @projectName:
* @author:${author}
* @date:${date}
* @version 1.0
*/
<#if kotlin>
interface ${table.mapperName} : ${superMapperClass}<${entity}>
<#else>
public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { }
</#if>

 

service.java.ftl

package ${package.Service};

import ${package.Entity}.${entity};
import ${superServiceClassPackage}; /**
* ${table.name!} ${table.comment!} 服务类
*
* @projectName:
* @author:${author}
* @date:${date}
* @version 1.0
*/
<#if kotlin>
interface ${table.serviceName} : ${superServiceClass}<${entity}>
<#else>
public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { }
</#if>

  

mapper.xml.ftl

<?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="${package.Mapper}.${table.mapperName}"> <#if enableCache>
<!-- 开启二级缓存 -->
<cache type="org.mybatis.caches.ehcache.LoggingEhcache"/> </#if>
<#if baseResultMap>
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="${package.Entity}.${entity}">
<#list table.fields as field>
<#if field.keyFlag><#--生成主键排在第一位-->
<id column="${field.name}" property="${field.propertyName}" />
</#if>
</#list>
<#list table.commonFields as field><#--生成公共字段 -->
<result column="${field.name}" property="${field.propertyName}" />
</#list>
<#list table.fields as field>
<#if !field.keyFlag><#--生成普通字段 -->
<result column="${field.name}" property="${field.propertyName}" />
</#if>
</#list>
</resultMap> </#if>
<#if baseColumnList>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
<#list table.commonFields as field>
${field.name},
</#list>
${table.fieldNames}
</sql> </#if>
</mapper>

  

serviceImpl.java.ftl

package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName};
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service; /**
* ${table.name!} ${table.comment!} 服务实现类
*
* @projectName:
* @author:${author}
* @date:${date}
* @version 1.0
*/
@Service
<#if kotlin>
open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} { }
<#else>
public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} { }
</#if>

 

打包之后,自己新建目录做一个工具包

Start.cmd 只是方便启动Jar包

java -jar comm-sample-mp-generator-1.0.0.jar

如果要保留执行日志可以

java -jar comm-sample-mp-generator-1.0.0.jar > excute.log

还需要有一个Java的环境变量存在

 

【Mybatis-Plus】制作逆向工具的更多相关文章

  1. Crosstool-ng制作交叉编译工具链

    Crosstool-ng制作交叉编译工具链 交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编 ...

  2. winform制作小工具的技巧

    在使用winfrom制作一些工具的时候,一些基本设置都是去属性里面找来找去,一段时间就忘了,记录记录以备不时之需. 一.窗体绘制的常用设置 窗体的设置应当在窗体构造函数中InitializeCompo ...

  3. 利用Crosstool-ng制作交叉编译工具链

    1.什么是crosstool-ng crosstool-ng,全称是crosstool Next Generation,即下一代crosstool,即crosstool的升级版.那么什么是crosst ...

  4. Android常用逆向工具+单机游戏破解

    android开发环境搭建 我理解的学习路线是首先要掌握和了解常见的工具.搭建环境.然后就是缓慢的积累特征,通过长期的练习使自己进步,通过android逆向课程的学习.常用的工具如下: android ...

  5. 关于EZDML数据库表结构制作设计工具使用踩的坑

    我使用的是一款EZDML的数据库表结构制作设计工具 最开始在数据库创建数据库名为personalmall,基字符集为默认,数据库排序规则也是默认,创建完成之后 去EZDML生成SQL 点击执行sql ...

  6. 几种Android混淆和逆向工具介绍

    针对Android面临的安全风险,一些防止逆向的方法应运而生.代码混淆在X86架构上曾经被广泛研究,他被用于保护软件的只是产权,但是恶意软件也常常使用他来对抗杀毒软件或者对抗逆向分析者,代码混淆可以给 ...

  7. 【逆向工具】IDA使用6-签名文件制作

    0x1 签名文件制作的方法: 找到静态编译的程序库 使用IDA中的fair工具包,对静态库操作,生成特征库(IDA6.8 是flair68.zip) 0x2 步骤 第一步:使用pcf生成对应静态库的p ...

  8. mybatis,Spring等工具对xml文件正确性的验证

    我们知道mybatis或者spring都是使用xml文件作为配置文件,配置文件的格式都是定义在叫做.dtd或者.xsd文件中的,当工具在解析用户自己定义的xml文件的时候,如何才能知道用户自定义的文件 ...

  9. 【干货】微信场景之H5页面制作免费工具大集合

    营销代有手段出,各领风骚数百天.要说现在哪些营销方式最能传播,屡屡刷爆朋友圈的H5页面肯定就是首当其冲的,提到H5页面,就立马想到"围住神经猫",上线微信朋友圈3天的时间便创造了用 ...

  10. android 反编译 逆向工具整理

    需要准备的道具需要哪些软件会在后面逆向过程中详细介绍,这里先大致罗列一下 android一台root并安装了xposed框架的手机(主要是为了脱壳) 类似[海马玩]这种模拟器 android-kill ...

随机推荐

  1. BGP中next-hop-self 小实验

    next-hop-self 在EBGP和IBGP边界使用,对ibgp下一跳邻居使用 配置命令 router bgp 1234 neighbor 2.2.2.2 next-hop-self 使用Next ...

  2. tar解压报错——Not found in archive tar: Exiting with failure status due to previous errors

    tar解压报错--Not found in archive [root@master software]# tar -xzf scala-2.11.8.tgz /usr/local/ tar: /us ...

  3. TestMarkdown1

    VSCode 实时预览还需要执行 Markdown: Open Preview to the Side 命令来实现. 在命令窗口输入 Markdown: Open Preview to the Sid ...

  4. java中以字符分隔的字符串与字符串数组的相互转换

    1.字符串数组拼接成一个以指定字符(包括空字符)分隔的字符串--String.join(),JDK8的新特性 String[] strArray = {"aaa","bb ...

  5. INFINI Labs 产品更新 | Console 1.24.0 操作日志审计功能发布

    INFINI Labs 产品又更新啦~,包括 Console,Gateway 1.24.0.本次各产品更新了很多亮点功能,如 Console 增加操作日志审计功能,优化数据探索字段统计,修复 Gate ...

  6. nginx虚拟主机实战

    基于nginx部署网站 虚拟主机指的就是一个独立的站点,具有独立的域名,有完整的www服务,例如网站.FTP.邮件等. Nginx支持多虚拟主机,在一台机器上可以运行完全独立的多个站点. 一.为什么配 ...

  7. 制作Jdk镜像

    本文介绍用Dockerfile的方式构建Jdk镜像,请保证安装了Docker环境. 首先创建/opt/jdk目录,后续步骤都在该目录下进行操作. 准备好Jdk安装文件,放到/opt/jdk目录下. 编 ...

  8. 哈啰面试:说说Dubbo运行原理?

    Dubbo 是一款高性能.轻量级的开源 RPC(远程过程调用)框架,主要用于构建分布式服务和微服务架构.那 Dubbo 又是如何运行的呢?让我们一起来看. 1.核心组件 要说 Dubbo 运行流程就不 ...

  9. poj1338 ugly number 题解 打表

    类似的题目有HDU1058 humble number(翻译下来都是丑陋的数字). Description Ugly numbers are numbers whose only prime fact ...

  10. vue3.4的更新,保证你看的明明白白

    defineModel 同学已经转正 defineModel 在vue3.3中还是一个实验性功能, 但是经过一个学期的努力,该同学已经转正. defineModel的简单介绍 defineModel( ...