springboot 集成 shardingSphere 加mybatisplus 自带增加 分页查询 和源代码包 分库分表 单库 分表 使用雪花算法id

news2024/10/5 19:09:50

目录

介绍

代码下载

效果

数据库

 代码结构

上代码

pom.xml

yml配置

建表语句

mapper.xml

mybatisplus 配置.java

logback

application.java

BaseEntity

TUser

TUserMapper

TUserService

TUserServiceImpl

TUserController

测试



介绍

       这套springboot + sharding sphere  + mybatis plus  代码中有很多注释的,是可有可无类型,id放到了父类中,防止save 的时候,id变成0问题 实现id自动生成,全套一个shardingspere 

代码下载

https://download.csdn.net/download/weixin_42749765/87759588

效果

数据库

 代码结构

上代码

pom.xml

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <start-class>com.superbase.fintech.Application</start-class>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.15</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>


        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.0.1</version>
        </dependency>


    </dependencies>

yml配置

server:
  port: 8080

spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    props:
      sql:
        show: true	# 开启sql日志输出
    datasource:
      names: t0,t1
      t0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test_0?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: admin
      t1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/test_1?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
        username: root
        password: admin
    sharding:
      tables:
        t_user:
          actual-data-nodes: t0.t_user_$->{0..1}
          table-strategy:
            inline:
              sharding-column: id
              algorithm-expression: t_user_$->{id % 2}
          key-generator:
            column: id
            type: SNOWFLAKE
      binding-tables: t_user










pagehelper:
  # 指定使用的数据库数据库
  helperDialect: mysql
  # reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql



mybatis-plus:
  # 扫描 mapper.xml
  mapper-locations: classpath*:mapper/**/**.xml
  #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.superbase.fintech
  global-config:
    db-config:
      #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
      id-type: auto
      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
      field-strategy: 0
      #驼峰下划线转换
      column-underline: false
      #逻辑删除配置 使用mybatis plus内置方法默认过滤配置的逻辑删除字段,其他sql需手动过滤sql语句
      logic-delete-field: deleteFlag
      logic-delete-value: 1
      logic-not-delete-value: 0
      db-type: mysql
    refresh: false
  configuration:
    jdbc-type-for-null: 'null'
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
    cache-enabled: false # 二级缓存是否开启
    lazyLoadingEnabled: true #延时加载的开关
    aggressiveLazyLoading: false #开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性
    multipleResultSetsEnabled: true






建表语句

CREATE TABLE `t_user_0` (
  `id` bigint NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `t_user_1` (
  `id` bigint NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mapper.xml

<?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="com.superbase.fintech.biz.mapper.TUserMapper">

</mapper>

mybatisplus 配置.java

package com.superbase.fintech.config;


import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

 
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

logback

<?xml version="1.0" encoding="UTF-8"?>
<!-- 分级别异步文件日志输出配置 -->
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">


    <!-- logback项目名称 -->
    <property name="appName" value="super-base"/>

    <!-- 日志级别 DEBUG INFO WARN ERROR -->
    <property name="logLevel" value="INFO"/>

    <!-- 日志路径-->
    <property name="logPath" value="/export/log"/>

    <!-- 最大保存时间 30天-->
    <property name="maxHistory" value="3"/>

    <!-- 异步缓冲队列的深度,该值会影响性能.默认值为256 -->
    <property name="queueSize" value="256"/>

    <!-- lOGGER  PATTERN 根据个人喜好选择匹配  -->
    <property name="logPattern" value="%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{traceId} - %m%n"/>


    <!-- 动态日志级别 -->
    <jmxConfigurator/>

    <!-- 控制台的标准输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <appender name="consoleDetail" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logPath}/${appName}/${appName}_detail.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}/detail/${appName}_detail.log.%d{yyyy-MM-dd}.zip</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <!-- DUBUG 日志记录  -->
    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPath}/${appName}/${appName}_debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}/debug/${appName}_debug.log.%d{yyyy-MM-dd}.zip
            </fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <!-- INFO 级别的日志记录  -->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPath}/${appName}/${appName}_info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}/info/${appName}_info.log.%d{yyyy-MM-dd}.zip
            </fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <!--  WARN 级别的日志记录 -->
    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPath}/${appName}/${appName}_warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}/warn/${appName}_warn.log.%d{yyyy-MM-dd}.zip
            </fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <!-- Error 级别的日志记录 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${logPath}/${appName}/${appName}_error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${logPath}/${appName}/error/${appName}_error.log.%d{yyyy-MM-dd}.zip
            </fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>

    <appender name="ASYNC_consoleDetail" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="consoleDetail"/>
    </appender>

    <!-- ASYNC_LOG_DEBUG  -->
    <appender name="ASYNC_LOG_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_DEBUG"/>
    </appender>

    <!-- ASYNC_LOG_INFO -->
    <appender name="ASYNC_LOG_INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_INFO"/>
    </appender>

    <!-- ASYNC_LOG_WARN -->
    <appender name="ASYNC_LOG_WARN" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_WARN"/>
    </appender>

    <!--ASYNC_LOG_ERROR  -->
    <appender name="ASYNC_LOG_ERROR" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${queueSize}</queueSize>
        <appender-ref ref="FILE_ERROR"/>
    </appender>

    <logger name="org.springframework.web.servlet.DispatcherServlet" level="OFF"/>
    <logger name="org.springframework.web.context.support.XmlWebApplicationContext" level="OFF"/>
    <logger name="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" level="OFF"/>

    <!-- 日志的记录级别 -->
    <!-- 在定义后引用APPENDER -->
    <root level="${logLevel}">
        <!--  控制台  -->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC_consoleDetail"/>

        <!-- 具体的日志级别和文件的配置 -->
        <appender-ref ref="ASYNC_LOG_DEBUG"/>
        <appender-ref ref="ASYNC_LOG_INFO"/>
        <appender-ref ref="ASYNC_LOG_WARN"/>
        <appender-ref ref="ASYNC_LOG_ERROR"/>
    </root>
