1、导入依赖(我这里用的是gradle构建工具,maven也一样啦~)

  1. plugins {
  2. id 'java'
  3. id 'org.springframework.boot' version '2.7.3' // 定义SpringBoot版本,不单独使用
  4. id 'io.spring.dependency-management' version '1.1.0'
  5. }
  6. group 'com.qbb'
  7. version '1.0-SNAPSHOT'
  8. // 设置编译的Java版本
  9. sourceCompatibility = 17
  10. targetCompatibility = 17
  11. repositories {
  12. mavenCentral()
  13. }
  14. dependencies {
  15. testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
  16. testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
  17. implementation 'org.springframework.boot:spring-boot-starter-web' //省略版本,原生bom支持,插件management提供
  18. implementation 'org.springframework.boot:spring-boot-devtools' // 热部署
  19. implementation 'org.projectlombok:lombok:1.18.24' // 简化开发
  20. implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.2' // mybatis-plus
  21. implementation 'com.baomidou:mybatis-plus-generator:3.5.3' // mybatis-plus代码生成器
  22. implementation 'org.freemarker:freemarker:2.3.31' // 模板引擎
  23. implementation 'mysql:mysql-connector-java:8.0.31' // mysql
  24. implementation 'io.springfox:springfox-boot-starter:3.0.0' // swagger3
  25. }
  26. test {
  27. useJUnitPlatform()
  28. }

2、编写两个基础类用作继承(当然也可以不用)

  1. // BaseController 封装公共请求
  2. package com.qbb.security.common;
  3. public class BaseController {
  4. // WARN:自定义信息
  5. }
  6. // BaseEntity 封装公共字段
  7. package com.qbb.security.common;
  8. import com.baomidou.mybatisplus.annotation.FieldFill;
  9. import com.baomidou.mybatisplus.annotation.IdType;
  10. import com.baomidou.mybatisplus.annotation.TableField;
  11. import com.baomidou.mybatisplus.annotation.TableId;
  12. import com.fasterxml.jackson.annotation.JsonFormat;
  13. import lombok.Data;
  14. import java.io.Serializable;
  15. import java.time.LocalDateTime;
  16. @Data
  17. public abstract class BaseEntity implements Serializable {
  18. @TableId(value = "id", type = IdType.AUTO)
  19. private Long id;
  20. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  21. @TableField(value = "create_time", fill = FieldFill.INSERT)
  22. private LocalDateTime createTime;
  23. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  24. @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
  25. private LocalDateTime updateTime;
  26. }

