主頁 > 後端開發 > 看了我的 mybatis-plus 用法,全公司同事開始悄悄模仿了。。

看了我的 mybatis-plus 用法,全公司同事開始悄悄模仿了。。

2022-10-29 07:14:58 後端開發

本文主要介紹 mybatis-plus 這款插件,針對 springboot 用戶,包括引入,配置,使用,以及擴展等常用的方面做一個匯總整理,盡量包含大家常用的場景內容,

作者:我犟不過你 
原文鏈接:https://juejin.cn/post/7054726274362638350

關于 mybatis-plus 是什么,不多做介紹了,看官方檔案,咱們直接代碼擼起來,

一、快速開始

本文基于 springboot、maven、jdk1.8、mysql 開發,所以開始前我們需要準備好這套環境,

Spring Boot 基礎就不介紹了,推薦看這個免費教程:

https://github.com/javastacks/spring-boot-best-practice

新建如下資料庫:

建議大家選擇 utf8mb4 這種字符集,做過微信的同學應該會知道,微信用戶名稱的表情,是需要這種字符集才能存盤的,

我就默認其他環境已經準備好了,咱們直接從 mybatis-plus 開始,

1.1 依賴準備

想要什么依賴版本的去 maven 倉庫查看:

https://mvnrepository.com/

引入 mybatis-plus 依賴:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

引入 mysql 依賴:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.27</version>
</dependency>

目前,多數專案會有多資料源的要求,或者是主從部署的要求,所以我們還需要引入 mybatis-plus 關于多資料源的依賴:

<!-- mybatis-plus 多資料源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.0</version>
</dependency>

1.2 配置準備

Spring Boot 基礎就不介紹了,推薦看這個免費教程:

https://github.com/javastacks/spring-boot-best-practice

springboot 啟動類,配置@MapperScan 注解,用于掃描 Mapper 檔案位置:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@MapperScan(\"com.wjbgn.user.mapper\")
@SpringBootApplication
public class RobNecessitiesUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(RobNecessitiesUserApplication.class, args);
    }

}

資料源配置,此處配置一主一從的環境,當前我只有一臺,所以此處配置一樣的:

spring:
  datasource:
    dynamic:
      primary: master #設定默認的資料源或者資料源組,默認值即為master
      strict: false #嚴格匹配資料源,默認false. true未匹配到指定資料源時拋例外,false使用默認資料源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/rob_necessities?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone =Asia/Shanghai
          username: root
          password: 123456
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/rob_necessities?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone =Asia/Shanghai
          username: root
          password: 123456

補充:這里面因為默認使用的是HikariCP資料源,目前也推薦使用這個,相比于druid有更高的性能,但是不能忽略下面的配置,否則服務會不斷拋出例外,原因是資料庫的連接時常和連接池的配置沒有做好,

spring:
  datasource:
    dynamic:
      hikari:
        max-lifetime: 1800000
        connection-timeout: 5000
        idle-timeout: 3600000
        max-pool-size: 12
        min-idle: 4
        connection-test-query: /**ping*/

1.3 啟動服務

下面直接啟動服務:

得到如上結果表示啟動成功了,

二、使用

前面我們成功的集成進來了 mybatis-plus,配合 springboot 使用不要太方便,下面我們看看如何使用它來操作我們的資料庫,介紹一下常規的用法,

2.1 物體類注解

mybatis-plus 為使用者封裝了很多的注解,方便我們使用,我們首先看下物體類中有哪些注解,有如下的物體類:

@TableName(value = https://www.cnblogs.com/"user\")
public class UserDO {

    /**
     * 主鍵
     */
    @TableId(value = https://www.cnblogs.com/"id\", type = IdType.AUTO)
    private Long id;

    /**
     * 昵稱
     */
    @TableField(\"nickname\")
    private String nickname;

    /**
     * 真實姓名
     */
    private String realName;
}

@TableName 表名注解,用于標識物體類對應的表,

其說明如下,關于這些書寫,常規情況基本很少用到,不做多余解釋了:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
public @interface TableName {

    /**
     * 物體對應的表名
     */
    String value() default \"\";

    /**
     * schema
     *
     * @since 3.1.1
     */
    String schema() default \"\";

    /**
     * 是否保持使用全域的 tablePrefix 的值
     * <p> 只生效于 既設定了全域的 tablePrefix 也設定了上面 {@link #value()} 的值 </p>
     * <li> 如果是 false , 全域的 tablePrefix 不生效 </li>
     *
     * @since 3.1.1
     */
    boolean keepGlobalPrefix() default false;

    /**
     * 物體映射結果集,
     * 只生效與 mp 自動注入的 method
     */
    String resultMap() default \"\";

    /**
     * 是否自動構建 resultMap 并使用,
     * 只生效與 mp 自動注入的 method,
     * 如果設定 resultMap 則不會進行 resultMap 的自動構建并注入,
     * 只適合個別欄位 設定了 typeHandler 或 jdbcType 的情況
     *
     * @since 3.1.2
     */
    boolean autoResultMap() default false;

    /**
     * 需要排除的屬性名
     *
     * @since 3.3.1
     */
    String[] excludeProperty() default {};
}

@TableId 主鍵注解

看看其原始碼:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableId {

    /**
     * 欄位值(駝峰命名方式,該值可無)
     */
    String value() default \"\";

    /**
     * 主鍵ID
     * {@link IdType}
     */
    IdType type() default IdType.NONE;
}

其中 IdType 很重要:

名稱 描述
AUTO 資料庫自增 ID
NONE 該型別為未設定主鍵型別(注解里等于跟隨全域,全域里約等于 INPUT)
INPUT 用戶自己設定的 ID
ASSIGN_ID 當用戶傳入為空時,自動分配型別為 Number 或 String 的主鍵(雪花演算法)
ASSIGN_UUID 當用戶傳入為空時,自動分配型別為 String 的主鍵

@TableFiled 表欄位標識

下面看看其主要常用屬性:

名稱 描述
value 資料庫欄位名
condition 欄位 where 物體查詢比較條件,通過SqlCondition設定 如果未設定條件,則按照正常相等來查詢 若設定則按照以下規則: 等于:EQUAL = "%s=#{%s}"; 不等于:NOT_EQUAL = "%s<>#{%s}"; 左右模糊:LIKE = "%s LIKE CONCAT('%%',#{%s},'%%')"; oracle 左右模糊 ORACLE_LIKE = "%s LIKE CONCAT(CONCAT('%%',#{%s}),'%%')"; 左模糊:LIKE_LEFT = "%s LIKE CONCAT('%%',#{%s})"; 右模糊:LIKE_RIGHT = "%s LIKE CONCAT(#{%s},'%%')";
fill 自動填充策略,通過FieldFill設定 不處理:FieldFill.DEFAULT 插入時填充欄位:FieldFill.INSERT 更新時填充欄位:FieldFill.UPDATE 插入或新增時填充欄位:FieldFill.INSERT_UPDATE

關于其他的屬性,我不太推薦使用,用得越多,越容易蒙圈,可以通過 wapper 查詢去設定,

2.2 CRUD

mybatis-plus 封裝好了一條介面供我們直接呼叫,關于內部的具體方法,在使用時候自己體會吧,此處不列舉了,

2.2.1 Service 層 CRUD

我們使用的時候,需要在自己定義的 service 介面當中繼承IService介面:

import com.baomidou.mybatisplus.extension.service.IService;
import com.wjbgn.user.entity.UserDO;

/**
 * @description: 用戶服務介面
 * @author:weirx
 * @date:2022/1/17 15:02
 * @version:3.0
 */
public interface IUserService extends IService<UserDO> {
}

同時要在我們的介面實作 impl 當中繼承ServiceImpl,實作自己的介面:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wjbgn.user.entity.UserDO;
import com.wjbgn.user.mapper.UserMapper;
import com.wjbgn.user.service.IUserService;

/**
 * @description: 用戶介面實作
 * @author:weirx
 * @date:2022/1/17 15:03
 * @version:3.0
 */
public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements IUserService {

}

所以我們的

2.2.2 Mapper 層 CRUD

mybatis-plus 將常用的 CRUD 介面封裝成了BaseMapper介面,我們只需要在自己的 Mapper 中繼承它就可以了:

/**
 * @description: 用戶mapper
 * @author:weirx
 * @date:2022/1/17 14:55
 * @version:3.0
 */
@Mapper
public interface UserMapper extends BaseMapper<UserDO> {
}

2.3 分頁

使用分頁話需要增加分頁插件的配置:

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan(\"com.wjbgn.*.mapper*\")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

如上配置后,我們直接使用分頁方法就行,

2.4 邏輯洗掉配置

很多情況下我們的系統都需要邏輯洗掉,方便恢復查找誤洗掉的資料,

通過 mybatis-plus 可以通過全域配置的方式,而不需要再去手動處理,針對更新和查詢操作有效,新增不做限制,

通常以我的習慣邏輯洗掉欄位通常定義為is_delete,在物體類當中就是isDelete,那么在組態檔中就可以有如下的配置:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: isDelete # 全域邏輯洗掉的物體欄位名(since 3.3.0,配置后可以忽略不配置步驟2)
      logic-delete-value: 1 # 邏輯已洗掉值(默認為 1)
      logic-not-delete-value: 0 # 邏輯未洗掉值(默認為 0)

或者通過注解@TableLogic

@TableLogic
private Integer isDelete;

2.5 通用列舉配置

相信后端的同學都經歷過一個情況,比如性別這個欄位,分別值和名稱對應1男2女,這個欄位在資料庫時是數值型別,而前端展示則是展示字串的名稱,有幾種常見實作方案呢?

  • 資料庫查詢 sql 通過 case 判斷,回傳名稱,以前 oracle 經常這么做
  • 資料庫回傳的值,重新遍歷賦值進去,這時候還需要判斷這個值到底是男是女,
  • 前端寫死,回傳 1 就是男,回傳 2 就是女,

相信無論哪種方法都有其缺點,所以我們可以使用 mybatis-plus 提供的方式,我們在回傳給前端時:

  • 只需要在遍歷時 get 這個列舉,直接賦值其名稱,不需要再次判斷,
  • 直接回傳給前端,讓前端去去列舉的 name

這樣大家都不需要寫死這個值,

下面看看如何實作這個功能:

  • 興義列舉,實作 IEnum 介面:
import com.baomidou.mybatisplus.annotation.IEnum;
import com.fasterxml.jackson.annotation.JsonFormat;

/**
 * @description: 性別列舉
 * @author:weirx
 * @date:2022/1/17 16:26
 * @version:3.0
 */
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum SexEnum implements IEnum<Integer> {
    MAN(1, \"男\"),
    WOMAN(2, \"女\");
    private Integer code;
    private String name;

    SexEnum(Integer code, String name) {
        this.code = code;
        this.name = name;
    }

    @Override
    public Integer getValue() {
        return code;
    }

    public String getName() {
        return name;
    }

}

@JsonFormat 注解為了解決列舉類回傳前端只展示構造器名稱的問題,

  • 物體類性別欄位
@TableName(value = https://www.cnblogs.com/"user\")
public class UserDO {

    /**
     * 主鍵
     */
    @TableId(value = https://www.cnblogs.com/"id\", type = IdType.AUTO)
    private Long id;

    /**
     * 昵稱
     */
    @TableField(value = https://www.cnblogs.com/"nickname\",condition = SqlCondition.EQUAL)
    private String nickname;

    /**
     * 性別
     */
    @TableField(value = https://www.cnblogs.com/"sex\")
    private SexEnum sex;

    /**
     * 版本
     */
    @TableField(value = https://www.cnblogs.com/"version\",update = \"%s+1\")
    private Integer version;

    /**
     * 時間欄位,自動添加
     */
    @TableField(value = https://www.cnblogs.com/"create_time\",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
}
  • 組態檔掃描列舉
mybatis-plus:
  # 支持統配符 * 或者 ; 分割
  typeEnumsPackage: com.wjbgn.*.enums
  • 定義組態檔
@Bean
public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
    return properties -> {
        GlobalConfig globalConfig = properties.getGlobalConfig();
        globalConfig.setBanner(false);
        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
        properties.setConfiguration(configuration);
    };
}
  • 序列化列舉值為資料庫值

    以下我是使用的 fastjson:

    • 全域(添加在前面的組態檔中):
 @Bean
 public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
     // 序列化列舉值為資料庫存盤值
     FastJsonConfig config = new FastJsonConfig();
     config.setSerializerFeatures(SerializerFeature.WriteEnumUsingToString);

     return properties -> {
         GlobalConfig globalConfig = properties.getGlobalConfig();
         globalConfig.setBanner(false);
         MybatisConfiguration configuration = new MybatisConfiguration();
         configuration.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
         properties.setConfiguration(configuration);
     };
 }
  • 區域
 @JSONField(serialzeFeatures= SerializerFeature.WriteEnumUsingToString)
 private SexEnum sex;

2.6 自動填充

還記得前面提到的物體類當中的注解@TableFeild嗎?當中有個屬性叫做 fill,通過FieldFill設定屬性,這個就是做自動填充用的,

public enum FieldFill {
    /**
     * 默認不處理
     */
    DEFAULT,
    /**
     * 插入填充欄位
     */
    INSERT,
    /**
     * 更新填充欄位
     */
    UPDATE,
    /**
     * 插入和更新填充欄位
     */
    INSERT_UPDATE
}

但是這個直接是不能使用的,需要通過實作 mybatis-plus 提供的介面,增加如下配置:

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * description: 啟動自動填充功能

 * @return:
 * @author: weirx
 * @time: 2022/1/17 17:00
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        // 起始版本 3.3.0(推薦使用)
        this.strictInsertFill(metaObject, \"createTime\", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 起始版本 3.3.0(推薦)
        this.strictUpdateFill(metaObject, \"updateTime\", LocalDateTime.class, LocalDateTime.now());
    }
}

欄位如下:

/**
 * 時間欄位,自動添加
 */
@TableField(value = https://www.cnblogs.com/"create_time\",fill = FieldFill.INSERT)
private LocalDateTime createTime;

2.7 多資料源

前面提到過,組態檔當中配置了主從的方式,其實 mybatis-plus 還支持更多的方式:

  • 多主多從
spring:
  datasource:
    dynamic:
      primary: master #設定默認的資料源或者資料源組,默認值即為master
      strict: false #嚴格匹配資料源,默認false. true未匹配到指定資料源時拋例外,false使用默認資料源
      datasource:
        master_1:
        master_2:
        slave_1:
        slave_2:
        slave_3:
  • 多種資料庫
spring:
  datasource:
    dynamic:
      primary: mysql #設定默認的資料源或者資料源組,默認值即為master
      strict: false #嚴格匹配資料源,默認false. true未匹配到指定資料源時拋例外,false使用默認資料源
      datasource:
        mysql:
        oracle:
        postgresql:
        h2:
        sqlserver:
  • 混合配置
spring:
  datasource:
    dynamic:
      primary: master #設定默認的資料源或者資料源組,默認值即為master
      strict: false #嚴格匹配資料源,默認false. true未匹配到指定資料源時拋例外,false使用默認資料源
      datasource:
        master_1:
        slave_1:
        slave_2:
        oracle_1:
        oracle_2:

上面的三種方式,除了混合配置,我覺得都有肯能出現的吧,

  • @DS 注解

可以注解在方法上或類上,同時存在就近原則 【方法上注解】 優先于 【類上注解】

@DS(\"slave_1\")
public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements IUserService {

    @DS(\"salve_1\")
    @Override
    public List<UserDO> getList() {
        return this.getList();
    }

    @DS(\"master\")
    @Override
    public int saveUser(UserDO userDO) {
        boolean save = this.save(userDO);
        if (save){
            return 1;
        }else{
            return 0;
        }
    }
}

三、測驗

經過上面的配置,下面開始進入測驗驗證階段,

建立一張表:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nickname` varchar(255) NOT NULL COMMENT '昵稱',
  `sex` tinyint(1) NOT NULL COMMENT '性別,1男2女',
  `create_time` datetime NOT NULL COMMENT '創建時間',
  `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否洗掉 1是,0否',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8mb4;

controller:

/**
 * @description: 用戶controller
 * @author:weirx
 * @date:2022/1/17 17:39
 * @version:3.0
 */
@RestController
@RequestMapping(\"/user\")
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * description: 新增

     * @return: boolean
     * @author: weirx
     * @time: 2022/1/17 19:11
     */
    @RequestMapping(\"/save\")
    public boolean save() {
        UserDO userDO = new UserDO();
        userDO.setNickname(\"大漂亮\");
        userDO.setSex(SexEnum.MAN);

        return userService.save(userDO);
    }

    /**
     * description: 修改
     * @param nickname
     * @param id
     * @return: boolean
     * @author: weirx
     * @time: 2022/1/17 19:11
     */
    @RequestMapping(\"/update\")
    public boolean update(@RequestParam String nickname,@RequestParam Long id) {
        UserDO userDO = new UserDO();
        userDO.setNickname(nickname);
        userDO.setId(id);
        return userService.updateById(userDO);
    }

    /**
     * description: 洗掉
     * @param id
     * @return: boolean
     * @author: weirx
     * @time: 2022/1/17 19:11
     */
    @RequestMapping(\"/delete\")
    public boolean delete(@RequestParam Long id) {
        UserDO userDO = new UserDO();
        userDO.setId(id);
        return userService.removeById(userDO);
    }

    /**
     * description: 串列
     * @return: java.util.List<com.wjbgn.user.entity.UserDO>
     * @author: weirx
     * @time: 2022/1/17 19:11
     */
    @RequestMapping(\"/list\")
    public List<UserDO> list() {
        return userService.list();
    }

    /**
     * description: 分頁串列
     * @param current
     * @param size
     * @return: com.baomidou.mybatisplus.extension.plugins.pagination.Page
     * @author: weirx
     * @time: 2022/1/17 19:11
     */
    @RequestMapping(\"/page\")
    public Page page(@RequestParam int current,@RequestParam int size) {
        return userService.page(new Page<>(current,size), new QueryWrapper(new UserDO()));
    }

}

記過上面的介面驗證,功能沒有問題,集成成功,上文基本覆寫了 mybatis-plus 常用的特性,有同學說自動代碼生成沒說?

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了,,,

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522856.html

標籤:Java

上一篇:Spring Retry 重試

下一篇:HashMap和HashSet的不同之處簡介說明

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more