</configuration>

appplication.properties 里边空的就不写了

application.java

package com.superbase.fintech;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
/**
 * Application
 *
 * @author  jianghaoyu 
 */
//@SpringBootApplication
@Slf4j
@MapperScan("com.superbase.fintech.biz.mapper")
@SpringBootApplication(exclude={DruidDataSourceAutoConfigure.class})
public class Application {

    public static void main(String[] args) {
        log.info("  服务端启动开始");
        SpringApplication.run(Application.class, args);
        log.info("服务端启动成功");
    }
    
}

BaseEntity

package com.superbase.fintech.biz.entity;

import lombok.Data;

@Data
public class BaseEntity {
    private long id;
}

TUser

package com.superbase.fintech.biz.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * @author jianghaoyu
 * @since 2023-04-28
 */
@Data
//@EqualsAndHashCode(callSuper = true)
//@Accessors(chain = true)
//@TableName("t_user")
//public class TUser extends Model<TUser> {
public class TUser extends BaseEntity{
    /**
     * 主键Id 必须注释掉,才可自动生成
     */
//    private long id;
    /**
     * 名称
     */
    private String name;
    /**
     * 年龄
     */
    private int age;

}

TUserMapper

package com.superbase.fintech.biz.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.superbase.fintech.biz.entity.TUser;

/**
 * <p>
 * 系统用户表 Mapper 接口
 * </p>
 *
 * @author  jianghaoyu 
 * @since 2023-04-28
 */
public interface TUserMapper extends BaseMapper<TUser> {

}

TUserService

package com.superbase.fintech.biz.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.superbase.fintech.biz.entity.TUser;

import java.util.List;

public interface TUserService extends IService<TUser> {

    /**
     * 保存用户信息
     *
     * @param entity
     * @return
     */
    @Override
    boolean save(TUser entity);

    /**
     * 查询全部用户信息
     *
     * @return
     */
    List<TUser> getUserList();

}

TUserServiceImpl

package com.superbase.fintech.biz.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.superbase.fintech.biz.entity.TUser;
import com.superbase.fintech.biz.mapper.TUserMapper;
import com.superbase.fintech.biz.service.TUserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TUserServiceImpl extends ServiceImpl<TUserMapper, TUser> implements TUserService {
    @Override
    public boolean save(TUser entity) {
        return super.save(entity);
    }

    @Override
    public List<TUser> getUserList() {
        return baseMapper.selectList(Wrappers.lambdaQuery());
    }
}

TUserController

package com.superbase.fintech.biz.ctr;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.superbase.fintech.biz.entity.TUser;
import com.superbase.fintech.biz.mapper.TUserMapper;
import com.superbase.fintech.biz.service.TUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * TUserController
 * @author  jianghaoyu  
 * 
 */