3、编写CodeGenerator(完整配置,有些参数没用到,感兴趣的自己研究一下~)

  1. package com.qbb.security.code;
  2. import com.baomidou.mybatisplus.annotation.FieldFill;
  3. import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
  4. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  6. import com.baomidou.mybatisplus.extension.service.IService;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
  9. import com.baomidou.mybatisplus.generator.config.OutputFile;
  10. import com.baomidou.mybatisplus.generator.config.rules.DateType;
  11. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
  12. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
  13. import com.baomidou.mybatisplus.generator.fill.Column;
  14. import com.baomidou.mybatisplus.generator.fill.Property;
  15. import com.qbb.security.common.BaseController;
  16. import com.qbb.security.common.BaseEntity;
  17. import org.apache.ibatis.annotations.Mapper;
  18. import java.util.Arrays;
  19. import java.util.Collections;
  20. import java.util.List;
  21. import java.util.Scanner;
  22. public class CodeGenerator {
  23. public static void main(String[] args) {
  24. // 获取表名
  25. List<String> tables = getTableNames();
  26. // 数据库设置
  27. FastAutoGenerator.create("jdbc:mysql://localhost:3306/startqbb", "root", "root")
  28. /**
  29. * 全局配置
  30. */
  31. .globalConfig(builder -> {
  32. builder.author("QIUQIU&LL") // 作者
  33. .disableOpenDir() // 禁止打开输出目录
  34. .outputDir(System.getProperty("user.dir") + "\\src\\main\\java") // 指定输出目录 /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
  35. .enableSwagger() // 开启 swagger 模式 默认值:false
  36. .dateType(DateType.TIME_PACK) // 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
  37. .commentDate("yyyy-MM-dd"); // 注释日期 默认值: yyyy-MM-dd
  38. // .fileOverride(); // 覆盖已有文件(已迁移到策略配置中,3.5.4版本会删除此方法)
  39. })
  40. /**
  41. * 包配置
  42. */
  43. .packageConfig(builder -> builder.parent("com.qbb.security") // 父包名 默认值:com.baomidou
  44. // .moduleName("com.qbb.security") // 父包模块名 默认值:无
  45. .entity("domain") // Entity 包名 默认值:common
  46. .service("service") // Service 包名 默认值:service
  47. .serviceImpl("service.impl") // Service Impl 包名 默认值:service.impl
  48. .controller("controller") // Controller 包名 默认值:controller
  49. .mapper("mapper") // Mapper 包名 默认值:mapper
  50. .xml("mapper") // Mapper XML 包名 默认值:mapper.xml
  51. .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))) // xml的路径配置信息
  52. /**
  53. * 策略配置
  54. */
  55. .strategyConfig(builder -> builder.addInclude(tables)// 增加表匹配(内存过滤) include 与 exclude 只能配置一项
  56. // .enableCapitalMode() // 开启大写命名 默认值:false
  57. // .enableSkipView() // 开启跳过视图 默认值:false
  58. // .disableSqlFilter() // 禁用 sql 过滤 默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关
  59. // .enableSchema() // 启用 schema 默认值:false,多 schema 场景的时候打开
  60. // .likeTable(LikeTable) // 模糊表匹配(sql 过滤) likeTable 与 notLikeTable 只能配置一项
  61. // .notLikeTable(LikeTable) // 模糊表排除(sql 过滤) likeTable 与 notLikeTable 只能配置一项
  62. // .addExclude() // 增加表排除匹配(内存过滤) include 与 exclude 只能配置一项
  63. .addTablePrefix("t_", "sys_", "tb_")
  64. // .addTableSuffix(String...) // 增加过滤表后缀
  65. // .addFieldPrefix(String...) // 增加过滤字段前缀
  66. // .addFieldSuffix(String...) // 增加过滤字段后缀
  67. /**
  68. * service 策略配置
  69. */
  70. .serviceBuilder()
  71. .superServiceClass(IService.class) // 设置 service 接口父类 BaseService.class
  72. // .superServiceClass(String) // 设置 service 接口父类 com.baomidou.global.BaseService
  73. .superServiceImplClass(ServiceImpl.class) // 设置 service 实现类父类 BaseServiceImpl.class
  74. // .superServiceImplClass(String) // 设置 service 实现类父类 com.baomidou.global.BaseServiceImpl
  75. // .convertServiceFileName(ConverterFileName) // 转换 service 接口文件名称
  76. // .convertServiceImplFileName(ConverterFileName) // 转换 service 实现类文件名称
  77. .formatServiceFileName("%sService") // 格式化 service 接口文件名称
  78. .formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称
  79. /**
  80. * 实体策略配置
  81. */
  82. .entityBuilder()
  83. // .nameConvert(INameConvert) // 名称转换实现
  84. .superClass(BaseEntity.class) // 设置父类 BaseEntity.class
  85. // .superClass(String) // 设置父类 com.baomidou.global.BaseEntity
  86. .disableSerialVersionUID() // 禁用生成 serialVersionUID 默认值:true
  87. // .enableColumnConstant() // 开启生成字段常量 默认值:false
  88. .enableChainModel() // 开启链式模型 默认值:false
  89. .enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀 默认值:false
  90. .enableTableFieldAnnotation() // 开启生成实体时生成字段注解 默认值:false
  91. // .enableActiveRecord() // 开启 ActiveRecord 模型 默认值:false
  92. .versionColumnName("version") // 乐观锁字段名(数据库)
  93. // .versionPropertyName(String) // 乐观锁属性名(实体)
  94. .logicDeleteColumnName("is_deleted") // 逻辑删除字段名(数据库)
  95. // .logicDeletePropertyName(String) // 逻辑删除属性名(实体)
  96. .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 默认下划线转驼峰命名:NamingStrategy.underline_to_camel
  97. // .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略 默认为 null,未指定按照 naming 执行
  98. // .addSuperEntityColumns("id", "createTime", "updateTime", "statu") // 添加父类公共字段
  99. // .addIgnoreColumns(String...) // 添加忽略字段
  100. .addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加表字段填充
  101. .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) // 添加表字段填充
  102. // .idType(IdType.AUTO) // 全局主键类型
  103. // .convertFileName(ConverterFileName)// 转换文件名称
  104. // .formatFileName(String) // 格式化文件名称
  105. .enableLombok() // 开启 lombok 模型 默认值:false
  106. /**
  107. * controller 策略配置
  108. */
  109. .controllerBuilder()
  110. .superClass(BaseController.class) // 设置父类 BaseController.class
  111. // .superClass(String) // 设置父类 com.baomidou.global.BaseController
  112. .enableHyphenStyle() // 开启驼峰转连字符 默认值:false
  113. .enableRestStyle() // 开启生成@RestController 控制器 默认值:false
  114. // .convertFileName(ConverterFileName) // 转换文件名称
  115. .formatFileName("%sController")// 格式化文件名称
  116. /**
  117. * mapper 策略配置
  118. */
  119. .mapperBuilder()
  120. .superClass(BaseMapper.class) // 设置父类 BaseMapper.class
  121. // .superClass(String) //设置父类 com.baomidou.global.BaseMapper
  122. // .enableMapperAnnotation() //开启 @Mapper 注解 默认值:false WARN 因为现在mybatis-plus传递mybatis-spring依赖,这里是没问题的,但后面如果考虑脱离mybatis-spring的时候就需要把这里处理掉,建议使用mapperAnnotation方法来标记自己的注解。
  123. .mapperAnnotation(Mapper.class)
  124. .enableBaseResultMap() // 启用 BaseResultMap 生成 默认值:false
  125. .enableBaseColumnList() // 启用 BaseColumnList 默认值:false
  126. // .cache(Class<? extends Cache>) //设置缓存实现类 MyMapperCache.class
  127. // .convertMapperFileName(ConverterFileName) //转换 mapper 类文件名称
  128. // .convertXmlFileName(ConverterFileName) //转换 xml 文件名称
  129. .formatMapperFileName("%sMapper") // 格式化 mapper 文件名称
  130. .formatXmlFileName("%sMapper") // 格式化 xml 实现类文件名称
  131. )
  132. /**
  133. * 模板配置
  134. */
  135. .templateConfig(builder -> {
  136. // WARN : 使用我们自定义模板 需要注意虽然我们文件是以ftl结尾,但是这里不要加上ftl,不然会报模板引擎找不到文件
  137. builder
  138. // .disable(TemplateType.ENTITY,TemplateType.SERVICE...) // 禁用模板
  139. // .disable() // 禁用所有模板
  140. .entity("/templates/myEntity.java") // 自定义entity模板
  141. .controller("/templates/myControlle.java") // 自定义controller模板
  142. .service("/templates/myService.java") // 自定义service模板
  143. .serviceImpl("/templates/myServiceImpl.java") // 自定义servicei.mpl模板
  144. .mapper("/templates/myMapper.java") // 自定义mapper模板
  145. .xml("/templates/myMapper.xml"); // 自定义xml模板
  146. })
  147. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
  148. .execute();
  149. }
  150. /**
  151. * 读取控制台内容,获取用户输入的表名
  152. */
  153. public static List<String> getTableNames() {
  154. Scanner scanner = new Scanner(System.in);
  155. System.out.println("请输入表名(多个表名以逗号隔开):");
  156. String tableNames = scanner.nextLine();
  157. if (StringUtils.isNotBlank(tableNames)) {
  158. return Arrays.asList(tableNames.split(","));
  159. }
  160. throw new MybatisPlusException("请按照格式输入正确的表名!");
  161. }
  162. }

