简述MyBatis、MyBatis-Plus、以及MyBatis-Plus的简单运用

什么是MyBatis

MyBatis是一个开源的Java持久层框架,用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离,提供了一种优雅的方式来处理数据库操作。

MyBatis核心思想是将SQL语句与Java方法进行映射,使得开发人员可以通过配置文件或注解来定义和管理SQL语句。这样做的好处是可以将SQL语句与Java代码解耦,降低了代码的维护成本,提高了代码的可读性和可维护性。

使用MyBatis,开发人员可以使用简单的XML配置或注解来描述数据库表和Java对象之间的映射关系,从而实现对象关系映射(ORM)。此外,MyBatis还提供了丰富的功能,如动态SQL、缓存、事务管理等,以满足各种复杂的数据库操作需求。

总的来说,MyBatis是一个轻量级、灵活且功能强大的Java持久层框架,它简化了数据库操作的编写和管理,并提供了丰富的特性和扩展点,使得开发人员可以更加高效地进行数据访问。

什么是MyBatis-Plus

MyBatis-Plus是一个基于MyBatis的轻量级、强大且功能丰富的持久层框架,它进一步简化了与关系型数据库的交互。它是在MyBatis的基础上进行扩展和增强的工具集,提供了更多便捷的开发功能和增强的查询能力。

MyBatis-Plus提供了一系列的增删改查操作的封装方法,使得开发人员可以通过简单的API调用完成常见的数据库操作,无需编写繁琐的SQL语句。它还提供了诸如分页查询、条件构造器、Lambda表达式查询等高级查询功能,极大地简化了复杂查询的编写过程。

除了常见的CRUD操作,MyBatis-Plus还提供了一些额外的功能,如自动生成代码、逻辑删除、乐观锁、多租户支持等,以进一步提升开发效率和代码质量。

总的来说,MyBatis-Plus是一个优秀的持久层框架,它在MyBatis的基础上提供了更多的便利功能和增强能力,使得开发人员可以更加方便、高效地进行数据库操作和查询。它的简洁性、易用性和功能丰富性使得它成为众多Java开发者的首选框架之一。

通过使用 MyBatis-Plus,开发者可以更加快速、高效地进行数据库操作,减少了繁琐的配置和编码工作。

但需要注意的是,MyBatis-Plus 并不是完全取代 MyBatis,而是在其基础上提供了更多的便利功能,因此在具体项目中的选择还需根据实际需求和团队技术偏好来决定。

案例测试MyBatis-Plus

项目创建:

创建SpringBoot项目(使用idea 的Spring Initializr 功能快速搭建一个SpringBoot项目)

 可以在创建SpringBoot选择构建所需依赖:

常见的如:

Spring Boot Lombok :Java 的插件库实现对类的get set tostring 有无参数通过注解来简化代码

MySQL Driver:与 MySQL 数据库进行交互

Spring Web:提供了 Web 应用开发的相关功能

 

pom.xml导包:

当在快速搭建SpringBoot项目时没有或者忘记选择项目依赖时间,我们可以手动在pom.xml导入包。

比如这次的MyBatis-Plus 需要的包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>MyBatis-Plus-11-30</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>MyBatis-Plus-11-30</name><description>MyBatis-Plus-11-30</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><!--mybatis-plus基础功能所需包--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version></dependency><!--代码逆向工程 需要导入2个包 分别是mybatis-plus-generator 和 freemarker --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.2</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.29</version><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.mybatisplus1130.MyBatisPlus1130Application</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

 

配置文件: 

# 应用服务 WEB 访问端口
server.port=8080#实现对数据库的配置操作
spring.datasource.username=root
spring.datasource.password=000000
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/cs
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
##置了 Hibernate 方言 org.hibernate.dialect.MySQL8Dialect,以便与 MySQL 8+ 版本兼容
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

 

