官方文档可参考:

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. Python爬虫 | 批量爬取今日头条街拍美图

    01 前言 上篇文章我们爬取了今日头条街拍美图,心情相当愉悦,今天这篇文章我们使用Selenium来爬取当当网的畅销图书排行.正所谓书中自有黄金屋,书中自有颜如玉,我们通过读书学习来提高自身的才华,自 ...

  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. Invalid revision: 3.18.1-g262b901-dirty CMake Error: CMake was unable to find a build program corresponding to "Ninja".

    一次在GitHub上找到的项目,本想编译运行下,但报如下的问题 错误一 Invalid revision: 3.18.1-g262b901-dirty 解决办法: 这是因为版本不对应,可在local. ...

  4. Docker中部署单机Redis详细教程

    1.拉取Redis镜像 # 拉取redis镜像,不指定版本则默认是最新版本 docker pull redis 2.查看镜像 # 列出本地镜像 docker images 3.准备配置文件路径 # 创 ...

  5. arm linux 移植 i2c-tools 与 简单使用

    介绍 i2c-tool是一个专门调试i2c的开源工具.可获取挂载的设备及设备地址,还可以在对应的设备指定寄存器设置值或者获取值等功能,对于驱动以及应用开发者比较友好. i2c-tool:v3.0.3 ...

  6. Oracle常用统计

    测试, 这是测消息 1.按天 select to_char(t.STARTDATE+15/24, 'YYYY-MM-DD') as 天,sum(1) as 数量from HOLIDAY tgroup ...

  7. 【排行榜】Carla leaderboard 排行榜 运行与参与手把手教学

    此分支主要供参与leaderboard排名使用,介绍如何构建队伍,提交自己代码,此部分较为简单,主要是基本教学与演示:后续可以参考更多的开源代码进行学习等. 基本参与此榜单的大多都是学校和实验室,还是 ...

  8. Canvas绘制圆角图片

    效果图: 思路: 先绘制一个圆角长方形 在画布中裁剪下来 在圆角长方形内绘制图片 图片四个角超出圆角长方形的区域被隐藏 具体代码: <!DOCTYPE html> <html lan ...

  9. MyBatis插件:通用mapper(tk.mapper)

    简单认识通用mapper 了解mapper 作用:就是为了帮助我们自动的生成sql语句 通用mapper是MyBatis的一个插件,是pageHelper的同一个作者进行开发的 作者gitee地址:h ...

  10. VulnHub-Narak靶机渗透流程

    VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...