gradle官方文档_Spring Boot+Gradle+MyBatisPlus3.x搭建企业级的后台分离框架

fce6302ccc5a1db90b70f40a5d918ba0.gifca9024873888b8b39883e4306dba706a.gif

 你再主动一点点 4c75712f249ecc68f5cd3a66de95f966.gif  我们就有故事了


原文:toutiao.com/i6861456496740270604

1、技术选型

  • 解析器:FastJSON
  • 开发工具:JDK1.8 、Gradle、IDEA
  • 技术框架:SpringBoot 2.1.5.RELEASE
  • ORM技术:MyBatisPlus3.1.2
  • 数据库:MySQL8.0.21
  • Apache 工具:HttpClient、Lang3
  • Git代码版本控制
  • Web服务器:undertow
  • hutool 国产工具类包
  • lombok 简化代码工具-druid 数据库连接池框架

2、Spring Boot 发展路线简要描述

  • 随着动态语言的流行 (Ruby、Groovy、Scala、Node.js),Java 的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。
  • 在上述环境下,Spring Boot 应运而生。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速的运行起来。使用 Spring Boot 很容易创建一个独立运行(运行 Jar,内嵌 Servlet 容器)准生产级别的基于 Spring 框架的项目,使用 Spring Boot 你可以不用或者只需很少的 Spring 配置。

3、SpringBoot插件使用

  • spring-boot-devtools 实现热部署,实际开发过程中,修改应用的业务逻辑时常常需要重启应用,这显得非常繁琐,降低了开发效率,所以热部署对于开发来说显得十分必要了
  • spring-boot-starter-aop 此插件没什么好说的了,aop是spring的两大功能模块之一,功能非常强大,为解耦提供了非常优秀的解决方案。如:面向方面编程
  • spring-boot-starter-undertow 与spring boot 内置undertow 插件
  • spring-boot-starter-test 测试工具
  • mybatis-plus-boot-starter 与spring boot整合MyBatisPlus的jar
  • spring-boot-configuration-processor 整合SpringBoot配置提示

4、fastJson

阿里JSON解析器,详细文档请看官方 https://github.com/alibaba/fastjson

5、Hutool

Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让Java语言也可以“甜甜的”。Hutool最初是我项目中“util”包的一个整理,后来慢慢积累并加入更多非业务相关功能,并广泛学习其它开源项目精髓,经过自己整理修改,最终形成丰富的开源工具集。

6、Gradle

  • Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置
  • 官方 https://gradle.org/
  • 不会Gradle的先自己补习一下,比如:安装Gradle,配置环境变量,一些jar引入如何配置,基本使用怎么使用

7、工程结构

此工程是通过Kotlin+SpringBoot+MyBatisPlus搭建最简洁的前后端分离框架 框架升级Java语言SpringBoot+MyBatisPlus3.X+Gradle版本的框架,想学习Kotlin版本的请点击蓝色文章进行下载源代码。

99b187b3d873f61fd8059029e83d7a1c.png
f2ec210c1bb10e5370c8efddc93709ea.png

8、Gradle配置

plugins {
    id 'java'
    id 'idea'
}

/**
 * 使用Groovy语言语法定义版本号变量
 */
def spring_boot_version = "2.1.5.RELEASE"
def mybatis_plus_version = "3.1.2"
def mysql_version = "8.0.21"
def druid_version = "1.1.23"
def logback_version = "1.2.1"
def fastjson_version = "1.2.73"
def lombok_version = "1.18.12"
def lang_version = "3.4"
def io_version = "2.6"
def guava_version = "18.0"
def hutool_version = "5.3.10"

group = 'com.flong'
version = '0.0.1-SNAPSHOT'

//jdk版本
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

repositories {
    //指定阿里云镜像
    maven {
        url 'http://maven.aliyun.com/nexus/content/groups/public/'
    }
    mavenLocal()
    mavenCentral()
}