4、CodeGenerator(CV直接用)

  1. package com.qbb.security.code;
  2. import com.baomidou.mybatisplus.annotation.FieldFill;
  3. import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
  4. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  6. import com.baomidou.mybatisplus.extension.service.IService;
  7. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
  9. import com.baomidou.mybatisplus.generator.config.OutputFile;
  10. import com.baomidou.mybatisplus.generator.config.rules.DateType;
  11. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
  12. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
  13. import com.baomidou.mybatisplus.generator.fill.Column;
  14. import com.baomidou.mybatisplus.generator.fill.Property;
  15. import com.qbb.security.common.BaseController;
  16. import com.qbb.security.common.BaseEntity;
  17. import org.apache.ibatis.annotations.Mapper;
  18. import java.util.Arrays;
  19. import java.util.Collections;
  20. import java.util.List;
  21. import java.util.Scanner;
  22. public class CodeGenerator {
  23. public static void main(String[] args) {
  24. // 获取表名
  25. List<String> tables = getTableNames();
  26. // 数据库设置
  27. FastAutoGenerator.create("jdbc:mysql://localhost:3306/startqbb", "root", "root")
  28. /**
  29. * 全局配置
  30. */
  31. .globalConfig(builder -> {
  32. builder.author("QIUQIU&LL") // 作者
  33. .disableOpenDir() // 禁止打开输出目录
  34. .outputDir(System.getProperty("user.dir") + "\\src\\main\\java") // 指定输出目录 /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
  35. .enableSwagger() // 开启 swagger 模式 默认值:false
  36. .dateType(DateType.TIME_PACK) // 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
  37. .commentDate("yyyy-MM-dd"); // 注释日期 默认值: yyyy-MM-dd
  38. })
  39. /**
  40. * 包配置
  41. */
  42. .packageConfig(builder -> builder.parent("com.qbb.security") // 父包名 默认值:com.baomidou
  43. .entity("domain") // Entity 包名 默认值:common
  44. .service("service") // Service 包名 默认值:service
  45. .serviceImpl("service.impl") // Service Impl 包名 默认值:service.impl
  46. .controller("controller") // Controller 包名 默认值:controller
  47. .mapper("mapper") // Mapper 包名 默认值:mapper
  48. .xml("mapper") // Mapper XML 包名 默认值:mapper.xml
  49. .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapper"))) // xml的路径配置信息
  50. /**
  51. * 策略配置
  52. */
  53. .strategyConfig(builder -> builder.addInclude(tables)// 增加表匹配(内存过滤) include 与 exclude 只能配置一项
  54. .addTablePrefix("t_", "sys_", "tb_")
  55. /**
  56. * service 策略配置
  57. */
  58. .serviceBuilder()
  59. .superServiceClass(IService.class) // 设置 service 接口父类 BaseService.class
  60. .superServiceImplClass(ServiceImpl.class) // 设置 service 实现类父类 BaseServiceImpl.class
  61. .formatServiceFileName("%sService") // 格式化 service 接口文件名称
  62. .formatServiceImplFileName("%sServiceImpl") // 格式化 service 实现类文件名称
  63. /**
  64. * 实体策略配置
  65. */
  66. .entityBuilder()
  67. .superClass(BaseEntity.class) // 设置父类 BaseEntity.class
  68. .disableSerialVersionUID() // 禁用生成 serialVersionUID 默认值:true
  69. .enableChainModel() // 开启链式模型 默认值:false
  70. .enableRemoveIsPrefix() // 开启 Boolean 类型字段移除 is 前缀 默认值:false
  71. .enableTableFieldAnnotation() // 开启生成实体时生成字段注解 默认值:false
  72. .versionColumnName("version") // 乐观锁字段名(数据库)
  73. .logicDeleteColumnName("is_deleted") // 逻辑删除字段名(数据库)
  74. .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略 默认下划线转驼峰命名:NamingStrategy.underline_to_camel
  75. .addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加表字段填充
  76. .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) // 添加表字段填充
  77. .enableLombok() // 开启 lombok 模型 默认值:false
  78. /**
  79. * controller 策略配置
  80. */
  81. .controllerBuilder()
  82. .superClass(BaseController.class) // 设置父类 BaseController.class
  83. .enableHyphenStyle() // 开启驼峰转连字符 默认值:false
  84. .enableRestStyle() // 开启生成@RestController 控制器 默认值:false
  85. .formatFileName("%sController")// 格式化文件名称
  86. /**
  87. * mapper 策略配置
  88. */
  89. .mapperBuilder()
  90. .superClass(BaseMapper.class) // 设置父类 BaseMapper.class
  91. .mapperAnnotation(Mapper.class)
  92. .enableBaseResultMap() // 启用 BaseResultMap 生成 默认值:false
  93. .enableBaseColumnList() // 启用 BaseColumnList 默认值:false
  94. .formatMapperFileName("%sMapper") // 格式化 mapper 文件名称
  95. .formatXmlFileName("%sMapper") // 格式化 xml 实现类文件名称
  96. )
  97. /**
  98. * 模板配置
  99. */
  100. .templateConfig(builder -> {
  101. // WARN : 使用我们自定义模板 需要注意虽然我们文件是以ftl结尾,但是这里不要加上ftl,不然会报模板引擎找不到文件
  102. builder
  103. .entity("/templates/myEntity.java") // 自定义entity模板
  104. .controller("/templates/myControlle.java") // 自定义controller模板
  105. .service("/templates/myService.java") // 自定义service模板
  106. .serviceImpl("/templates/myServiceImpl.java") // 自定义servicei.mpl模板
  107. .mapper("/templates/myMapper.java") // 自定义mapper模板
  108. .xml("/templates/myMapper.xml"); // 自定义xml模板
  109. })
  110. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
  111. .execute();
  112. }
  113. /**
  114. * 读取控制台内容,获取用户输入的表名
  115. */
  116. public static List<String> getTableNames() {
  117. Scanner scanner = new Scanner(System.in);
  118. System.out.println("请输入表名(多个表名以逗号隔开):");
  119. String tableNames = scanner.nextLine();
  120. if (StringUtils.isNotBlank(tableNames)) {
  121. return Arrays.asList(tableNames.split(","));
  122. }
  123. throw new MybatisPlusException("请按照格式输入正确的表名!");
  124. }
  125. }