#配置mybatis-plus实现
#主要配置是控制台输出日志
#取消自带的驼峰命名,这个不取消会更改你数据库表字段名称比如zgl_cs 他会变更成zglCs
#这个配置指定了 MyBatis Mapper XML 文件的位置。classpath:/mapper/**.xml 表示在 classpath 下的 mapper 目录及其子目录中查找以 .xml 结尾的文件作为 Mapper XML 文件。Mapper XML 文件用于定义 SQL 语句和与之关联的方法。
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: false#  简述就是映射文件位置 resource 是默认位置mapper-locations: classpath:/mapper/**.xml

这来的yml也是配置文件只是这是yml更适合我们看,都是一样的,如果配置文件有相同配置,最后是以.properties为准则

代码部分:

我们这里先简单的介绍MyBatis-Plus功能:

  1. 最简单的是无需编写繁琐的SQL语句实现对数据库的增删改查等操作。

1.1使用MyBatis-Plus的条件构造器(Wrapper)

1.2这个一样可以使用手写sql,且手写sql语句的两种方式。(注解、xml)

2.代码生成器

文件布局:

 

 数据库部分:

代码部分:

创建类对象:bean目录下的Student类

package com.example.mybatisplus1130.bean;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;/*get set toString 有无参数构造  使用的是快速创建SpringBoot时lombok依赖*/
@Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
//声明数据库名称
@TableName("student")
public class Student {@TableId//声明数据库主键private String stu_id;private String stu_name;private String stu_sex;private String stu_age;private String stu_addr;/*如果定义的类和数据库定义的字段名称不一样我们可以使用MyBatis-Plus提供的@TableField注解来解决。*/@TableField(value = "stu_pwd")private String pwd;
}

如果我们创建的数据库属性再带_,但是系统默认会使用驼峰命名,这样你的MyBatis-Plus无sql语句就会报错,原因是系统会把你数据库表字段生成StuId这样的不是stu_id,所以我们可以取消驼峰命名或者数据库我们就按照驼峰命名创建属性。

取消驼峰命:

 Mapper: StudentMapper

package com.example.mybatisplus1130.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus1130.bean.Student;
import org.apache.ibatis.annotations.Select;import java.util.List;//MyBatis-Plus提供了一系列的增删改查操作的封装方法,使得开发人员可以通过简单的API调用完成常见的数据库操作,无需编写繁琐的SQL语句。
//使用:定义一个接口,继承BaseMapper<操作对象> ,   在去启动项 声明@MapperScan(basePackages = "mapper的路径")
public interface StudentMapper extends BaseMapper<Student> {/*要知道我们上面的就已经是一个MyBatis-Plus 其是一个接口继承了BaseMapper 已经具备了实现对Stidnet类的增删改成等继承的语句 *//*sql的写法有两种,一种是直接使用注解写在mapper方法上,一种是写在xml文件中;*///1.注解方式@Select("select * from student where stu_name=#{name}")public List<Student> findAllByStu_name(String name);
/*
【注解的优点】简洁易懂:相比于XML配置,注解的使用更加简洁直观,使代码更具可读性和可维护性。易于调试:注解配置可以直接在Java类中编写,减少了在XML中查找和修改SQL的时间。更好的性能:在执行大量的增删改操作时,注解配置的性能更高,因为没有XML解析的开销。
【注解的缺点】不利于维护:将SQL和Java代码耦合在一起,使得代码难以维护和重构,特别是在涉及到较复杂SQL的情况下。SQL可读性差:相比于在XML中编写SQL,注解中的SQL语句通常会更加冗长和难以读懂。
*///2.xml方式  xml注解默认在resources的mapper目录下public List<Student> findAllByStu_name_ByXml(String name);/*
【XML的优点】易于维护:将SQL分离出Java代码,代码的维护性更高,特别是在需要修改SQL时。SQL可读性好:在XML中编写SQL,可以使得SQL的格式更加清晰,可读性更强。易于管理:XML配置文件可以全局管理,使得项目的结构更加清晰明了。
【XML的缺点】繁琐:XML配置相对于注解,配置较为繁琐,需要更多的代码量。性能问题:在执行大量操作时,XML的解析和读取会占用一定的时间,降低了系统的性能。
* */}

 

 配置文件声明和启动项声明:(我这里选择的是启动项声明)

 