/**
 * 1、implementation 履行 、compile 编译
 * 2、Gradle使用双引号可 ${变量}可以放入引号里面,单引号是不可以的。
 * 3、Gragle使用lombok需要引入annotationProcessor注解,否则不能使用lombok.
 * 4、mybatis-plus3.2.x以上版本引用了Kotlin的支持
 * 5、高版本Springboogt在spring-boot-dependencies-2.3.0.RELEASE.pom里面引入了mysql8.0.2的`8.0.20`配置
 */
dependencies {

    implementation "org.springframework.boot:spring-boot-starter:${spring_boot_version}"
    //排除tomcat使用undertow
    compile("org.springframework.boot:spring-boot-starter-web:${spring_boot_version}") {
        exclude module: "spring-boot-starter-tomcat"
    }
    compile "org.springframework.boot:spring-boot-starter-undertow:${spring_boot_version}"

    //runtime group: 'mysql', name: 'mysql-connector-java', version: '5.1.42'
    compile "org.springframework.boot:spring-boot-devtools:${spring_boot_version}"
    compile "org.springframework.boot:spring-boot-configuration-processor:${spring_boot_version}"
    compile "org.springframework.boot:spring-boot-starter-test:${spring_boot_version}"
    compile "com.baomidou:mybatis-plus-extension:${mybatis_plus_version}"
    compile "com.baomidou:mybatis-plus-boot-starter:${mybatis_plus_version}"
    compile "mysql:mysql-connector-java:${mysql_version}"
    compile "com.alibaba:druid:${druid_version}"
    compile "ch.qos.logback:logback-classic:${logback_version}"
    compile "com.alibaba:fastjson:${fastjson_version}"
    annotationProcessor "org.projectlombok:lombok:${lombok_version}"
    compileOnly "org.projectlombok:lombok:${lombok_version}"
    //testAnnotationProcessor "org.projectlombok:lombok:${lombok_version}"
    //testCompileOnly "org.projectlombok:lombok:${lombok_version}"
    compile "org.apache.commons:commons-lang3:${lang_version}"
    compile "commons-io:commons-io:${io_version}"
    compile "com.google.guava:guava:${guava_version}"
    compile  "cn.hutool:hutool-all:${hutool_version}"
}

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

[compileJava, javadoc, compileTestJava]*.options*.encoding = "UTF-8"

9、数据库SQL脚本

  • -- 创建表字段不建议用is开头,在我Kotlin+Springboot+MyBatisPlus2.x整合也提到此问题,
  • -- 故此整合MyBatisPlus3.x版本,把表的is_deleted字段修改成del_flag,阿里开发手册也提到此问题.
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户Id主键,IdWork生成',
  `user_name` varchar(255) DEFAULT '' COMMENT '用户名',
  `pass_word` varchar(255) DEFAULT '' COMMENT '密码',
  `del_flag` int(2) unsigned NOT NULL DEFAULT '0' COMMENT '是否删除,0-不删除,1-删除',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`user_id`) USING BTREE,
  UNIQUE KEY `id` (`id`)USING BTREE
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

10、SpringBoot与MyBatisPlus3整合分页代码

@Configuration
public class MyBatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}  

11、SpringBoot与MyBatisPlus3分页条件组装器

/**
 * 将condition数据转换成wrapper
 */
public class BuildConditionWrapper {

