MyBatis Generator使用总结

MyBatis Generator使用总结

  • 介绍
  • 具体使用
    • 数据准备
    • 插件引入
    • 配置
    • 条件构建讲解
    • demo地址

介绍

MyBatis Generator (MBG) 是 MyBatis 的代码生成器。它能够根据数据库表,自动生成 java 实体类、dao 层接口(mapper 接口)及mapper.xml文件。

具体使用

数据准备

创建数据库(8.0版本)mybatis,并添加一张表rbac_user,用于测试

CREATE TABLE `rbac_user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',`name` varchar(100) DEFAULT NULL COMMENT '用户名',`email` varchar(100) DEFAULT NULL COMMENT '邮箱',`nick_name` varchar(100) DEFAULT NULL COMMENT '昵称',`remark` varchar(100) DEFAULT NULL COMMENT '备注',`create_time` date DEFAULT NULL COMMENT '创建时间',`status` char(1) DEFAULT NULL COMMENT '状态',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';

如图所示:
在这里插入图片描述

插件引入

创建一个SpringBoot项目这里使用的spring boot版本是2.1.3.RELEASE,将mybatis 插件引入

		  <!--SpringBoot通用依赖模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--SpringBoot整合MyBatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!--MyBatis分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.5</version></dependency><!--集成druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.9</version></dependency><!-- MyBatis 生成器 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.1</version></dependency><!--Mysql数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency><!--springfox swagger官方Starter--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency>

配置

1、对项目的application.yml进行配置:

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: rootmvc:pathmatch:matching-strategy: ANT_PATH_MATCHERmybatis:mapper-locations:- classpath:dao/*.xmlconfiguration:# 下划线自动转驼峰map-underscore-to-camel-case: truelogging:level:root: infocom.sheep: debug

2、创建配置文件为generator.properties,添加数据库配置信息,用于代码生成器配置使用:

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.userId=root
jdbc.password=root

3、创建代码生成器配置文件generatorConfig.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><properties resource="generator.properties"/><context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"><!-- 配置SQL语句中的前置分隔符 --><property name="beginningDelimiter" value="`"/><!-- 配置SQL语句中的后置分隔符 --><property name="endingDelimiter" value="`"/><!-- 配置生成Java文件的编码 --><property name="javaFileEncoding" value="UTF-8"/><!-- 为模型生成序列化方法 --><plugin type="org.mybatis.generator.plugins.SerializablePlugin"/><!-- 为生成的Java模型创建一个toString方法 --><plugin type="org.mybatis.generator.plugins.ToStringPlugin"/><!-- 生成mapper.xml时覆盖原文件 --><plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /><commentGenerator type="com.macro.mall.CommentGenerator"><!-- 是否阻止生成的注释 --><property name="suppressAllComments" value="true"/><!-- 是否阻止生成的注释包含时间戳 --><property name="suppressDate" value="true"/><!-- 是否添加数据库表的备注信息 --><property name="addRemarkComments" value="true"/></commentGenerator><!--配置数据库连接--><jdbcConnection driverClass="${jdbc.driverClass}"connectionURL="${jdbc.connectionURL}"userId="${jdbc.userId}"password="${jdbc.password}"><!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题--><property name="nullCatalogMeansCurrent" value="true"/></jdbcConnection><!--指定生成model的路径--><javaModelGenerator targetPackage="com.sheep.mbg.model" targetProject="learn-mybatis\src\main\java"/><!--指定生成mapper.xml的路径--><sqlMapGenerator targetPackage="com.sheep..mbg.mapper" targetProject="learn-mybatis\src\main\resources"/><!--指定生成mapper接口的的路径--><javaClientGenerator type="XMLMAPPER" targetPackage="com.sheep.mbg.mapper" targetProject="learn-mybatis\src\main\java"/><!--配置需要生成的表,生成全部表tableName设为% 还可以指定统一前缀的表 如 rbac_% 表示所有rbac_开始的所有表--><table tableName="rbac_%"><generatedKey column="id" sqlStatement="MySql" identity="true"/></table></context>
</generatorConfiguration>

4、实际开发中,有的项目是需要接入swagger-ui的,所以字段注释就得自定义。建立一个注释自定义处理类CommentGenerator:

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;import java.util.Properties;/*** 自定义注释生成器*/
public class CommentGenerator extends DefaultCommentGenerator {private boolean addRemarkComments = false;private static final String EXAMPLE_SUFFIX = "Example";private static final String MAPPER_SUFFIX = "Mapper";private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty";/*** 设置用户配置的参数*/@Overridepublic void addConfigurationProperties(Properties properties) {super.addConfigurationProperties(properties);this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));}/*** 给字段添加注释*/@Overridepublic void addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn) {String remarks = introspectedColumn.getRemarks();//根据参数和备注信息判断是否添加swagger注解信息if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
//            addFieldJavaDoc(field, remarks);//数据库中特殊字符需要转义if (remarks.contains("\"")) {remarks = remarks.replace("\"", "'");}//给model的字段添加swagger注解field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\")");}}/*** 给model的字段添加注释*/private void addFieldJavaDoc(Field field, String remarks) {//文档注释开始field.addJavaDocLine("/**");//获取数据库字段的备注信息String[] remarkLines = remarks.split(System.getProperty("line.separator"));for (String remarkLine : remarkLines) {field.addJavaDocLine(" * " + remarkLine);}addJavadocTag(field, false);field.addJavaDocLine(" */");}@Overridepublic void addJavaFileComment(CompilationUnit compilationUnit) {super.addJavaFileComment(compilationUnit);//只在model中添加swagger注解类的导入if (!compilationUnit.getType().getFullyQualifiedName().contains(MAPPER_SUFFIX) && !compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)) {compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME));}}
}

5、添加运行类Generator:

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class Generator {public static void main(String[] args) throws Exception {//MBG 执行过程中的警告信息List<String> warnings = new ArrayList<String>();//当生成的代码重复时,覆盖原代码boolean overwrite = true;//读取我们的 MBG 配置文件InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(is);is.close();DefaultShellCallback callback = new DefaultShellCallback(overwrite);//创建 MBGMyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);//执行生成代码myBatisGenerator.generate(null);//输出警告信息for (String warning : warnings) {System.out.println(warning);}}
}

6、运行后看结果:图中的路径是与配置文件相对应的。若不存在也会自动创建目录

生成结果
7、可以看到model对象中的各个字段的注释。
在这里插入图片描述
8、还有另个自动生成的对象类:此对象是为了配合增删改查的条件构建用的。
在这里插入图片描述
9、看下生成的Mapper接口,这里生成了基本增删改查操作的接口,查询参数也应用了删改你的条件构建对象。
mapper
10、构建RbacUserService,RbacUserController。具体讲解下这个条件构建器如何使用:

public interface RbacUserService {List<RbacUser> listAllUser();int createUser(RbacUser user);int updateUser(Integer id, RbacUser user);int deleteUser(Integer id);List<RbacUser> listUser(int pageNum, int pageSize);RbacUser getUser(Integer id);
}
@Service
public class RbacUserServiceImpl implements RbacUserService {@Autowiredprivate RbacUserMapper userMapper;@Overridepublic List<RbacUser> listAllUser() {return userMapper.selectByExample(new RbacUserExample());}@Overridepublic int createUser(RbacUser user) {return userMapper.insert(user);}@Overridepublic int updateUser(Integer id, RbacUser user) {user.setId(id);return userMapper.updateByPrimaryKeySelective(user);}@Overridepublic int deleteUser(Integer id) {return userMapper.deleteByPrimaryKey(id);}@Overridepublic List<RbacUser> listUser(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);return userMapper.selectByExample(new RbacUserExample());}@Overridepublic RbacUser getUser(Integer id) {return userMapper.selectByPrimaryKey(id);}
}
@Api("用户管理")
@Controller
@RequestMapping("/user")
public class RbacUserController {private static final Logger LOGGER = LoggerFactory.getLogger(RbacUserController.class);@Autowiredprivate RbacUserService userService;@ApiOperation("获取所有用户列表")@RequestMapping(value = "listAll", method = RequestMethod.GET)@ResponseBodypublic CommonResult<List<RbacUser>> getUserList() {return CommonResult.success(userService.listAllUser());}@ApiOperation("添加用户")@RequestMapping(value = "/create", method = RequestMethod.POST)@ResponseBodypublic CommonResult createUser(@RequestBody RbacUser user) {CommonResult commonResult;int count = userService.createUser(user);if (count == 1) {commonResult = CommonResult.success(user);LOGGER.debug("createUser success:{}", user);} else {commonResult = CommonResult.failed("操作失败");LOGGER.debug("createUser failed:{}", user);}return commonResult;}@ApiOperation("更新指定id用户信息")@RequestMapping(value = "/update/{id}", method = RequestMethod.POST)@ResponseBodypublic CommonResult updateUser(@PathVariable("id") Integer id, @RequestBody RbacUser user, BindingResult result) {CommonResult commonResult;int count = userService.updateUser(id, user);if (count == 1) {commonResult = CommonResult.success(user);LOGGER.debug("updateUser success:{}", user);} else {commonResult = CommonResult.failed("操作失败");LOGGER.debug("updateUser failed:{}", user);}return commonResult;}@ApiOperation("删除指定id的用户")@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)@ResponseBodypublic CommonResult deleteUser(@PathVariable("id") Integer id) {int count = userService.deleteUser(id);if (count == 1) {LOGGER.debug("deleteUser success :id={}", id);return CommonResult.success(null);} else {LOGGER.debug("deleteUser failed :id={}", id);return CommonResult.failed("操作失败");}}@ApiOperation("分页查询用户列表")@RequestMapping(value = "/list", method = RequestMethod.GET)@ResponseBodypublic CommonResult<CommonPage<RbacUser>> listUser(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {List<RbacUser> brandList = userService.listUser(pageNum, pageSize);return CommonResult.success(CommonPage.restPage(brandList));}@ApiOperation("获取指定id的品牌详情")@RequestMapping(value = "/{id}", method = RequestMethod.GET)@ResponseBodypublic CommonResult<RbacUser> user(@PathVariable("id") Integer id) {return CommonResult.success(userService.getUser(id));}
}

11、controller中的返回结果进行了统一,代码如下,可以自行修改:

public interface IErrorCode {long getCode();String getMessage();
}
public enum ResultCode implements IErrorCode {SUCCESS(200, "操作成功"),FAILED(500, "操作失败"),VALIDATE_FAILED(404, "参数检验失败"),UNAUTHORIZED(401, "暂未登录或token已经过期"),FORBIDDEN(403, "没有相关权限");private long code;private String message;private ResultCode(long code, String message) {this.code = code;this.message = message;}public long getCode() {return code;}public String getMessage() {return message;}
}
public class CommonPage<T> {private Integer pageNum;private Integer pageSize;private Integer totalPage;private Long total;private List<T> list;/*** 将PageHelper分页后的list转为分页信息*/public static <T> CommonPage<T> restPage(List<T> list) {CommonPage<T> result = new CommonPage<T>();PageInfo<T> pageInfo = new PageInfo<T>(list);result.setTotalPage(pageInfo.getPages());result.setPageNum(pageInfo.getPageNum());result.setPageSize(pageInfo.getPageSize());result.setTotal(pageInfo.getTotal());result.setList(pageInfo.getList());return result;}public Integer getPageNum() {return pageNum;}public void setPageNum(Integer pageNum) {this.pageNum = pageNum;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize = pageSize;}public Integer getTotalPage() {return totalPage;}public void setTotalPage(Integer totalPage) {this.totalPage = totalPage;}public List<T> getList() {return list;}public void setList(List<T> list) {this.list = list;}public Long getTotal() {return total;}public void setTotal(Long total) {this.total = total;}
}
public class CommonResult<T> {private long code;private String message;private T data;protected CommonResult() {}protected CommonResult(long code, String message, T data) {this.code = code;this.message = message;this.data = data;}/*** 成功返回结果** @param data 获取的数据*/public static <T> CommonResult<T> success(T data) {return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);}/*** 成功返回结果** @param data    获取的数据* @param message 提示信息*/public static <T> CommonResult<T> success(T data, String message) {return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);}/*** 失败返回结果** @param errorCode 错误码*/public static <T> CommonResult<T> failed(IErrorCode errorCode) {return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);}/*** 失败返回结果** @param message 提示信息*/public static <T> CommonResult<T> failed(String message) {return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);}/*** 失败返回结果*/public static <T> CommonResult<T> failed() {return failed(ResultCode.FAILED);}/*** 参数验证失败返回结果*/public static <T> CommonResult<T> validateFailed() {return failed(ResultCode.VALIDATE_FAILED);}/*** 参数验证失败返回结果** @param message 提示信息*/public static <T> CommonResult<T> validateFailed(String message) {return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);}/*** 未登录返回结果*/public static <T> CommonResult<T> unauthorized(T data) {return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);}/*** 未授权返回结果*/public static <T> CommonResult<T> forbidden(T data) {return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);}public long getCode() {return code;}public void setCode(long code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public T getData() {return data;}public void setData(T data) {this.data = data;}
}
@Configuration
@EnableSwagger2
public class Swagger2Config {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//为当前包下controller生成API文档.apis(RequestHandlerSelectors.basePackage("com.sheep.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("SwaggerUI演示").description("learn-mybatis").contact(new Contact("sheep", "", "123@qq.com")).version("1.0").build();}
}

12、运行服务:
在这里插入图片描述
13、访问 http://localhost:8080/swagger-ui.html
在这里插入图片描述
成功启动。

条件构建讲解

从上面可以看到MyBatis Generator (MBG) 为每个数据库表生成了一个对应的 Example 类。它主要用于生成动态 SQL 语句。

Example 类允许你构建复杂的 WHERE 子句,而无需直接在 mapper 文件中硬编码 SQL,它包含了很多用于构建 WHERE 子句的方法。每个方法都对应一个 SQL 比较运算符,比如 “=”, “<>”, “>”, “<”, “LIKE” 等。你可以动态地添加、修改或删除查询条件。使用 Example 类,你可以构建几乎任何类型的查询,包括带有 AND 和 OR 子句的查询,带有子查询的查询等。

在使用 Example 类时,你需要创建一个 Example 对象,然后通过调用该对象的 createCriteria() 方法创建一个 Criteria 对象。然后你可以在 Criteria 对象上调用各种方法来添加查询条件。

上面的案例基本上都没用到,下面我们就开始使用这个条件构建器:

上面的案例是查询的所有用户,我们基于这个进行条件查询。
在这里插入图片描述
比如 对名字进行模糊查询:
在这里插入图片描述

Criteria 对象创建后,可以调用里面的各个接口进行构建参数,这个里面会对每个参数生成 “=”, “<>”, “>”, “<”, “LIKE” 的查询接口。如图所示是上面的接口详情:可以看到默认的情况,不会加%的
在这里插入图片描述
再看addCriterion,可以看到是往全局变量list中插入不同的条件构建对象。
在这里插入图片描述
在这里插入图片描述
看下查询语句拼接效果:
在这里插入图片描述

若我们查询有多个条件的话,直接继续添加即可,例如我可以根据name模糊查询,还要查询小于指定时间创建的用户
在这里插入图片描述

上面的是不同条件进行and拼接的,若使用or进行拼接不同条件的话,需要换个方式:
在这里插入图片描述

每个条件都需要通过or创建Criteria 对象,然后再赋值,看下or接口就明白了:
在这里插入图片描述
比如 我们查询的话还需要根据指定的字段进行排序:
在这里插入图片描述

可以看到在mapper中的条件构建判断逻辑:
在这里插入图片描述

这个构建器只能用来生成简单的基于单表的 CRUD 操作的代码。对于更复杂的 SQL 操作,比如子查询、Group 查询和 Join 查询,MBG 并不直接支持。这些复杂查询需要你自己在 Mapper 的 xml 文件或基于注解编写相应的 SQL。

demo地址

项目地址: https://gitee.com/yang1112/learn-project.git

我额外还写了一个根据模板生成代码,包括service、dao、mapper,有兴趣的可以看看:
项目地址: https://gitee.com/yang1112/code-generator.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【赠书第8期】工程效能十日谈

文章目录 前言 1 工程效能十日谈 1.1 制定清晰的目标和计划 1.2 引入先进的技术和工具 1.3 建立有效的沟通机制 1.4 灵活应对变化 1.5 确保资源充足 1.6 进行有效的风险管理 1.7 进行持续的监控和评估 1.8 优化团队合作 1.9 注重质量管理 1.10 进行项目总结和反思 …

SSM图书捐赠网站系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 图书捐赠网站系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/…

openpnp - 自动换刀设置 - 使用克隆功能有风险

文章目录 openpnp - 自动换刀设置 - 使用克隆功能有风险概述笔记需要注意的地方将一个做好的吸嘴作为这排其他吸嘴的模板bug - 这个克隆功能慎用备注END openpnp - 自动换刀设置 - 使用克隆功能有风险 概述 自动换刀设置时, 很危险, 动不动就撞刀. 如履薄冰啊:( 看到openpnp在…

【社会网络分析第6期】Ucient实操

一、导入数据处理二、核心——边缘分析三、聚类分析四、网络密度 一、导入数据处理 将数据导入Ucinet首先需要对数据进行处理。 承接上一期的数据格式&#xff1a;【社会网络分析第5期】gephi使用指南 原先得到的数据格式如下&#xff1a; 接下来打开ucinet&#xff1a; 之后…

王者荣耀小游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.…

Echarts+Vue+dataV 首页大屏静态示例Demo

效果图: <template><div class="content bg"><!-- 全屏容器 --><!-- 第一行 --><div class="module-box"><div style="flex: 0 1 30%"><dv-decoration-10 style="height: 5px" />&…

【运营思维】美团面试题:如何把梳子卖给寺庙和尚?

Hello 小米的小伙伴们~ 欢迎来到小米的微信公众号&#xff01;今天小米要和大家分享一道美团运营面试题&#xff0c;题目可真是独特——“如何把梳子卖给寺庙和尚&#xff1f;”想必大家一定兴奋不已吧&#xff01; 首先&#xff0c;让我们理清思路&#xff0c;挑战这个看似不…

ubuntu20.04安装tensorRT流程梳理

目标&#xff1a;先跑demo&#xff0c;再学习源码 step1, 提前准备好CUDA环境 安装CUDA&#xff0c;cuDNN 注意&#xff0c;CUDA&#xff0c;cuDNN需要去官网下载.run和tar文件安装&#xff0c;否则在下面step4 make命令会报找不到cuda等的错误&#xff0c;具体安装教程网上…

有趣!谷歌AI认定阿波罗登月“造假“

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 事情是这样的&#…

vue.js如何根据后台返回来的图片url进行图片下载

原创/朱季谦 最近在做一个前端vue.js对接的功能模块时&#xff0c;需要实现一个下载图片的功能&#xff0c;后台返回来的是一串图片url&#xff0c;试了很多种方法&#xff0c;发现点击下载时出来的效果&#xff0c;都是跳到一个新的图片网页&#xff0c;后来经过一番琢磨&…

23款奔驰E300L升级23P驾驶辅助 智驾出行 缓解开车疲劳

辅助驾驶越来越多的被大家所青睐&#xff01;为了提升驾驶安全性和舒适便捷性奔驰改装原厂半自动驾驶23P辅助系统 23P智能辅助驾驶系统还是很有必要的&#xff0c;因为在跑高速的时候可以使用23P智能驾驶的自动保持车速&#xff0c;保持车距&#xff0c;车道自动居中行驶以及自…

CountDownLatch实战应用——批量数据多线程协调异步处理(子线程执行事务回滚)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CountDownLatch实战应用——批量数据多线程协调异步处理(子线程执行事务…

【UnLua】在 Lua 中定义 UE 反射类型

【UnLua】在 Lua 中定义 UE 反射类型 用法 启动编辑器时遍历 Defines 目录下 lua 脚本来加载 UE 反射类型&#xff08;开个临时的 Lua VM 即可&#xff09;直接像 -- define a uenum in lua UEnum.EEnumGuestSomethingElse {Value1 1;Value2 2; }-- use it like a native …

NX二次开发UF_CURVE_ask_ocf_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_ocf_data Defined in: uf_curve.h int UF_CURVE_ask_ocf_data(tag_t feature, UF_CURVE_ocf_data_p_t * offset_data ) overview 概述 Returns the offset data for …

Halcon Solution Guide I basics(4.1): Blob Analysis 自主练习

文章目录 文章专栏前言自主练习题目输出电路板焊点个数解决方案:正确率&#xff1a;90 文章专栏 我的Halcon开发 CSDN 专栏 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 随笔分类 - Halcon入门学习教程 前言 为了更加熟练的掌握Halcon的练习&#xff0c;我之…

基于SSM实现的叮当书城

一、系统架构 前端&#xff1a;jsp | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.7以上 | mysql | maven 二、代码与数据库 三、功能介绍 01. 系统首页 02. 商品分类 03. 热销 04. 新品 05. 注册 06. 登录 07. 购物车 08. 后台-首页 …

Grafana采用Nginx反向代理

一、场景介绍 在常规操作中&#xff0c;一般情况下不会放开许多端口给外部访问&#xff0c;特别是直接 ip:port 的方式开放访问。但是 Grafana 的请求方式在默认情况下是没有任何规律可寻的。 为了满足业务需求&#xff08;后续通过 Nginx 统一一个接口暴露 N 个服务&#xf…

解决Vue编程式导航路由跳转不显示目标路径问题

我们配置一个编程式导航的路由跳转&#xff0c;跳转到 /search 页面&#xff0c;并且携带categoryName和categoryId两个query参数。 this.$router.push({path: "/search",query: {categoryName: dataset.categoryname,categoryId: dataset.categoryid} }) 如果我们…

霍夫丁不等式(Hoeffding‘s inequality)

参考资料&#xff1a;Hoeffdings inequality | encyclopedia article by TheFreeDictionary 霍夫丁不等式&#xff08;Hoeffdings inequality&#xff09;描述了随机变量的和、与和的期望之差的上限&#xff1b;或者表述为&#xff1a;随机变量的均值、与均值的期望之差的上限。…

2017年五一杯数学建模B题自媒体时代的消息传播问题解题全过程文档及程序

2017年五一杯数学建模 B题 自媒体时代的消息传播问题 原题再现 电视剧《人民的名义》中人物侯亮平说&#xff1a;“现在是自媒体时代&#xff0c;任何突发性事件几分钟就传播到全世界。”相对于传统媒体&#xff0c;以互联网技术为基础的自媒体以其信息传播的即时性、交往方式…