当前位置: 首页 > article >正文

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比 🚀

  • 前言
  • 一、基础介绍 ✨
    • 1. Mybatis 简介 🔍
    • 2. Mybatis-Plus 简介 ⚡
  • 二、核心区别与高级特性对比 🔎
    • 1. 开发模式与配置管理
    • 2. 功能丰富度与扩展性
    • 3. 自动填充与逻辑删除
    • 4. 性能监控与安全防护
  • 三、实战案例:构建用户管理系统与进阶功能演示 📚
    • 1. 案例一:基于 Mybatis 的用户管理系统
    • 2. 案例二:基于 Mybatis-Plus 的用户管理系统与进阶功能
  • 四、综合对比与实践中的注意事项 🎯
    • 1. 选择依据
    • 2. 开发实践建议
  • 五、总结 🌟


前言

在 Java 后端开发中,数据持久层始终是关键模块。如何既保证 SQL 调优的灵活性,又能提高开发效率,是众多开发者关注的焦点。本文将从基础介绍开始,全面解析 MybatisMybatis-Plus 的各个方面,包括工作原理、常见使用场景、详细实例、进阶特性、插件支持以及最佳实践,帮助你在项目中做出更明智的选择。让我们一起开始这段干货满满的技术之旅吧!💡

在这里插入图片描述


一、基础介绍 ✨

1. Mybatis 简介 🔍

Mybatis 是一款轻量级的 ORM 框架,它主要通过 XML 或注解方式将 SQL 语句与 Java 对象进行映射,具备以下特点:

  • 高度灵活

    开发者可以自定义 SQL,实现复杂查询及数据库操作。

  • 精细控制

    通过 XML 映射文件管理 SQL 与实体类之间的关系,充分掌控底层细节。

  • 低侵入性

    只关注数据库交互部分,业务逻辑完全由开发者掌控。

工作原理

  1. 映射配置:在 XML 文件或注解中定义 SQL 语句与参数映射。

  2. SqlSession 管理:通过 SqlSession 获取 Mapper 接口,完成数据库 CRUD 操作。

  3. 动态 SQL:支持动态 SQL 构建,便于处理复杂查询条件。

示例:Mybatis XML 配置

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" resultType="com.example.entity.User">SELECT id, name, age FROM user WHERE id = #{id}</select>
</mapper>

虽然这种方式灵活、透明,但当项目中涉及大量 SQL 时,XML 文件的编写和维护会变得相对繁琐。😓

2. Mybatis-Plus 简介 ⚡

Mybatis-Plus 是在 Mybatis 基础上的增强工具包,旨在极大地简化开发流程,提高生产力。其主要特点包括:

  • 自动 CRUD

    内置 BaseMapper 接口,封装常用增删改查操作,省去重复编写 SQL。

  • 代码生成器

    通过代码生成快速构建实体类、Mapper 接口和 XML 映射文件。

  • 条件构造器

    提供链式调用方式构建查询条件(包括 Lambda 表达式方式),书写清晰直观。

  • 内置插件

    包括分页插件、性能分析插件、乐观锁、逻辑删除等常用功能。

  • 自动填充字段

    支持创建时间、修改时间等字段的自动填充,简化开发流程。

工作原理

  1. 自动封装:根据实体类和注解生成常用 SQL 语句,无需重复编写。

  2. 插件机制:通过插件扩展查询、更新、分页等功能,适应不同场景需求。

  3. 灵活扩展:支持自定义 SQL 和扩展方法,既满足快速开发又不失定制化能力。

示例:Mybatis-Plus 实体类与 Mapper 接口

// User.java
@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;
}// UserMapper.java
public interface UserMapper extends BaseMapper<User> {// 自定义方法示例:通过名字模糊查询用户List<User> selectByName(@Param("name") String name);
}

在 Spring Boot 项目中,只需简单配置数据源和包扫描即可快速启动应用。😊

二、核心区别与高级特性对比 🔎