    public static  QueryWrapper build(List conditions, Class clazz) {
        //初始化mybatis条件构造器
        QueryWrapper wrapper = Wrappers.query();if (conditions == null || conditions.size() == 0) {return wrapper;
        }
        try {for (int i = 0; i                 Condition condition = conditions.get(i);if (condition.getFieldName() == null) {
                    throw new BaseException("调用搜索接口时,缺少关键字[fieldName]!");
                }
                //列名称
                String columnName = getColumnName(condition.getFieldName(), clazz);if (condition == null || condition.getOperation() == null) {
                    throw new BaseException("操作符不能为空!");
                }
                switch (condition.getOperation()) {
                    //等于case EQ:
                        wrapper.eq(columnName, condition.getValue());break;
                    //大于case GT:
                        wrapper.gt(columnName, condition.getValue());break;
                    //小于case LT:
                        wrapper.lt(columnName, condition.getValue());break;
                    //不等于case NEQ:
                        wrapper.ne(columnName, condition.getValue());break;
                    //大于等于case GTANDEQ:
                        wrapper.ge(columnName, condition.getValue());break;
                    //小于等于case LTANDEQ:
                        wrapper.le(columnName, condition.getValue());break;case LIKE:
                        wrapper.like(columnName, condition.getValue());break;case ISNULL:
                        wrapper.isNull(columnName);break;case IN:
                        //value :1,2,3,4,5,6
                        wrapper.inSql(columnName, condition.getValue());break;
                    default:break;
                }if (condition.getJoinType() == JoinType.OR && i                     //下个条件为or连接且非最后一个条件,使用or进行连接
                    wrapper.or();
                }
            }return wrapper;
        } catch (Exception e) {
            throw new BaseException("查询条件不存在");
        }
    }
    /**
     * @Descript 此条件构建包装器方法是支持多个表组装成SQL字段的虚拟表,不支持实际存在的表
     * @Date 2019/6/21 13:32
     * @Author liangjl
     */
    public static  QueryWrapper buildWarpper(List conditions) {
        //初始化mybatis条件构造器
        QueryWrapper wrapper = Wrappers.query();if (conditions == null || conditions.size() == 0) {return wrapper;
        }
        try {for (int i = 0; i                 Condition condition = conditions.get(i);if (condition.getFieldName() == null) {
                    throw new BaseException("调用搜索接口时,缺少关键字[fieldName]!");
                }
                //列名称
                String columnName = condition.getFieldName();if (condition == null || condition.getOperation() == null) {
                    throw new BaseException("操作符不能为空!");
                }
                switch (condition.getOperation()) {
                    //等于case EQ:
                        wrapper.eq(columnName, condition.getValue());break;
                    //大于case GT:
                        wrapper.gt(columnName, condition.getValue());break;
                    //小于case LT:
                        wrapper.lt(columnName, condition.getValue());break;
                    //不等于case NEQ:
                        wrapper.ne(columnName, condition.getValue());break;
                    //大于等于case GTANDEQ:
                        wrapper.ge(columnName, condition.getValue());break;
                    //小于等于case LTANDEQ:
                        wrapper.le(columnName, condition.getValue());break;case LIKE:
                        wrapper.like(columnName, condition.getValue());break;case IN:
                        //value :1,2,3,4,5,6
                        wrapper.inSql(columnName, condition.getValue());break;
                    default:break;
                }if (condition.getJoinType() == JoinType.OR && i                     //下个条件为or连接且非最后一个条件,使用or进行连接
                    wrapper.or();
                }
            }return wrapper;
        } catch (Exception e) {
            throw new BaseException("查询条件不存在");
        }
    }
    /***
     * @Descript 获取指定实体Bean的字段属性
     * @Date 2019/6/19 14:51
     * @Author liangjl
     */
    public static String getColumnName(String fieldName, Class clazz) {
        try {
            //获取泛型类型字段
            Field field = clazz.getDeclaredField(fieldName);
            TableField tableFieldAnno = field.getAnnotation(TableField.class);
            String columnName = "";
            //获取对应数据库字段if (tableFieldAnno != null && StrUtil.isNotBlank(tableFieldAnno.value())) {
                //已定义数据库字段,取定义值
                columnName = tableFieldAnno.value();
            } else {
                //未指定数据库字段,默认驼峰转下划线
                columnName = NamingStrategyUtils.camelToUnderline(field.getName());
            }return columnName;
        } catch (NoSuchFieldException e) {
            throw new BaseException("查询条件不存在");
        }
    }
}

