目录

  • 一、MyBatis-Plus的简单应用
  • 二、简单认识一下mybatis-plus常用注解
    • 主键id的自动生成策略:
    • 自动填充数据功能
    • 乐观锁配置
    • 逻辑删除配置
  • 三、MyBatis-Plus代码生成器:
  • 四、MyBatis-Plus查询功能:
    • 多个id的批量查询:
    • 简单条件查询:
    • 分页查询:
  • 五、条件构造器:QueryWrapper

一、MyBatis-Plus的简单应用

1、简介
MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。

官网文档地址:
  https://baomidou.com/pages/6b03c5/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95

2、使用 SpringBoot 快速使用 MyBatis-Plus

(1)准备工作
  需要 Java 开发环境(JDK)以及相应的开发工具(IDE)。
  需要 maven(用来下载相关依赖的 jar 包)。
  需要 SpringBoot。
  可以使用 IDEA 安装一个 mybatis-plus 插件。
  
(2)创建数据库mybatis_plus和数据表:Stu
数据库为mybatis_plus,id注意使用bigint

或者使用以下数据表:

DROP TABLE IF EXISTS user;CREATE TABLE user
(id BIGINT(20) NOT NULL COMMENT '主键ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) NULL DEFAULT NULL COMMENT '年龄',email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (id)
);INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

自己随便填一些数据即可。

(3)创建springboot项目:

创建好springboot项目后,引入依赖:mysql驱动版本与自己本机mysql版本一样。

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.18</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

application或者yml配置:

在 application.yml 文件中配置 mysql 数据源信息。


server:port: 8080spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTCusername: rootpassword: root

或者properties:

# mysql 5 驱动不同 com.mysql.jdbc.Driver
# mysql 8 驱动不同com.mysql.cj.jdbc.Driver、需要增加时区的配置 serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# 配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0


编写表对应的 实体类,创建实体类Stu:

package com.fan.demo.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
@Repository  //让spring管理bean
public class Stu {private Long  id;private String name;private Integer age;private String addr;private Double score;}

添加mapper接口:

编写操作实体类的 Mapper 类。
  直接继承 BaseMapper,这是 mybatis-plus 封装好的类。
注意:这里直接继承BaseMapper接口 ,可以省去繁琐的xml的编写。

package com.fan.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fan.demo.entity.Stu;public interface StuMapper extends BaseMapper<Stu> {
}

编写启动类: 配置@MapperScan

Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

package com.fan.demo;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.fan.demo.mapper")//mapper包所在的路径
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

编写测试类:

package com.fan.demo;import com.fan.demo.entity.Stu;
import com.fan.demo.mapper.StuMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
import java.util.List;@SpringBootTest
class DemoApplicationTests {@Resourceprivate StuMapper stuMapper;@Testvoid test01() {//测试查询所有List<Stu> stus = stuMapper.selectList(null);for(Stu stu:stus) {System.out.println(stu);}}}

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成MyBatis-Plus非常的简单,只需要引入 starter 工程,并配置 mapper 扫描路径即可。
注:
  若遇到 @Autowired 标记的变量出现 红色下划线,但是不影响 正常运行。

查看sql输出日志:

想要查看执行的 sql 语句,可以在 yml 文件中添加配置信息,如下。


server:port: 8080spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=UTCusername: rootpassword: root
#sql输出日志
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二、简单认识一下mybatis-plus常用注解

【1.@TableName 】

描述:表名注解,标识实体类对应的表
使用位置:实体类
@TableName 用于定义表名

@TableName("sys_user")
public class User {private Long id;private String name;private Integer age;private String email;
}

【2.@TableId】
@TableId 用于定义表的主键
注:
常用属性:
value 用于定义主键字段名
type 用于定义主键类型(主键策略 IdType)

主键策略:

IdType.AUTO 主键自增,系统分配,不需要手动输入
IdType.NONE 未设置主键
IdType.INPUT 需要自己输入 主键值。
IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。

@TableName("sys_user")
public class User {@TableIdprivate Long id;private String name;private Integer age;private String email;
}

【@TableField】

@TableField 用于定义表的非主键字段。

注:
常用属性:
value 用于定义非主键字段名
exist 用于指明是否为数据表的字段, true 表示是,false 为不是。
fill 用于指定字段填充策略(FieldFill)。

字段填充策略:(一般用于填充 创建时间、修改时间等字段)FieldFill.DEFAULT         默认不填充FieldFill.INSERT          插入时填充FieldFill.UPDATE          更新时填充FieldFill.INSERT_UPDATE   插入、更新时填充。

【@TableLogic】
Logic:逻辑的意思
@TableLogic 用于定义表的字段进行逻辑删除(非物理删除)
注:
常用属性:
value 用于定义未删除时字段的值
delval 用于定义删除时字段的值

【@Version】
@Version 用于字段实现乐观锁

【@Accessors(chain = true)】

这个注解是来至于lombok里面的 只需要在实体类加上就可以开启链式编程了



主键id的自动生成策略:

主键策略:
IdType.AUTO 主键自增,系统分配,不需要手动输入
IdType.NONE 未设置主键
IdType.INPUT 需要自己输入 主键值。
IdType.ASSIGN_ID 系统分配 ID,用于数值型数据(Long,对应 mysql 中 BIGINT 类型)。
IdType.ASSIGN_UUID 系统分配 UUID,用于字符串型数据(String,对应 mysql 中 varchar(32) 类型)。




主键策略可以在代码自动生成器中设置:gc.setIdType(IdType.ASSIGN_ID);//设置主键策略

自动填充数据功能

1)简介
  添加、修改数据时,每次都会使用相同的方式进行填充。比如 数据的创建时间、修改时间等。
  Mybatis-plus 支持自动填充这些字段的数据。

给之前的数据表新增两个字段:创建时间、修改时间。

第一步:使用 @TableField 注解,标注需要进行填充的字段updateTime/createTime
  
在实体类中修改如下:


/*** 创建时间*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;/*** 最后修改时间*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

第二步:编写自动填充的处理器类
  自定义一个类(handler包下),实现 MetaObjectHandler 接口,并重写方法。
  添加 @Component 注解,交给 Spring 去管理。

package com.fan.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Slf4j
@Component // 一定不要忘记把处理器加到IOC容器中!
public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill.....");// setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObjectthis.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}// 更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill.....");this.setFieldValByName("updateTime",new Date(),metaObject);}
}

第三步:简单测试一下:

 @ResourceStuService stuService;@Testpublic void testAutoFill() {Stu stu = new Stu();stu.setName("tom333");stu.setAge(20);stu.setScore(90.0);if (stuService.save(stu)) {stuService.list().forEach(System.out::println);} else {System.out.println("添加数据失败");}}

效果:

乐观锁配置


乐观锁配置需要两步

#1.配置插件

package com.fan.mybatis_plus1.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.fan.mybatis_plus1.mapper")
public class MyConfig {/*** 新版*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return mybatisPlusInterceptor;}
}

2.在实体类的字段上加上@Version注解
@Version
private Integer version;

测试:

 @Testpublic void testVerson() {Stu stu = stuService.getById(1L);stu.setAge(898);boolean update = stuService.updateById(stu);}

逻辑删除配置

1)简介
  删除数据,可以通过物理删除,也可以通过逻辑删除。
  物理删除指的是直接将数据从数据库中删除,不保留。
  逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数据)。

给数据表增加一个字段:deleted,用于表示该数据是否被逻辑删除。

逻辑删除(0 未删除、1 删除)

例: 1.application.yml

mybatis-plus:global-config:db-config:logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

2: 实体类字段上加上@TableLogic注解
@TableLogic
private Integer deleted;

测试逻辑删除:先将deleted修改成0

成功:

三、MyBatis-Plus代码生成器:

(1)AutoGenerator 简介
  AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
  与 mybatis 中的 mybatis-generator-core 类似。

(2)添加依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.1.tmp</version>
</dependency>
<!-- 添加 模板引擎 依赖 -->
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.2</version>
</dependency>

完整的表数据:

工具类:自动代码生成器:

package com.fan.utils;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;import java.util.ArrayList;
import java.util.Scanner;public class CodeGenerator {public static String scanner(String tip) {Scanner scanner = new Scanner(System.in);StringBuilder help = new StringBuilder();help.append("请输入" + tip + ":");System.out.println(help.toString());if (scanner.hasNext()) {String ipt = scanner.next();if (StringUtils.isNotBlank(ipt)) {return ipt;}}throw new MybatisPlusException("请输入正确的" + tip + "!");}public static void main(String[] args) {// 代码生成器AutoGenerator mpg = new AutoGenerator();// 全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");//用户路径,不用修改gc.setOutputDir(projectPath + "/src/main/java");//设置代码生成路径:用户路径+/src/main/javagc.setFileOverride(true);//是否覆盖以前文件gc.setOpen(false);//是否打开生成目录gc.setAuthor("fan");//设置项目作者名称gc.setIdType(IdType.AUTO);//设置主键策略gc.setBaseResultMap(true);//生成基本ResultMapgc.setBaseColumnList(true);//生成基本ColumnListgc.setServiceName("%sService");//去掉服务默认前缀gc.setDateType(DateType.ONLY_DATE);//设置时间类型mpg.setGlobalConfig(gc);// 数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");dsc.setDriverName("com.mysql.cj.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("root");mpg.setDataSource(dsc);// 包配置PackageConfig pc = new PackageConfig();pc.setParent("com.fan");pc.setMapper("mapper");pc.setXml("mapper.xml");pc.setEntity("pojo");pc.setService("service");pc.setServiceImpl("service.impl");pc.setController("controller");mpg.setPackageInfo(pc);// 策略配置StrategyConfig sc = new StrategyConfig();sc.setNaming(NamingStrategy.underline_to_camel);sc.setColumnNaming(NamingStrategy.underline_to_camel);sc.setEntityLombokModel(true);//自动lomboksc.setRestControllerStyle(true);sc.setControllerMappingHyphenStyle(true);sc.setLogicDeleteFieldName("deleted");//设置逻辑删除//设置自动填充配置TableFill gmt_create = new TableFill("create_time", FieldFill.INSERT);TableFill gmt_modified = new TableFill("update_time", FieldFill.INSERT_UPDATE);ArrayList<TableFill> tableFills=new ArrayList<>();tableFills.add(gmt_create);tableFills.add(gmt_modified);sc.setTableFillList(tableFills);//乐观锁sc.setVersionFieldName("version");sc.setRestControllerStyle(true);//驼峰命名//  sc.setTablePrefix("tbl_"); 设置表名前缀sc.setInclude(scanner("表名,多个英文逗号分割").split(","));mpg.setStrategy(sc);// 生成代码mpg.execute();}}

执行代码生成器后的效果:

四、MyBatis-Plus查询功能:

多个id的批量查询:

server的查询方法list:

// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

mapper的查询:

// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

//测试查询

   @Testpublic void testFindBach() {List<Stu> stus = stuService.listByIds(Arrays.asList(1, 2, 3));System.out.println(stus);}@Testpublic void testFind2() {HashMap<String, Object> map = new HashMap<>();map.put("id",1L);map.put("score",90.0);List<Stu> stus = stuService.listByMap(map);System.out.println(stus);}

简单条件查询:

分页查询:

Step1:
  配置分页插件。
  编写一个 配置类,内部使用 @Bean 注解将 PaginationInterceptor 交给 Spring 容器管理。
分页插件:配置在config包下:

  /*** 分页插件* @return 分页插件的实例*/@Beanpublic PaginationInnerInterceptor paginationInterceptor() {return new PaginationInnerInterceptor();}

Step2:
  编写分页代码。
  直接 new 一个 Page 对象,对象需要传递两个参数(当前页,每页显示的条数)。
  调用 mybatis-plus 提供的分页查询方法,其会将 分页查询的数据封装到 Page 对象中。

@Testpublic void testPage() {// Step1:创建一个 Page 对象Page<Stu> page = new Page<>(1, 3);// Step2:调用 mybatis-plus 提供的分页查询方法stuService.page(page, null);// Step3:获取分页数据System.out.println(page.getCurrent()); // 获取当前页System.out.println(page.getTotal()); // 获取总记录数System.out.println(page.getSize()); // 获取每页的条数System.out.println(page.getRecords()); // 获取每页数据的集合System.out.println(page.getPages()); // 获取总页数System.out.println(page.hasNext()); // 是否存在下一页System.out.println(page.hasPrevious()); // 是否存在上一页}

五、条件构造器:QueryWrapper



参考::

https://www.cnblogs.com/l-y-h/p/12859477.html#_label2

MyBatis-Plus介绍和使用相关推荐

  1. mybatisplus 结果_Java之MyBatis Plus介绍

    Java之MyBatis Plus介绍 1.MyBatis Plus 介绍 MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开 ...

  2. MyBatis-学习笔记01【01.Mybatis课程介绍及环境搭建】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  3. MyBatis JdbcType介绍

    MyBatis JdbcType介绍 JdbcType介绍 数据库列字段都是有类型的,不同的数据库有不同的类型.为了表示这些数据类型,Java源码是采用枚举来定义的: public enum JDBC ...

  4. 1. MyBatis框架介绍

    1. MyBatis框架介绍 1. 框架概述 程序开发中框架(framework)往往是对常见功能的封装,可以把框架理解为软件的设计规范或者标准化的组件,好比机械中的螺丝螺母等标准的机械部件 假如你要 ...

  5. Java MyBatis的介绍及其执行原理

    写在前面 ??MyBatis学习 ??今天我们进行MyBatis框架的学习,认识MyBatis及其执行原理,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!! 如果觉得博主文章还不错,可 ...

  6. MyBatis详细介绍

    MyBatis基础入门 内容 1.MyBatis介绍 2.MyBatis入门程序 3.MyBatis使用Mapper接口 4.MyBatis之Config文件常用配置 一.MyBatis简介 1 .简 ...

  7. 【java学习之路】(java框架)003.Mybatis的介绍和基本使用

    01Mybatis的介绍和基本使用 0.数据库操作框架的历程 (1) JDBC ​ JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java ...

  8. mybatis plus介绍

    简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 我们的愿景是成为Mybatis最好的搭档,就像 ...

  9. mybatis框架介绍

    前端时间学了mybatis,现在终于挤出时间来整理下了. 1.mybatis介绍: 1.MyBatis 原来是apache的一个开源项目ibatis,后来改名为mybatis,所以说ibatis和my ...

  10. 【SSM框架系列】Mybatis基本介绍

    原始jdbc操作 //1. 导入驱动jar包//2.注册驱动Class.forName("com.mysql.jdbc.Driver");//3.获取数据库连接对象Connecti ...

最新文章

  1. 用朴素贝叶斯模型预测柯南中被害人和凶手!
  2. MySQL中的外连接
  3. win10北通手柄没反应_《动物森友会》怎么玩出新花样?北通宙斯游戏手柄宏玩法了解下...
  4. 【Solr专题之九】SolrJ教程
  5. 解决 VUE: [Vue warn]: Do not use built-in or reserved HTML elements as component id: xx
  6. 小程序的服务器怎么与数据库连接,小程序怎么连接服务器数据库
  7. java char数组查找_我爱java系列---【在字符数组中查询某个字符串是否存在】
  8. quarz设置定时器任务的有效时间段_quartz定时任务时间设置
  9. 设计模式:高性能IO之Reactor模式
  10. xlc mysql_mysql – 用于存储产品信息的noSQL?
  11. [菜鸟自学过程] ASP.NET2.0 ClientCallback脚本回调
  12. 【ASP.NET学习笔记一】ASP.NET页面传参总结
  13. 如何将原生PDF转为纯图像Word?
  14. 【机器人算法】机器人动力学参数辨识
  15. Cocos Creater 获取和设置世界坐标
  16. 稞麦显示无法连接服务器,Modern Ops无法连接服务器是什么原因
  17. 多媒体技术计算题、操作题
  18. 士不可不弘毅,任重而道远——2021年总结
  19. ibmRaid5服务器换硬盘,IBM 小型机更换硬盘过程: raid5
  20. 基于H5的Speedtest网速测试工具搭建

热门文章

  1. 4k电脑屏幕VMware虚拟机视面的调大
  2. 戴尔计算机主板电路图,戴尔Dell-D630主板电路图.pdf
  3. 好用的社群工具有什么功能
  4. c语言哈夫曼树统计字母频率,C语言实现哈夫曼树
  5. 如何布署 PyTorch 深度学习模型
  6. 从“罘罟”到服务的抽象性与可复用性
  7. 【Faker】随机生成测试数据
  8. xXx时间屏保 3.6.1
  9. 【深入蜘蛛】百度蜘蛛IP段详解
  10. 0基础学编程树莓派和python_零基础学编程:树莓派和Python