1. 开发模式与配置管理

  • Mybatis

    • 配置方式:依赖 XML 或注解完成映射,代码与 SQL 分离,灵活但冗长。😅

    • 维护难度:每个实体或查询都需要单独配置,项目规模扩大时维护成本较高。

  • Mybatis-Plus

    • 约定优于配置:自动生成常用 SQL,极大减少了 XML 文件数量。💡

    • 自动化支持:内置自动 CRUD、分页和插件机制,使得配置更简洁、开发更高效。🚀

2. 功能丰富度与扩展性

  • Mybatis

    • 功能聚焦于 SQL 映射与执行,灵活定制性强,适合对 SQL 有极高要求的场景。

    • 支持动态 SQL,复杂业务逻辑处理能力突出。🔥

  • Mybatis-Plus

    • 自动 CRUD:BaseMapper 内置方法(如 selectByIdinsert 等)极大降低代码重复率。

    • 条件构造器:提供 QueryWrapperLambdaQueryWrapper,使用链式调用构建查询条件更加直观。

    • 插件体系:分页插件、乐观锁插件、性能分析插件等一应俱全,支持日志打印 SQL 执行时间,便于性能调优。😊

    示例:使用 Lambda 查询构造器

    // 查询名字中包含 "张" 的用户,年龄大于 20
    List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, "张").gt(User::getAge, 20)
    );
    

3. 自动填充与逻辑删除

  • Mybatis-Plus 自动填充

    • 支持在插入或更新数据时自动填充常用字段(如 createTimeupdateTime)。

    • 通过自定义 MetaObjectHandler 实现字段自动更新,降低出错概率。

    示例:自动填充配置

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));this.strictInsertFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));// 强行更新updateTime// this.setFieldValByName("updateTime", new Timestamp(System.currentTimeMillis()), metaObject);}
    }
    
  • 逻辑删除

    • Mybatis-Plus 支持通过配置实现逻辑删除,数据不会真正从数据库删除,只是状态标记为已删除,更便于数据恢复和审计。

    • 只需在实体类上使用 @TableLogic 注解即可。

    示例:逻辑删除字段配置

    @Data
    @TableName("user")
    public class User {private Long id;private String name;private Integer age;@TableLogicprivate Integer deleted;
    }
    

4. 性能监控与安全防护

  • 性能分析插件

    • Mybatis-Plus 内置性能分析插件可帮助开发者在开发环境下检测 SQL 执行效率,提前发现慢查询问题。

    • 插件能够打印 SQL 语句及其执行时间,便于调优。😊

  • SQL 注入防护

    • 虽然 Mybatis 本身不会对 SQL 注入提供自动防护,但 Mybatis-Plus 在使用条件构造器时,通过参数化查询一定程度上降低了 SQL 注入风险。👍

三、实战案例:构建用户管理系统与进阶功能演示 📚

下面将通过两个案例,分别展示使用 Mybatis 与 Mybatis-Plus 实现用户管理系统的基本功能和进阶特性。