12、 实体

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper=false)
@TableName("t_user")
public class User extends Model implements Serializable {
    @TableId(type = IdType.ID_WORKER)
    private Long userId;
    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String passWord;
    /**
     * 逻辑删除(0-未删除,1-已删除)
     */
    @TableLogic
    private String delFlag;
    /**
     * 创建时间,允许为空,让数据库自动生成即可
     */
    private Date createTime;
}

13、 Mapper

BaseMapper是继承了mybatisplus底层的代码

public interface UserMapper extends BaseMapper {
}

14、 Service

ServiceImplr是继承了mybatisplus底层的代码

@Service
public class UserService extends ServiceImpl {
}

15 、controller

  • 控制层主要实现CURD,增加,修改,查询,删除、分页无大常规操作接口操作
  • 用户分页,参数有多个使用下标索引进行处理.如果有两个参数(如用户名和地址):conditionList[0].fieldName=userName、 conditionList[0].fieldName=address
  • 查询是通过反射fieldName进行去获取表结构userName、address 字段的。
  • 未转码请求分页地址: http://localhost:7011/user/page?conditionList[0].fieldName=userName&conditionList[0].operation=LIKE&conditionList[0].value=周
  • 已转码请求分页地址: http://localhost:7011/user/page?conditionList[0].fieldName=userName&conditionList[0].operation=LIKE&conditionList[0].value=%E5%91%A8
/**
 * @Author:liangjl
 * @Date:2020-08-16
 * @Description:用户控制层
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private UserService userService;

    /**
     * 添加
     */
    @RequestMapping("/add")
    public void add() {
        userMapper.insert(User.builder().userName("周伯通").passWord("123456").build());
    }

    /**
     * 修改
     * @param user
     */
    @PutMapping("/updateById")
    public void updateById(@RequestBody User user) {
        userMapper.updateById(user);
    }
    /**
     * 删除通过多个主键Id进行删除
     * @param ids
     */
    @DeleteMapping("/deleteByIds")
    public void deleteByIds(@RequestBody List ids) {
        userMapper.deleteBatchIds(ids);
    }
    /**
     * 通过指定Id进行查询
     *
     * @param userId
     */
    @GetMapping("/getOne/{userId}")
    public void getOne(@PathVariable("userId") Long userId) {
        User user = userMapper.selectById(userId);
        System.out.println(JSON.toJSON(user));
    }
    /**
     * 用户分页,参数有多个使用下标索引进行处理.如果有两个参数(如用户名和地址):conditionList[0].fieldName=userName、 conditionList[0].fieldName=address
     * 未转码请求分页地址: http://localhost:7011/user/page?conditionList[0].fieldName=userName&conditionList[0].operation=LIKE&conditionList[0].value=周
     * 已转码请求分页地址: http://localhost:7011/user/page?conditionList[0].fieldName=userName&conditionList[0].operation=LIKE&conditionList[0].value=%E5%91%A8
     * @param page
     * @param conditions 条件
     * @return
     */
    @GetMapping("/page")
    public IPage page(Page page, Conditions conditions) {
        QueryWrapper build = BuildConditionWrapper.build(conditions.getConditionList(), User.class);
        //通过lambda反射找到User实体类的createTime自动进行排序
        build.lambda().orderByDesc(User::getCreateTime);return userService.page(page, build);
    }
}

16、WebCofig工具类统一处理配置

  • 消息转换器,中文乱码,Long的精度长度问题,时间格式等问题
  • cors 跨域支持 可以用@CrossOrigin在controller上单独设置
  • 统一处理请求URL拦截器
@Configuration
@ConditionalOnClass(WebMvcConfigurer.class)
@Order(Ordered.HIGHEST_PRECEDENCE)
public class WebConfig implements WebMvcConfigurer {