这里解释一下为什么我们需要声明这个(mapper)配置:

在 MyBatis-Plus 中,使用 Mapper 接口来访问数据库。Mapper 接口是一个纯粹的 Java 接口,其中定义了一组数据库操作方法。通过在 Mapper 接口上添加注解和 XML 文件,可以实现对数据库表的增删改查操作。

在 Spring Boot 中,需要将 Mapper 接口注册为 Spring Bean,才能在其他地方进行注入和使用。为了实现自动化的 Mapper 注册,可以使用 MyBatis-Plus 提供的 @MapperScan 注解。@MapperScan 注解用于指定 Mapper 接口所在的包路径,它会自动扫描该包及其子包下的所有 Mapper 接口,并将它们注册为 Spring Bean。在启动项中声明 @MapperScan 注解后,Spring Boot 应用程序会自动扫描 Mapper 接口并将其注册为 Bean,从而使我们可以在其他地方直接注入 Mapper 接口,而无需手动注册 Bean。

因此,在启动项中声明 @MapperScan(basePackages = "mapper文件路径") 是必要的,以确保 Mapper 接口能够被正确地扫描和注册为 Spring Bean,使其能够在整个应用程序中正常使用。

总结:

MyBatis mapper接口定义的对数据库操作的语句都是单纯的java代码接口,定义了操作数据库的方法,我们可以通过MyBatis-Plus定义接口继承BaseMapper或者使用注解或者xml实现对数据库的操作,但是这个前提是要把这个接口通过MyBatis-Plus 提供的 @MapperScan 注解自动扫描 Mapper 接口并将其注册为 Bean,从而使我们可以在其他地方直接注入 Mapper 接口,而无需手动注册 Bean。

在 Spring 框架中,"Bean" 是指由 Spring 容器管理的对象实例。当你将一个类声明为 Bean 后,Spring 容器就会负责实例化、组装和管理这个对象,你可以在应用程序的其他部分通过依赖注入来引用和使用这些 Bean。

 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatisplus1130.mapper.StudentMapper"><select id="findAllByStu_name_ByXml" parameterType="java.lang.String" resultType="com.example.mybatisplus1130.bean.Student">select *from studentwhere stu_name = #{name,jdbcType=VARCHAR}/*,jdbcType=VARCHAR 可写可不写,主要是告诉数据库类型  省去类型检索时间,默认类型转换器需要检索会花费时间 */</select>
</mapper>

Service:

StudnetService主要实习的是对数据库的操作

 

package com.example.mybatisplus1130.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.mybatisplus1130.bean.Student;
import com.example.mybatisplus1130.mapper.StudentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class StudentService {@Autowired(required = false)StudentMapper studentMappere;/*MyBatis-Plus自带的第一特征无需sql语句操作数据库*/public List<Student> findAllStudent(){return studentMappere.selectList(null);}
/*MyBatis-Plus的条件构造器(Wrapper)来构建查询条件*/public  List<Student> findAllStudent_Wrapper(String name,String sex){QueryWrapper<Student> queryWrapper=new QueryWrapper<>();queryWrapper.eq("stu_sex",sex).like("stu_name",name);return studentMappere.selectList(queryWrapper);}/*注解方式写sql语句操作数据库*/public List<Student> findAllByStu_name(String name){return studentMappere.findAllByStu_name(name);}/*xml方式写sql语句操作数据库*/public List<Student> findAllByStu_name_ByXml(String name){return studentMappere.findAllByStu_name_ByXml(name);}}

 DmscService主要实习的是代码生成器的操作

代码生成器:

package com.example.mybatisplus1130.service;import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.springframework.stereotype.Service;import java.sql.Types;
import java.util.Collections;@Service
public class DmscService {/*主要实现的是代码生成器
*   代码生成器是一个用于自动生成Java代码和MyBatis映射文件(XML文件)的工具,
*   可以帮助开发人员快速生成与数据库表对应的实体类、Mapper接口和映射配置。*/public String text(){String url="jdbc:mysql://127.0.0.1:3306/cs";String username="root";String password="000000";/*FastAutoGenerator 需要导入mybatis-plus-generator包*/FastAutoGenerator.create(url, username, password).globalConfig(builder -> {builder.author("zgl") // 设置作者.enableSwagger() // 开启 swagger 模式.fileOverride() // 覆盖已生成文件.outputDir("D://main//java"); // 指定输出目录}).dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {int typeCode = metaInfo.getJdbcType().TYPE_CODE;if (typeCode == Types.SMALLINT) {// 自定义类型转换  将数据库中的SMALLINT类型转换成了Java的INTEGER类型。return DbColumnType.INTEGER;}return typeRegistry.getColumnType(metaInfo);})).packageConfig(builder -> {builder.parent("com.txc.mybatisplus.samples.generator") // 设置父包名    5个文件夹,因为使用了 ..moduleName("system") // 设置父包模块名 这个又是一个文件夹用来存储代码生成的文件.pathInfo(Collections.singletonMap(OutputFile.xml, "D://main//resources")); // 设置mapperXml生成路径}).strategyConfig(builder -> {builder.addInclude("student") // 设置需要生成的表名.addTablePrefix("t_", "c_","stu_"); // 设置过滤表前缀}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板.execute();return "代码生成成功";}}

代码生成器是一个用于自动生成Java代码和MyBatis映射文件(XML文件)的工具,可以帮助开发人员快速生成与数据库表对应的实体类、Mapper接口和映射配置。

在MyBatis-Plus中,代码生成器是MyBatis-Plus工具集的一部分,提供了一套简单易用的代码生成器,使得开发人员可以非常方便地生成基础的数据访问层代码。

使用MyBatis-Plus的代码生成器,您需要先完成以下步骤:

    配置数据库连接信息:在配置文件中指定数据库连接地址、用户名、密码等信息。

    配置生成器参数:通过设置生成器参数,指定需要生成的表、生成文件输出路径、生成文件的命名规则等信息。

    编写模板文件:根据项目需求编写模板文件,定义生成的代码结构和格式。

当您完成以上步骤后,就可以启动代码生成器来生成代码了。代码生成器会读取数据库表的结构信息,根据模板文件和生成器参数,自动生成与数据库表对应的Java类、Mapper接口和XML映射文件。生成的代码包括了基本的CRUD操作,可直接应用到项目中。

代码生成器还提供了其他功能,如:

    自动生成DTO(数据传输对象)、Service接口等文件,以及自定义模板文件。

    自动识别数据库表之间的关联关系,并生成相应的代码。

    自动添加注释和日志等信息,提高代码的可读性和可维护性。

总之,代码生成器是一个能够自动生成基础数据访问层代码、提高开发效率的工具。它可以帮助开发人员减少手动编写代码的工作量,保证代码的一致性和规范性,加快项目开发进度。

代码生成器的优点包括:

   1. 提高开发效率:通过自动化生成基础代码,减少了重复劳动和手动编写代码的时间,使开发人员可以将更多精力投入到业务逻辑的开发上。

    2.保证代码一致性:生成的代码基于统一的模板和配置信息,可以保证生成的代码具有一致的格式和规范,避免了因人为因素导致的代码风格不一致问题。

    3.减少错误率:手动编写代码容易出现疏漏和错误,而代码生成器能够根据表结构自动生成代码,减少了人为错误的可能性。

    4.易于维护和更新:当数据库表结构发生变化时,只需重新运行代码生成器即可更新生成的代码,无需手动修改大量代码。

然而,代码生成器也存在一些缺点,包括:

    学习成本:需要花时间学习和理解代码生成器的配置和模板文件的编写,对于新手来说可能需要一定的学习成本。

    灵活性受限:生成的代码受限于模板文件的定义,可能无法完全满足特定的业务需求,需要额外的手动修改和扩展。

    可维护性:生成的代码可能过于“机械化”,缺乏一定的智能性和灵活性,可能导致生成的代码结构过于僵化,不易维护和扩展。

综上所述,代码生成器在提高开发效率和保证代码质量方面有着明显的优势,但也需要注意学习成本和灵活性受限这些缺点,并在实际项目中权衡利弊,选择合适的使用方式。

 Controller:StudentController

package com.example.mybatisplus1130.controller;import com.example.mybatisplus1130.bean.Student;
import com.example.mybatisplus1130.service.StudentService;
import com.example.mybatisplus1130.service.DmscService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.List;@Controller
public class StudentController {@Autowired(required = false)StudentService studentService;@Autowired(required = false)DmscService dmsc;/*使用的是MyBatisPluse 自带的API封装无需写Sql*/@ResponseBody@RequestMapping("/findAll")public List<Student> findAllStudent(){return studentService.findAllStudent();}/*和上面一样无需写sql的,这个只是多了条件判断及条件构造器(Wrapper)*/@ResponseBody@RequestMapping("/findAll_Wrapper")public List<Student> findAllStudent_Wrapper(){return studentService.findAllStudent_Wrapper("zgl","男");}/*写sql语句    之使用   注解写sql操作数据库*/@ResponseBody@RequestMapping("/findAll-zj")public List<Student> findAllStudent_zj(){return studentService.findAllByStu_name("zgl");}/*写sql语句    之使用   XML写sql操作数据库*/@ResponseBody@RequestMapping("/findAll-zj-by-xml")public List<Student> findAllStudent_zjByXml(){return studentService.findAllByStu_name_ByXml("zgl");}/*代码生成器*//*无需记忆 需要知道有这个功能(代码生成器)  需要知道导入那些包可以实现这个逆向工程*/@ResponseBody@RequestMapping("/nxgc")public String daimashengcheng(){String result = dmsc.text();return result;}/*我们使用DmscService dmsc; 的String result = dmsc.text();替代DmscService service = new DmscService();String result = service.text();在使用 DmscService dmsc 的方式时,需要先通过 Spring 容器将 DmscService 类的实例化对象注入到控制器中,这通常是通过在 DmscService 类上添加 @Service 注解,在控制器类中添加 @Autowired 注解来实现的。* *//*代码生成器是一个用于自动生成Java代码和MyBatis映射文件(XML文件)的工具,可以帮助开发人员快速生成与数据库表对应的实体类、Mapper接口和映射配置。在MyBatis-Plus中,代码生成器是MyBatis-Plus工具集的一部分,提供了一套简单易用的代码生成器,使得开发人员可以非常方便地生成基础的数据访问层代码。使用MyBatis-Plus的代码生成器,您需要先完成以下步骤:配置数据库连接信息:在配置文件中指定数据库连接地址、用户名、密码等信息。配置生成器参数:通过设置生成器参数,指定需要生成的表、生成文件输出路径、生成文件的命名规则等信息。编写模板文件:根据项目需求编写模板文件,定义生成的代码结构和格式。当您完成以上步骤后,就可以启动代码生成器来生成代码了。代码生成器会读取数据库表的结构信息,根据模板文件和生成器参数,自动生成与数据库表对应的Java类、Mapper接口和XML映射文件。生成的代码包括了基本的CRUD操作,可直接应用到项目中。代码生成器还提供了其他功能,如:自动生成DTO(数据传输对象)、Service接口等文件,以及自定义模板文件。自动识别数据库表之间的关联关系,并生成相应的代码。自动添加注释和日志等信息,提高代码的可读性和可维护性。总之,代码生成器是一个能够自动生成基础数据访问层代码、提高开发效率的工具。它可以帮助开发人员减少手动编写代码的工作量,保证代码的一致性和规范性,加快项目开发进度。代码生成器的优点包括:提高开发效率:通过自动化生成基础代码,减少了重复劳动和手动编写代码的时间,使开发人员可以将更多精力投入到业务逻辑的开发上。保证代码一致性:生成的代码基于统一的模板和配置信息,可以保证生成的代码具有一致的格式和规范,避免了因人为因素导致的代码风格不一致问题。减少错误率:手动编写代码容易出现疏漏和错误,而代码生成器能够根据表结构自动生成代码,减少了人为错误的可能性。易于维护和更新:当数据库表结构发生变化时,只需重新运行代码生成器即可更新生成的代码,无需手动修改大量代码。然而,代码生成器也存在一些缺点,包括:学习成本:需要花时间学习和理解代码生成器的配置和模板文件的编写,对于新手来说可能需要一定的学习成本。灵活性受限:生成的代码受限于模板文件的定义,可能无法完全满足特定的业务需求,需要额外的手动修改和扩展。可维护性:生成的代码可能过于“机械化”,缺乏一定的智能性和灵活性,可能导致生成的代码结构过于僵化,不易维护和扩展。综上所述,代码生成器在提高开发效率和保证代码质量方面有着明显的优势,但也需要注意学习成本和灵活性受限这些缺点,并在实际项目中权衡利弊,选择合适的使用方式。*/}

点击:

 

运行就可以了

测试:

 

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

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

相关文章

集成开发环境PyCharm的使用【侯小啾python领航计划系列(三)】

集成开发环境 PyCharm 的使用【侯小啾python领航计划系列(三)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff08;即统一提交信息&#xff09;&#xff0c;需要使用pre…

Python | 轻量ORM框架Peewee的基础使用(增删改查、自动创建模型类、事务装饰器)

文章目录 01 简介02 安装03 自动创建模型类04 基础使用4.1 查询4.2 新增4.3 更新4.4 删除 05 事务 01 简介 在使用python开发的过程中&#xff0c;有时需要一些简单的数据库操作&#xff0c;而Peewee正是理想的选择&#xff0c;它是一个小巧而灵活的 Python ORM&#xff08;对…

hadoop-3.3.5安装过程

准备资源三台虚拟机&#xff1a; 1&#xff09;准备3台服务器&#xff08;关闭防火墙、静态IP、主机名称&#xff09; 2&#xff09;安装JDK 3&#xff09;配置环境变量 4&#xff09;安装Hadoop 5&#xff09;配置环境变量 安装虚拟机&#xff08;略&#xff09;--1台即…

如何删除mac苹果电脑上面的流氓软件?

在使用苹果电脑的过程中&#xff0c;有时候我们也会遇到一些不需要的软件。无论是因为不再需要&#xff0c;或者是为了释放磁盘空间&#xff0c;删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件&#xff01; CleanMyMac X全新版下载如下: https://wm.make…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求&#xff1a; 默认一行展示4个卡片&#xff1b;当屏幕小于某个大小的时候&#xff0c;一行展示3个卡片&#xff1b;再小就展示2个&#xff1b;以此类推&#xff0c;最小就展示1个。 效果卡片样式如下图&#xff1a; 默认一行4个 屏幕缩小到某个阈值&#xff0c;一行展示…

Linux:vim的简单使用

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、vim的基本概念二、vim的基本操作三、vim正常模式命令集四、vim底行模式命令集五、.xxx.swp的解决总结 前言 本文是对Linux中vim使用的总结 一、vim的基本概念 …

iOS Class Guard 成功了,但无法区分差异

iOS Class Guard 成功了&#xff0c;但无法区分差异 我正在开发一个静态库&#xff0c;并使用 Polidea 的 iOS Class Guard 来混淆我的静态库。我按照步骤在项目的根路径中下载 obfuscate_project&#xff0c;更改其中所需的名称&#xff0c;最后在终端中运行 bash obfuscate_p…

算法通关村第六关—二叉树的层次遍历经典问题(白银)

二叉树的层次遍历经典问题 一、层次遍历简介 广度优先遍历又称层次遍历&#xff0c;过程如下&#xff1a;  层次遍历就是从根节点开始&#xff0c;先访问根节点下面一层全部元素&#xff0c;再访问之后的层次&#xff0c;图里就是从左到右一层一层的去遍历二叉树&#xff0c…

学习笔记8——JUC入门基础知识

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/199561.html 进程和线程:进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位 进程和线程的主要区别&#xff08;总结&#xff09;_进程和线程的区别-CSDN博客进程…

Flink的部署模式和运行模式

集群角色 Flink提交作业和执行任务&#xff0c;需要几个关键组件&#xff1a; 客户端&#xff1a;代码由客户端获取并作转换&#xff0c;之后提交给Jobmanager Jobmanager就是Flink集群的管事人&#xff0c;对作业进行中央调度管理&#xff1b;当从客户端获取到转换过的作业后…

NRF24L01 无线收发模块与 Arduino 的应用

NRF24L01 是一款常用的无线收发模块&#xff0c;与 Arduino 兼容性良好&#xff0c;可以用于实现无线通信和数据传输。本文将介绍如何将 NRF24L01 模块与 Arduino 配合使用&#xff0c;包括硬件的连接和配置&#xff0c;以及相应的代码示例。 一、引言 NRF24L01 是一款基于 2.…

CentOS或RHEL安装vscode

下载rpm安装包 网络下载或者下载到本地再上传到服务器&#xff0c;点击访问国内下载地址&#xff0c;不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…

STM32F407-14.3.9-01输出比较模式

输出比较模式 此功能用于控制输出波形&#xff0c;或指示已经过某一时间段。 当捕获/比较寄存器与计数器之间相匹配时&#xff0c;输出比较功能&#xff1a; ● 将为相应的输出引脚分配一个可编程值&#xff0c;该值由输出比较模式&#xff08;TIMx_CCMRx 寄存器中的 OCxM⑦…

Python批量Git Pull,对文件夹批量进行Pull操作

效果展示 说明 本来是想写的完善一些&#xff0c;但由于是自用&#xff0c;所以写出来后发现已经解决了自己的问题&#xff0c;所有 2和3功能没有写。 执行的话&#xff0c;需要 cmd 之后 直接 Python BatchGitPull.py 运行下面代码即可。 里面同时涉及到其他Pyhon知识点(写给…

Ubuntu18.04 Udacity project_9_PID_control 如何运行

工程源码和仿真器下载&#xff1a; 源码 仿真器 --- Ubuntu就下载 term2_sim_linux.zip 这个压缩文件即可 紧接着给方框中的文件赋可执行权限 打开project_9_PID_control文件夹 执行如下脚本&#xff0c;安装必要的库&#xff0c;比如websocket&#xff08;程序生成的可执行…

springboot+vue志愿者在线报名服务管理系统java毕业设计源码+数据库

vuespringboot志愿服务管理系统 本项目是springbootvueElementuimysql源码 开发工具&#xff0c;idea和eclipse都可以,MySQL 源码下载地址 https://download.csdn.net/download/yibo2022/88401958?spm1003.2166.3001.6637.3https://download.csdn.net/download/yibo2022/884…

凯捷对汽车数字化的思考

标题凯捷&#xff08;中国&#xff09;对汽车行业数字化转型的探索 凯捷中国数字化研发团队有超过1200名专业顾问致力于数字化相关项目&#xff0c;分布在北京、天津、沈阳、呼和浩特、上海、昆山、杭州、广州、深圳等地&#xff0c;运用Rightshore交付模式和通过专业顾问为客…

Python 重要数据类型

目录 列表 序列操作 列表内置方法 列表推到式 字典 声明字典 字典基本操作 列表内置方法 字典进阶使用 字典生成式 附录 列表 在实际开发中&#xff0c;经常需要将一组&#xff08;不只一个&#xff09;数据存储起来&#xff0c;以便后边的代码使用。列表就是这样的…

流媒体方案之FFmepeg——实现物联网视频监控项目

目录 前言 一、FFmpeg介绍 二、FFmpeg简易理解 三、FFmpeg的重要概念 四、软硬件准备 五、移植、运行FFmpeg 六、运行FFmpeg 前言 最近想做一个安防相关的项目&#xff0c;所以跟着韦东山老师的视频来学习视频监控方案的相关知识&#xff0c;韦东山老师讲的课非常好&…