@RestController
public class TUserController {
    @Autowired
    private TUserService userService;
    @Autowired
    private TUserMapper tUserMapper;

    @GetMapping("/page")
    public IPage<TUser> page() {
        QueryWrapper<TUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("age");
        Page<TUser> page = new Page<>(2, 5);

        IPage<TUser> pageList = userService.page(page, queryWrapper);

        return pageList;
    }

    @GetMapping("/save")
    public Boolean insert(TUser user) {
        TUser t = new TUser();
        t.setName("cccccccccccccccc");
        return userService.save(t);
    }

    @RequestMapping("/dao/save")
    public String save() {
        TUser t = new TUser();
        t.setName("SS");
        tUserMapper.insert(t);
        return "true";
    }
}

测试

http://localhost:8080/save

http://localhost:8080/page

ok

持续更新

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

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

相关文章

OSG笔记:AutoTransform实现固定像素大小的图形

需求 在(200,0,0)位置绘制固定10像素大小的正方体 实现方式 为了便于观察&#xff0c;例子中绘制了两条直线&#xff0c;相交于(200,0,0)。 //两根直线交于(200, 0, 0)&#xff0c;用于辅助观察 {osg::Geometry* pLineGeom new osg::Geometry();osg::Vec3Array* pVertexArra…

python语法复习

print&#xff1a;输出函数 print(520)效果&#xff1a;输出520. print(hello)效果&#xff1a;输出hello. print(1020)【效果&#xff1a;输出了:1020】注&#xff1a;“ ”在print里面是一个连接符。 print(1020)【效果&#xff1a;输出了30】注&#xff1a; 在此处…

OJ 系统常用功能介绍 快速入门 C++ Python JAVA语言在线评测

技术支持微 makytony 服务器配置 腾讯云 2H4G 5M 60GB 轻量应用服务器 承载大约 200~400人使用&#xff0c;经过压力测试&#xff0c;评测并发速度可满足130人左右的在线比赛。 系统镜像选 Ubuntu 22.04 LTS &#xff0c;Ubuntu是最热门的Linux发行版之一&#xff0c;是一款…

洞车系统常见问题解决指南

洞车常见问题解决指南 1.研发脚本处理问题1.1 WMS出库单无法审核1.2 OMS入库单无法提交&#xff0c;提示更新中心库存失败1.3 当出现OMS下发成功WMS/TMS/DMS还没有任务的情况时处理方案1.4 调度波次生成或者添加任务系统异常1.5 东鹏出库单部分出库回传之后要求重传1.6 更新订单…

spring、springmvc、springboot、mybatis框架高频面试题

一、spring 1、Spring框架中的单例bean是线程安全的吗&#xff1f; 不是线程安全的&#xff0c;是这样的&#xff1a; 当多用户同时请求一个服务时&#xff0c;容器会给每一个请求分配一个线程&#xff0c;这是多个线程会并发执行该请求对应的业务逻辑&#xff08;成员方法&a…

ES索引结构升级-笔记

ES中索引的字段类型是不可修改的&#xff0c;只能是重新创建一个索引并设置好mapping&#xff0c;然后再将老索引的数据复制过去 查看老索引mapping GET /twitter/_mappings创建new索引&#xff0c;并指定mapping PUT /twitter410{"mappings": {"properties&…

金3银四结束了,回顾一下我2个月面试的公司....

金三银四结束了&#xff0c;还没有 offer 的同学不要气馁&#xff0c;该来的迟早会来。楼主从 年底 月有想法跳槽开始准备春招&#xff0c;一开始也是惨不忍睹&#xff0c;后来慢慢进入状态最近的面试基本都能走到终面&#xff0c;所以好好坚持&#xff0c;最后一定会有好结果的…

操作系统考试复习——第四章 存储器管理 4.1 4.2

存储器的层次结构&#xff1a; 存储器的多层结构&#xff1a; 存储器至少分为三级&#xff1a;CPU寄存器&#xff0c;主存和辅存。 但是一般分为6层为寄存器&#xff0c;高速缓存&#xff0c;主存储器&#xff0c;磁盘缓存&#xff0c;固定磁盘&#xff0c;可移动存储介质。…

无需重复造轮子—借助 Jetpack 组件,加速应用程序开发

简介 Android Jetpack 是谷歌官方推出的一套 Android 应用架构组件库&#xff0c;旨在为 Android 应用开发提供一种更优秀、更高效且更简单的方式。 Android Jetpack 对开发者带来了许多好处&#xff0c;以下是其中的一些&#xff1a; 提高开发效率&#xff1a;Jetpack 提供…