5、文件中使用到的模板文件我放在阿里云盘了,各位自取

模板文件 ===> templates

MybatisPlus最新代码生成器(version3.5.1+),自定义文件模板的更多相关文章

  1. Pycharm 自定义文件模板

    Pycharm 自定义文件模板 每次新建文件都有相同的代码框架,每次重复敲浪费了程序员的寿命啊 按照下面方式自定义自己的模板:

  2. SpringBoot之【mybatisplus】代码生成器

    1.概述. AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.C ...

  3. MybatisPlus使用代码生成器遇到的小问题

    MyBatisPlus 在3.0.3版本之前使用代码生成器因为存在默认依赖,所以不需要其他的依赖,项目中使用的是3.0.1的版本,所以不用添加其他依赖,添加之后反倒是会报错,实际上MP官网上已经说明了 ...

  4. C# 自定义文件图标 双击启动 (修改注册表)

    程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢 1.双击打开 2.自定义的文件,有图标显示 3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中 ...

  5. java学习笔记(2):获取文件名和自定义文件过滤器

    //自定义文件过滤器import java.io.File; import javax.swing.filechooser.*; public class JavaChooser extends Fi ...

  6. 重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口

    原文:重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (26) ...

  7. KVO实现自定义文件复制进度展示

    一.创建文件 说明:自定义文件类,通过NSFileManager 以及NSFileHandle 实现文件的创建和copy,为了控制内存的并发使用,通过控制每次赋值的固定长度来分多次复制: NSStri ...

  8. red5 自定义文件存放目录

    Red5 流媒体服务器 自定义文件存放目录 Red5在正常情况下,安装之后文件必须存放在Red5安装目录下的oflaDemo\streams中,不能自定义存放目录,例如Red5 安装在C盘,但是我的文 ...

  9. 如何开发使用自定义文件的OEM应用程序

    有关创建和使用自定义数据文件的详细信息,请参阅DISM应用程序包(.appx或.appxbundle)服务命令行选项. 了解如何开发使用自定义文件的应用程序,将信息从OEM传递到应用程序. 对于您为O ...

  10. 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器

    [源码下载] 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件保存选取器 示例1.演示如何 ...