  @Bean
  public HttpMessageConverters customConverters() {
    //创建fastJson消息转换器
    FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
    //创建配置类
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    //修改配置返回内容的过滤
    fastJsonConfig.setSerializerFeatures(
        // 格式化
        SerializerFeature.PrettyFormat,
        // 可解决long精度丢失 但会有带来相应的中文问题
        //SerializerFeature.BrowserCompatible,
        // 消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
        SerializerFeature.DisableCircularReferenceDetect,
        // 是否输出值为null的字段,默认为false
        SerializerFeature.WriteMapNullValue,
        // 字符类型字段如果为null,输出为"",而非null
        SerializerFeature.WriteNullStringAsEmpty,
        // List字段如果为null,输出为[],而非null
        SerializerFeature.WriteNullListAsEmpty
    );
    // 日期格式
    fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
    // long精度问题
    SerializeConfig serializeConfig = SerializeConfig.globalInstance;
    serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
    serializeConfig.put(Long.class, ToStringSerializer.instance);
    serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
    fastJsonConfig.setSerializeConfig(serializeConfig);
    //处理中文乱码问题
    List fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    fastJsonConverter.setSupportedMediaTypes(fastMediaTypes);
    fastJsonConverter.setFastJsonConfig(fastJsonConfig);
    //将fastjson添加到视图消息转换器列表内return new HttpMessageConverters(fastJsonConverter);
  }
  /**
   * 拦截器
   */
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    //registry.addInterceptor(logInterceptor).addPathPatterns("/**");
    //registry.addInterceptor(apiInterceptor).addPathPatterns("/**");
  }
  /**
   * cors 跨域支持 可以用@CrossOrigin在controller上单独设置
   */
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
        //设置允许跨域请求的域名
        .allowedOrigins("*")
        //设置允许的方法
        .allowedMethods("*")
        //设置允许的头信息
        .allowedHeaders("*")
        //是否允许证书 不再默认开启
        .allowCredentials(Boolean.TRUE);
  }
}

17、运行结果

  • 添加 http://localhost:7011/user/add
  • 分页 http://localhost:7011/user/page?conditionList[0].fieldName=userName&conditionList[0].operation=LIKE&conditionList[0].value=%E5%91%A8
  • 默认当前current 为1当前第一页,size为10,当前页可以显示10条数据,也可以根据自己的情况进行自定义
  • http://localhost:7011/user/page?current=1&size=20&conditionList[0].fieldName=userName&conditionList[0].operation=LIKE&conditionList[0].value=%E5%91%A8
9d0fb0400f1adb1f4f9668202abbe462.png

18、工程代码与说明

  • 1 、以上问题都是根据自己学习实际情况进行总结整理,除了技术问题查很多网上资料通过进行学习之后梳理。
  • 2、 在学习过程中也遇到很多困难和疑点,如有问题或误点,望各位老司机多多指出或者提出建议。本人会采纳各种好建议和正确方式不断完善现况,人在成长过程中的需要优质的养料。
  • 3、 导入代码的时候遇到最多的问题,我想应该是Maven较多,此时不懂maven的童鞋们可以通过自身情况,进行网上查资料学习。如通过网上找资料长时间解决不了,或者框架有不明白可以通过博客留言,在能力范围内会尽力帮助大家解决问题所在,希望在过程中一起进步,一起成长。
  • 工程代码在 base 分支 https://github.com/jilongliang/springboot/tree/base

c97281d0d494ea47f77ebbb7a5c19035.png

如果这篇文章对你有帮助的话,就顺手点个在看,支持一下叭7fa84f82322df13de56b4c4e6915b381.png7fa84f82322df13de56b4c4e6915b381.png感谢各位!


点击下面“王卡免流”查看黑科技

498a2fdcee98f00ee443ff1199c22cab.png

王卡免流

73b05fca9b33549450dcb6200596d8e1.png

自己动手,丰衣足食

点击下方“留言墙”给小康留言
498a2fdcee98f00ee443ff1199c22cab.png

留言墙

73b05fca9b33549450dcb6200596d8e1.png

cb8a4441d95d33a2ef1bd0d3aaddc88a.gif

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

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

相关文章

java random用法_JAVA面试题(1)