1. 案例一:基于 Mybatis 的用户管理系统

  • 环境配置与依赖

    • 依赖引入:在 Maven 中添加 Mybatis、Spring Boot、数据库驱动等依赖。

    • 配置文件:在 application.yml 中配置数据源和 Mybatis 映射文件路径。

    spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456
    mybatis:mapper-locations: classpath*:mapper/*.xml
    
  • Mapper XML 文件

    <!-- UserMapper.xml -->
    <mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" resultType="com.example.entity.User">SELECT id, name, age FROM user WHERE id = #{id}</select><insert id="insertUser" parameterType="com.example.entity.User">INSERT INTO user(name, age) VALUES(#{name}, #{age})</insert><update id="updateUser" parameterType="com.example.entity.User">UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}</update><delete id="deleteUser" parameterType="Long">DELETE FROM user WHERE id = #{id}</delete>
    </mapper>
    
  • Service 与 Controller 层代码

    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.getUserById(id);}public void createUser(User user) {userMapper.insertUser(user);}public void updateUser(User user) {userMapper.updateUser(user);}public void deleteUser(Long id) {userMapper.deleteUser(id);}
    }@RestController
    @RequestMapping("/user")
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.getUserById(id);}@PostMapping("/")public String createUser(@RequestBody User user) {userService.createUser(user);return "创建成功!";}
    }
    

该案例展示了 Mybatis 灵活的映射机制,但随着业务复杂度增加,XML 文件和手动配置也会逐步增多。😓

2. 案例二:基于 Mybatis-Plus 的用户管理系统与进阶功能

  • 环境配置与依赖

    • 依赖引入:在 Maven 中添加 Mybatis-Plus Starter 及 Spring Boot 依赖。

    • 配置文件:基本与 Mybatis 类似,但无需编写大量 XML 文件。

    spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456
    mybatis-plus:mapper-locations: classpath*:mapper/*.xml
    
  • 实体类、Mapper 与自动填充

    // User.java@Data@TableName("user")public class User {private Long id;private String name;private Integer age;@TableLogicprivate Integer deleted;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;}// MyMetaObjectHandler.java@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));this.strictInsertFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", Timestamp.class, new Timestamp(System.currentTimeMillis()));// 强行更新updateTime// this.setFieldValByName("updateTime", new Timestamp(System.currentTimeMillis()), metaObject);}
    
  • Service 层与高级查询示例

    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Long id) {return userMapper.selectById(id);}public void createUser(User user) {userMapper.insert(user);}public void updateUser(User user) {userMapper.updateById(user);}public void deleteUser(Long id) {userMapper.deleteById(id);}// 进阶示例:使用 LambdaQueryWrapper 进行条件查询public List<User> getUsersByNameAndAge(String name, int age) {return userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, name).ge(User::getAge, age));}
    }
    
  • Controller 层代码

    @RestController
    @RequestMapping("/user")
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.getUserById(id);}@PostMapping("/")public String createUser(@RequestBody User user) {userService.createUser(user);return "创建成功!";}@GetMapping("/search")public List<User> searchUsers(@RequestParam String name, @RequestParam int age) {return userService.getUsersByNameAndAge(name, age);}
    }
    

Mybatis-Plus 的优势在于减少重复代码、支持自动填充、逻辑删除以及内置的高级查询功能,既满足简单 CRUD,又能应对复杂查询场景。👍

四、综合对比与实践中的注意事项 🎯

1. 选择依据

  • 项目规模与复杂度

    • 对于简单或中小型项目,Mybatis-Plus 以其简洁高效的开发体验无疑更适合。

    • 大型或对 SQL 细节要求极高的系统,则可考虑 Mybatis,或结合使用二者,发挥各自优势。

  • 团队技术水平

    • 初学者更容易上手 Mybatis-Plus;

    • 资深开发者可根据实际需求灵活选择并扩展自定义功能。

2. 开发实践建议

  • 文档与社区

    • 阅读 Mybatis 和 Mybatis-Plus 的官方文档,关注最新插件和最佳实践;

    • 利用开源社区、博客(如 CSDN、掘金)中的经验分享,获取实际问题的解决方案。

  • 性能调优

    • 利用 Mybatis-Plus 的性能分析插件及时发现慢查询;

    • 在 Mybatis 中,合理使用动态 SQL 和缓存机制,优化数据库访问效率。

  • 安全性

    • 注意 SQL 注入问题,优先使用条件构造器和参数化查询;

    • 对于业务敏感数据,配置合理的事务管理和日志审计。


五、总结 🌟

通过本文的详细解析与丰富实例,了解到:

  • Mybatis 以其极高的灵活性和定制能力适合复杂业务场景,但配置与维护成本较高。

  • Mybatis-Plus 则在 Mybatis 基础上进行了功能扩展和自动化封装,极大提高了开发效率,适合快速开发中小型项目,同时也支持高级查询、自动填充和逻辑删除等特性。

未来,随着业务场景的不断丰富和技术的持续演进,选择合适的持久层框架将更注重团队开发效率和系统可维护性。

无论是坚持 Mybatis 的精细调优,还是选择 Mybatis-Plus 的自动化便利,深入理解底层原理和不断优化实践都是取得成功的关键!😊

相关文章:

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比

全面解析 Mybatis 与 Mybatis-Plus&#xff1a;深入原理、实践案例与高级特性对比 &#x1f680; 前言一、基础介绍 ✨1. Mybatis 简介 &#x1f50d;2. Mybatis-Plus 简介 ⚡ 二、核心区别与高级特性对比 &#x1f50e;1. 开发模式与配置管理2. 功能丰富度与扩展性3. 自动填充…...

Ubuntu 22.04 一键部署openManus

openManus 前言 OpenManus-RL,这是一个专注于基于强化学习(RL,例如 GRPO)的方法来优化大语言模型(LLM)智能体的开源项目,由来自UIUC 和 OpenManus 的研究人员合作开发。 前提要求 安装deepseek docker方式安装 ,windows 方式安装,Linux安装方式...

lib-zo,C语言另一个协程库,dns协程化, gethostbyname

lib-zo,C语言另一个协程库,dns协程化, gethostbyname 另一个 C 协程库 https://blog.csdn.net/eli960/article/details/146802313 本协程库 支持 DNS查询 协程化. 禁用所有 UDP 协程化 zvar_coroutine_disable_udp 1;禁用 53 端口的UDP 协程化 zvar_coroutine_disable_ud…...

强化学习_Paper_1988_Learning to predict by the methods of temporal differences

paper Link: sci-hub: Learning to predict by the methods of temporal differences 1. 摘要 论文介绍了时间差分方法&#xff08;TD 方法&#xff09;&#xff0c;这是一种用于预测问题的增量学习方法。TD 方法通过比较连续时间步的预测值之间的差异来调整模型&#xff0c;…...

虚拟电商-话费充值业务(六)话费充值业务回调补偿

一、话费充值回调业务补偿 业务需求&#xff1a;供应商对接下单成功后充吧系统将订单状态更改为&#xff1a;等待确认中&#xff0c;此时等待供应商系统进行回调&#xff0c;当供应商系统回调时说明供应商充值成功&#xff0c;供应商回调充吧系统将充吧的订单改为充值成功&…...

Apache httpclient okhttp

学习链接 okhttp github okhttp官方使用文档 SpringBoot 整合okHttp okhttp3用法 Java中常用的HTTP客户端库&#xff1a;OkHttp和HttpClient&#xff08;包含请求示例代码&#xff09; 深入浅出 OkHttp 源码解析及应用实践 httpcomponents-client github apache httpclie…...

SQL Server 2022 读写分离问题整合

跟着热点整理一下遇到过的SQL Server的问题&#xff0c;这篇来聊聊读写分离遇到的和听说过的问题。 一、读写分离实现方法 1. 原生高可用方案 1.1 Always On 可用性组&#xff08;推荐方案&#xff09; 配置步骤&#xff1a; -- 1. 启用Always On功能 USE [master] GO ALT…...

Docker部署Blinko:打造你的个性化AI笔记助手与随时随地访问

文章目录 前言1. Docker Compose一键安装2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 嘿&#xff0c;小伙伴们&#xff0c;是不是觉得市面上那些单调乏味的笔记应用让人提不起劲&#xff1f;今天&#xff0c;我要给大家安利一个超炫酷的开源…...

Python Cookbook-5.2 不区分大小写对字符串列表排序

任务 你想对一个字符串列表排序&#xff0c;并忽略掉大小写信息。举个例子&#xff0c;你想要小写的a排在大写的 B 前面。默认的情况下&#xff0c;字符串比较是大小写敏感的(比如所有的大写字符排在小写字符之前)。 解决方案 采用 decorate-sort-undecorate(DSU)用法既快又…...

安全业务的manus时代即将到来

“(人)把业务流程任务化,把任务工具化,再把工具服务化,剩下的交给智能体。” 一、自动化与智能化浪潮下的安全业务变革 近期,笔者着迷于模型上下文协议(Model Context Protocol,简称MCP),这项技术所带来的变革性力量令人惊叹。在对多个技术案例进行实践的过程中,笔者…...

程序化广告行业(55/89):DMP与DSP对接及数据统计原理剖析

程序化广告行业&#xff08;55/89&#xff09;&#xff1a;DMP与DSP对接及数据统计原理剖析 大家好呀&#xff01;在数字化营销的大趋势下&#xff0c;程序化广告已经成为众多企业实现精准营销的关键手段。上一篇博客我们一起学习了程序化广告中的人群标签和Look Alike原理等知…...

【文献研究】铝对热冲压加热过程中锌氧化的影响

在热冲压过程中&#xff0c;镀锌铁板和镀锌板等镀锌钢板表面发生Zn氧化。为了阐明镀锌层中的Al对Zn氧化的影响&#xff0c;本研究研究了镀锌钢板上添加和不添加Al时形成的ZnO量。发现添加铝后ZnO量减少。对添加铝的镀锌钢板的显微组织分析表明&#xff0c;添加的Al在热冲压后Zn…...

Win11本地从零开始部署dify全流程

1.安装wsl和打开Hyper-V功能&#xff08;前置准备&#xff09; 这个是为了支持我们的Docker Desktop运行。 1.1.安装wsl 使用管理员身份运行命令行。 如果显示 “无法与服务器建立连接就执行“&#xff0c;表示没有安装wsl&#xff0c;如果更新成功&#xff0c;那就不用执行…...

从代码学习深度学习 - RNN PyTorch版

文章目录 前言一、数据预处理二、辅助训练工具函数三、绘图工具函数四、模型定义五、模型训练与预测六、实例化模型并训练训练结果可视化总结前言 循环神经网络(RNN)是深度学习中处理序列数据的重要模型,尤其在自然语言处理和时间序列分析中有着广泛应用。本篇博客将通过一…...

【HTB】Windwos-easy-Legacy靶机渗透

靶机介绍&#xff0c;一台很简单的WIndows靶机入门 知识点 msfconsole利用 SMB历史漏洞利用 WIndows命令使用&#xff0c;type查看命令 目录标题 一、信息收集二、边界突破三、权限提升 一、信息收集 靶机ip&#xff1a;10.10.10.4攻击机ip&#xff1a;10.10.16.26 扫描TC…...

蓝桥杯真题———k倍区间

题目如下 代码如下 记录余数 cnt[0] 1 的初始化是为了处理 空前缀和 说明...

LeetCode 891 -- 贡献度思想

题目描述 子序列宽度之和 思路 ref 代码 相似题 子数组范围和 acwing...

无人机等非合作目标公开数据集2025.4.3

一.无人机遥感数据概述 1.1 定义与特点 在遥感技术的不断发展中&#xff0c;无人机遥感数据作为一种新兴的数据源&#xff0c;正逐渐崭露头角。它是通过无人驾驶飞行器&#xff08;UAV&#xff09;搭载各种传感器获取的地理空间信息&#xff0c;具有 覆盖范围大、综合精度高、…...

机器视觉--python基础语法

Python基础语法 1. Python标识符 在 Python 里&#xff0c;标识符由字母、数字、下划线组成。 在 Python 中&#xff0c;所有标识符可以包括英文、数字以及下划线(_)&#xff0c;但不能以数字开头。 Python 中的标识符是区分大小写的。 以下划线开头的标识符是有特殊意义的…...

司南评测集社区 3 月上新一览!

司南评测集社区 CompassHub 作为司南评测体系的重要组成部分&#xff0c;旨在打创新性的基准测试资源导航社区&#xff0c;提供丰富、及时、专业的评测集信息&#xff0c;帮助研究人员和行业人士快速搜索和使用评测集。 2025 年 3 月&#xff0c;司南评测集社区新收录了一批评…...

TrollStore(巨魔商店)介绍及操作手册

TrollStore&#xff08;巨魔商店&#xff09;介绍及操作手册 一、TrollStore 简介 TrollStore 是一款针对 iOS 设备开发的第三方应用安装工具&#xff0c;它允许用户在不越狱设备的情况下&#xff0c;安装和使用未经过苹果官方 App Store 审核的应用程序。该工具利用了 iOS 系…...

SSE与Streamable HTTP的区别:协议与技术实现的深度对比

引言 在现代Web开发中&#xff0c;实时数据传输是许多应用的核心需求&#xff0c;从聊天应用到股票市场更新&#xff0c;从游戏服务器到AI模型通信。为了满足这一需求&#xff0c;各种技术应运而生&#xff0c;其中Server-Sent Events (SSE)和Streamable HTTP是两种重要的实时…...

android 之简述屏幕分辨率、屏幕密度、屏幕最小宽度

一、屏幕分辨率 屏幕分辨率是指屏幕显示的像素数量&#xff0c;通常以水平像素数乘以垂直像素数表示&#xff0c;例如 1920x1080。它直接影响屏幕的显示效果&#xff0c;包括图像的清晰度和细节。不同的设备可能有不同的屏幕分辨率。 1、常见的屏幕分辨率 标准分辨率&#x…...

mac环境中Nginx安装使用 反向代理

安装 如没有Homebrew 先安装Homebrew 国内镜像&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 安装成功后安装nginx&#xff1a; brew install nginx 启动nginx&#xff1a; nginx 或者 brew services st…...

2025年3月个人工作生活总结

本文为 2025年3月工作生活总结。 研发编码 一个curl下载失败问题的记录 问题&#xff1a; 某程序&#xff0c;指定IP和账户密码配置&#xff0c;再使用curl库连接sftp服务器&#xff0c;下载文件。在CentOS系统正常&#xff0c;但在某国产操作系统中失败&#xff0c;需要用命…...

实战打靶集锦-36-Deception

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 系统提权6. 写在最后 靶机地址&#xff1a;https://download.vulnhub.com/haclabs/Deception.ova 1. 主机发现 目前只知道目标靶机在192.168.56.xx网段&#xff0c;通过如下的命令&#xff0c;看看这个网段上在线的主…...

前端开发技术演进与就业现实:顺应时代方能不被淘汰-优雅草卓伊凡

前端开发技术演进与就业现实&#xff1a;顺应时代方能不被淘汰-优雅草卓伊凡 在技术浪潮汹涌的当下&#xff0c;常有人发问&#xff1a;“学习CSS、HTML、JS以后可以干什么&#xff1f;”对此&#xff0c;卓伊凡可以明确地给出答案&#xff1a;单纯学习这些过于基础的Web前端开…...

敏捷开发:以人为本的高效开发模式

目录 前言1. 什么是敏捷开发&#xff1f;1.1 敏捷开发的核心理念1.2 敏捷开发的优势 2. 敏捷宣言&#xff1a;四大核心价值观2.1 个体和交互胜过工具和过程2.2 可工作的软件胜过大量的文档2.3 客户合作胜过合同谈判2.4 响应变化胜过遵循计划 3. 敏捷开发的实践3.1 Scrum&#x…...

HarmonyOS 基础组件和基础布局的介绍

1. HarmonyOS 基础组件 1.1 Text 文本组件 Text(this.message)//文本内容.width(200).height(50).margin({ top: 20, left: 20 }).fontSize(30)//字体大小.maxLines(1)// 最大行数.textOverflow({ overflow: TextOverflow.Ellipsis })// 超出显示....fontColor(Color.Black).…...

CAD插入属性块 弹窗提示输入属性值——CAD知识讲堂

插入属性块时&#xff0c;有时会遇到不弹窗输入属性值的情况&#xff0c;解决方案如下&#xff1a; 最好关闭块编辑器并保存&#xff0c;插入属性块即可弹窗。...