随机推荐

  1. Excel中的数值四舍五入方法详解

    在日常工作和数据处理中,我们经常需要对数值进行四舍五入操作.Excel作为一款强大的电子表格软件,提供了多种方法来实现数值的四舍五入.本文将介绍Excel中常用的四舍五入函数及其基本使用方法. ROU ...

  2. C++算法之旅、06 基础篇 | 第三章 图论

    常用代码模板3--搜索与图论 - AcWing DFS 尽可能往深处搜,遇到叶子节点(无路可走)回溯,恢复现场继续走 数据结构:stack 空间:需要记住路径上的点,\(O(h)\). BFS使用空间 ...

  3. 使用antd-mobile遇到的坑

    在使用antd-mobile中的组件的时候,遇到了一些比较棘手的问题,经过查找相关资料和网上的帮助,在此整理出了问题以及解决办法: 在引入antd-mobile的时候,根据官网提供的文档: 1,首先安 ...

  4. 面试题:Mybatis中的#{}和${}有什么区别?这是我见过最好的回答

    面试题:Mybatis中的#{}和${}有什么区别? 前言 今天来分享一道比较好的面试题,"Mybatis中的#{}和${}有什么区别?". 对于这个问题,我们一起看看考察点和比较 ...

  5. 如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考

    大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作.作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长. BOSS直 ...

  6. 用Rust手把手编写一个Proxy(代理), UDP绑定篇

    用Rust手把手编写一个Proxy(代理), UDP绑定篇 项目 ++wmproxy++ gite: https://gitee.com/tickbh/wmproxy github: https:// ...

  7. 在同一个k8s集群中部署多套nginx-controller

    1.nginx-controller部署请参考我的另一篇博客 nginx Ingress Controller Packaged by Bitnami 2.修改values.yaml 不通contro ...

  8. python3利用smtplib发送、抄送邮件并附带附件

    python3利用smtplib发送.抄送邮件并附带附件 1. 导包 import smtplib from email.mime.text import MIMEText from email.mi ...

  9. 《流畅的Python》 读书笔记 231007(第二章第一部分)

    第2章 数据结构 ABC语言是Python的爸爸~ 很多点子在现在看来都很有 Python 风格:序列的泛型操作.内置的元组和映射类型.用缩进来架构的源码.无需变量声明的强类型 不管是哪种数据结构,字 ...

  10. Python并发编程——操作系统发展史、多道技术、进程理论、开启进程、join方法、进程间的数据隔离

    文章目录 必备知识回顾 今日内容详细 操作系统发展史 多道技术 必备知识点 多道技术图解 多道技术重点知识 进程理论 必备知识点 进程调度 进程运行的三状态图 两对重要概念 开启进程的两种方式 joi ...