1.Java内部类和子类之间有什么区别&#xff1f;答案&#xff1a;内部类是指在一个外部类的内部再定义一个类&#xff0c;内部类对外部类有访问权限&#xff0c;可以访问类 中定义的所有变量和方法。子类是从父类(superclass)中继承的类&#xff0c;子类可以访问父类所有public和…

【不了解你就OUT了】云原生基本原则

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 架构师技术联盟责编 | 阿秃云原生指的是一个敏捷的工程团队&#xff0c;遵循敏捷的研发原则&#xff0c;使用高度自动化的研发工具&#xff0c;开发基于云基础设施和服务的应用以满足快速变化的客户需求。这些应用采用弹性&…

如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例

摘要&#xff1a; GC一直是Java应用中讨论的一个热门话题&#xff0c;尤其在像HBase这样的大型在线存储系统中&#xff0c;大堆下(百GB)的GC停顿延迟产生的在线实时影响&#xff0c;成为内核和应用开发者的一大痛点。 过去的一年里&#xff0c;我们准备在Ali-HBase上突破这个被…

会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?

JVM应该可以算Java中最为核心的部分了&#xff0c;其中开箱即用的内存管理又是JVM中的核心组成部分。我们都知道JVM的内存管理具有垃圾回收功能(Java Garbage Collector)&#xff0c;编码时只需要new而无需主动的释放(类似于C中的delete操作)&#xff0c;所以Java中比较少出现内…

看了三张照片,这个AI只用20分钟破获六年“悬案”

摘要&#xff1a; 浙江实现首个AI破案&#xff1a;钱某某夫妇在衢州“国字号”水利风景区信安湖使用“电鱼”方式偷了六年鱼&#xff0c;但由于缺少证据始终无法定罪&#xff0c;然而最终没有逃过衢州城市大脑的AI神眼。 近日&#xff0c;浙江实现首个AI破案&#xff1a;钱某某…

c语言 异或_编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)

你背或者不背&#xff0c;干货就在那里&#xff0c;不悲不喜你学或者不学&#xff0c;编程就在那里&#xff0c;不来不去听到这话的你是否略感扎心&#xff1f;01基础知识1. 计算机系统的主要技术指标与系统配置。2. 计算机系统、硬件、软件及其相互关系。3. 微机硬件系统的基本…

oracle中如何创建表的自增ID(通过序列)

1、什么是序列呢&#xff1f;序列是一数据库对象&#xff0c;利用它可生成唯一的整数。一般使用序列自动地生成主码值。一个序列的值是由特别的Oracle程序自动生成&#xff0c;因而序列避免了在运用层实现序列而引起的性能瓶颈。Oracle序列允许同时生成多个序列号&#xff0c;而…

反转!以视频搜视频,这批 AI 程序员要逆天了!

抖音AI火了&#xff01;以图搜图&#xff0c;已经无法满足我们了。近期抖音新功能以视频搜视频上新&#xff0c;不知小姐姐叫什么&#xff0c;也能搜出她的影像&#xff01;比如&#xff0c;你捕捉了一只可爱的妹子&#xff0c;想要看到更多她的影像&#xff0c;只要点一下“识…

阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

摘要&#xff1a; 7月25日&#xff0c;阿里云宣布正式推出消息队列Kafka&#xff0c;全面融合开源生态。在兼容Apache生态的基础上&#xff0c;阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点&#xff0c;可用性达99.9%&#xff0c;数据可靠性99.999999%&#xff0c;并…

excel三维地图数据源引用无效_Excel函数公式应用的基础,数据源的引用,动图解释...

一、数据源的相对引用公式的使用就是对数据源的引用&#xff0c;默认使用相对引用方式。采用这种方式引用的数据源&#xff0c;当将公式复制到其他位置时&#xff0c;公式中的单元格地址会随着变化。方法&#xff1a;1、选中C2单元格&#xff0c;在公式编辑栏中可以看到该单元格…