vue项目重复点击一个路由会报错如何解决

在新版本的vue-router中&#xff0c;重复点击同一个路由会出现以下报错 &#xff1a; 这个问题时vue-router 3.2.0版本的一个小Bug 方法有很多,比如降低路由版本(不推荐),但是推荐下面这种方式,比较简单靠谱 // 把这段代码直接粘贴到router/index.js中的Vue.use(VueRouter)之…

django:django2配置websocket

源码地址&#xff1a; https://gitee.com/liuhaizhang/django2-configuring-websockethttps://gitee.com/liuhaizhang/django2-configuring-websocket python3.9.0 django2.2.1 channels2.2.0 项目结构&#xff1a; test_websocket_django2 -chat -home -test_websocket_dja…

深度学习笔记之卷积神经网络(一)卷积函数与图像卷积操作

深度学习笔记之卷积神经网络——卷积函数 引言什么是卷积图像卷积操作 引言 从本节开始&#xff0c;将介绍卷积神经网络。本节将介绍卷积函数。 什么是卷积 卷积&#xff0c;是一种通过两个函数 f ( ⋅ ) 和 f(\cdot)和 f(⋅)和 g ( ⋅ ) g(\cdot) g(⋅)生成第三个函数 h ( …

备战花了2个月,春招3轮顺利拿下字节offer

PART1&#xff1a;个人情况简介 菜 J 一枚&#xff0c;本硕都是计算机&#xff08;普通二本&#xff09;&#xff0c;2021 届应届硕士&#xff0c;软件测试方向。个人也比较喜欢看书&#xff0c;技术书之类的都有看&#xff0c;最后下面也会推荐一些经典书籍。 先说一下春招结…

Docker--harbor私有仓库管理与部署

目录 一、本地私有仓库 搭建本地私有仓库 Docker容器的重启策略 二、Harbor 1、什么是Harbor 2、Harbor特性 3、Harbor的构成 三、Harbor部署 实验步骤 1、安装Docker-Compose服务 2、部署Harbor服务 1、下载或上传Harbor安装程序 2、修改Harbor安装的配置文件 3、…

day26_mysql

今日内容 零、 复习昨日 一、MySQL 一、引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。 文件&#xff08;File&#xff09;存储数据&#xff0c…

多款智能骑行终端齐登场,移远通信闪亮第31届中国国际自行车展览会

近年来&#xff0c;自行车、电动车市场火爆&#xff0c;随着数字化、智能化的持续深入&#xff0c;更具科技感的骑行工具受到了越来越多年轻一代的青睐。5月5-8日&#xff0c;以" 更安全、更智能、更低碳 " 为主题的第 31 届中国国际自行车展览会在上海新国际博览中心…

Java连接顺丰开放平台

今天使用Java去访问顺丰的开放平台时&#xff0c;JSON转换一直不成功&#xff0c;最终发现是 可以看到这里是 "apiResultData": "{\"success\": .........它是以 " 开头的&#xff01;&#xff01;&#xff01;如果是对象的话&#xff0c;那么…

Zookeeper初识

序 Zookeeper是什么&#xff0c;Zookeeper有什么用&#xff1f;因为在研究Zookeeper源码之后&#xff0c;就要去研究Dubbo源码&#xff0c;而Dubbo必然用到了Zookeeper&#xff0c;而我在写这篇博客时&#xff0c;我也是一个Zookeeper小白&#xff0c;我也有7年开发经验了&…

将ROS1和ROS2安装到同一个ubuntu系统中,ROS2安装

1. 本文测试环境: ubuntu:20.04,虚拟机 ROS1:noetic ROS2:foxy 2. 先说结论 ROS1 与 ROS2 共存,需要考虑三个问题: 1) 不同Ubuntu版本,有不同版本的ROS1和ROS2推荐,尽量不要任性地乱装; 2)ROS1和ROS2安装过程中,是否会出现文件“删改”的问题?目前使用下来,并…

章节1:PHP反序列化渗透与防御

章节1&#xff1a;PHP反序列化渗透与防御 1.1-PHP类与对象 类Class 一个共享相同结构和行为的对象的集合。 对象Object 类的实例 1.2-PHP Magic函数 Magic Methods https://www.php.net/__sleep 函数作用 函数作用__construct当一个对象创建时被调用__destruct当一个对象…