一份帮助你更好地理解深度学习的资源清单

摘要&#xff1a; 深度学习朝着可解释的方向发展&#xff0c;理解背后的基本原理显得更加重要。本文是一份帮助读者更好地理解深度学习基本过程的清单&#xff0c;便于初学者和部分起步者针对性地补充自己的知识体系。 人工智能和深度学习太火了&#xff0c;火得一塌糊涂&#…

python 按条件选择行和列数据_小白学数据结构-排序算法Python(冒泡、选择、快速、希尔等等)...

排序有内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。我们通常所说的排序算法往往指的是内部排序算法&#xff0c;即数据记录在内…

【戳进来有福利】|【技巧帖】3个Tips提升云性能

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | David Linthicum转自 | InfoWorld翻译 | 孔子东游责编 | 阿秃当企业遭遇云计算性能瓶颈时&#xff0c;一般人能想到的而且是最简单的办法&#xff0c;就是针对那些表现不佳的工作负载来增加可用的资源数量。具体来说&#x…

目标检测技术演化:从R-CNN到Faster R-CNN

摘要&#xff1a; 一文了解目标检测技术发展&#xff0c;不要错过哟。 目标检测旨在准确地找到给定图片中物体的位置&#xff0c;并将其正确分类。准确地来讲&#xff0c;目标检测需要确定目标是什么以及对其定位。 然而&#xff0c;想要解决这个问题并不容易。因为&#xff…

关于解决jdbc版本错误问题

关于解决jdbc版本错误问题 最近在做一个项目&#xff0c;在使用IDEA测试某个接口时出现了这个异常&#xff1a; 然后百度了一下发现很多都说是mysql-connector-java.jar包版本不一样&#xff0c;或者是jdbc.properties文件内容出错。 一定要仔细检查自己的数据库名跟账户密码…

深度学习之优化详解:batch normalization

摘要&#xff1a; 一项优化神经网络的技术&#xff0c;点进来了解一下&#xff1f; 认识上图这些人吗&#xff1f;这些人把自己叫做“The Myth Busters”&#xff0c;为什么&#xff1f;在他们的启发下&#xff0c;我们才会在Paperspace做类似的事情。我们要解决是Batch Normal…

无法通过sak判断卡片类型_如何判断你家门能否更换智能锁?选锁门道你要懂!...

选择智能锁有三个门道&#xff0c;你不可不知。门道一&#xff1a;小心“特斯拉线圈”攻击去年在智能锁行业&#xff0c;最能刷屏的是“特斯拉线圈”事件&#xff0c;多个智能锁品牌被轻易入侵攻陷&#xff0c;让消费者关注智能锁的安全问题。行业人士建议消费者&#xff1a;将…

@程序员 天冷了,你准备抱键盘还是抱女朋友取暖?

01恭喜你已经过完了2019年所有的法定节假日有没有一点心寒但随之而来的冷空气更是肉体上的折磨真想说这个天气说好的春夏秋冬的呢为什么我只感受到了夏天和冬天骗子&#xff01;02手里拿着抽纸随时准备擦去感冒导致的鼻涕不行&#xff0c;我要穿厚衣服打开我的衣橱咦&#xff1…

改变世界的七大NLP技术,你了解多少?(下)

摘要&#xff1a; 这里有改变世界的7大NLP技术&#xff0c;点进来了解一下吧&#xff01; 改变世界的七大NLP技术&#xff0c;你了解多少&#xff1f;&#xff08;上&#xff09; 在第1部分中&#xff0c;我介绍了自然语言处理&#xff08;NLP&#xff09;领域以及为其提供支持…

windows如何生成ssh密钥

windows如何生成ssh密钥 1.安装git&#xff0c;先去git官网下载git&#xff0c;https://git-scm.com/downloads&#xff0c;直接点击windows下载就可以了。 2.下载完可以到桌面点击鼠标右键&#xff0c;可以看到多出两个东西git gui跟git bash 3.也可以点击你下载的文件所…