MyBatis-Plus的基本CRUD
一、BaseMapperMyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现我们可以直接使用接口如下public interface BaseMapperT extends MapperT { int insert(T entity); int deleteById(Serializable id); int deleteById(T entity); int deleteByMap(Param(cm) MapString, Object columnMap); int delete(Param(ew) WrapperT queryWrapper); int deleteBatchIds(Param(coll) Collection? idList); int updateById(Param(et) T entity); int update(Param(et) T entity, Param(ew) WrapperT updateWrapper); T selectById(Serializable id); ListT selectBatchIds(Param(coll) Collection? extends Serializable idList); ListT selectByMap(Param(cm) MapString, Object columnMap); default T selectOne(Param(ew) WrapperT queryWrapper) { ListT ts this.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(ts)) { if (ts.size() ! 1) { throw ExceptionUtils.mpe(One record is expected, but the query result is multiple records, new Object[0]); } else { return ts.get(0); } } else { return null; } } default boolean exists(WrapperT queryWrapper) { Long count this.selectCount(queryWrapper); return null ! count count 0L; } Long selectCount(Param(ew) WrapperT queryWrapper); ListT selectList(Param(ew) WrapperT queryWrapper); ListMapString, Object selectMaps(Param(ew) WrapperT queryWrapper); ListObject selectObjs(Param(ew) WrapperT queryWrapper); P extends IPageT P selectPage(P page, Param(ew) WrapperT queryWrapper); P extends IPageMapString, Object P selectMapsPage(P page, Param(ew) WrapperT queryWrapper); }1. 插入注意MyBatis-Plus在实现插入数据时会默认基于雪花算法的策略生成id/** * 用户插入功能的方法。 * 该方法创建一个User对象并将其插入数据库验证插入操作是否成功 * 并输出受影响的行数以及自动生成的用户ID。 */ Test public void testInsert(){ // 创建一个新的User对象ID为null表示由数据库自动生成 User user new User(null, 张三, 23, zhangsanqcby.com,null,null); // 执行插入操作将用户数据保存到数据库中 //INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? ) int result userMapper.insert(user); // 输出插入操作影响的行数正常情况下应为1 System.out.println(受影响行数result); // 输出数据库自动生成的用户ID,MyBatis-Plus在实现插入数据时会默认基于雪花算法的策略生成id //2020478658078167042 System.out.println(id自动获取user.getId()); }2. 删除/** * 通过ID删除用户信息的功能。 * 该方法调用userMapper的deleteById方法传入指定的用户ID进行删除操作 * 并输出受影响的行数以验证删除结果。 */ Test public void testDeleteById(){ //通过id删除用户信息 //DELETE FROM user WHERE id? int result userMapper.deleteById(2020488576042545170L); System.out.println(受影响行数result); } Test public void testDeleteBatchIds(){ //通过多个id批量删除 //DELETE FROM user WHERE id IN ( ? , ? ) ListLong idList Arrays.asList(1L, 3L); int result userMapper.deleteBatchIds(idList); System.out.println(受影响行数result); } /** * 通过Map条件删除用户记录的功能。 * 该方法构造一个包含删除条件的Map对象并调用userMapper的deleteByMap方法执行删除操作 * 最后输出受影响的行数。 * param map 包含删除条件的键值对集合其中key为字段名value为对应的条件值。。 * return 受影响的行数表示成功删除的记录数量。 */ Test public void testDeleteByMap(){ //根据map集合中所设置的条件删除记录 // 构造删除条件的Map集合 //DELETE FROM user WHERE name ? AND age ? MapString, Object map new HashMap(); map.put(age, 23); map.put(name, 张三); int result userMapper.deleteByMap(map); System.out.println(受影响行数result); }3. 修改/** * 通过ID更新用户信息的功能。 * 该方法创建一个User对象并调用userMapper的updateById方法来更新数据库中的对应记录。 * 最后输出受影响的行数。 */ Test public void testUpdateById(){ //创建User对象并设置要修改的属性,null不传参 User user new User(4L, test, null, null, null, null); //UPDATE user SET name?, age? WHERE id? int result userMapper.updateById(user); System.out.println(受影响行数result); }4. 查询/** * 通过ID查询用户信息的功能。 * 该方法调用userMapper的selectById方法传入指定的用户ID进行查询 * 并将查询结果打印到控制台。 */ Test public void testSelectById(){ //根据id查询用户信息 //SELECT id,name,age,email FROM user WHERE id? User user userMapper.selectById(4L); System.out.println(user); } /** * 通过多个ID批量查询用户信息的功能。 * 该方法调用userMapper的selectBatchIds方法传入指定的用户ID列表进行批量查询 * 并将查询结果打印到控制台。 */ Test public void testSelectBatchIds(){ //根据id批量查询 //SELECT id,name,age,email FROM user WHERE id IN ( ? , ? ) ListUser list userMapper.selectBatchIds(Arrays.asList(4, 2)); list.forEach(System.out::println); } /** * 通过Map条件查询用户信息列表的功能。 * 该方法构造一个包含查询条件的Map对象并调用userMapper的selectByMap方法执行查询操作 * 最后将查询结果打印到控制台。 */ Test public void testSelectByMap(){ //根据map查询用户信息此时null传参 //SELECT id,name,age,email FROM user WHERE name ? AND age ? MapString, Object map new HashMap(); map.put(name, Jack); map.put(age, 20); ListUser list userMapper.selectByMap(map); list.forEach(System.out::println); } /** * 通过条件查询用户信息列表的功能。 * 该方法创建一个User对象并调用userMapper的selectOne方法来查询数据库中的对应记录。 * 最后将查询结果打印到控制台。 */ Test public void testSelectOne(){ //查询用户信息根据条件查询最多只能查询一条 //SELECT id,name,age,email FROM user WHERE name ? AND age ? User user new User(); user.setName(Jack); user.setAge(20); User one userMapper.selectOne(new QueryWrapper(user)); System.out.println(one); } /** * 查询所有数据selectList()功能。 * 该方法通过调用userMapper的selectList()方法查询数据 * 并将查询结果打印到控制台。 * selectList()方法根据MyBatis-Plus内置的条件构造器查询一个list集合。 * 传入null表示没有查询条件即查询所有数据。 */ Test public void testSelectList(){ //selectList()根据MP内置的条件构造器查询一个list集合null表示没有条件即查询所有 userMapper.selectList( null).forEach(System.out::println); }5. 其他重要接口// selectPage分页查询 复杂条件 Test public void testSelectPage() { // 分页参数第2页每页3条 PageUser page new Page(2, 3); QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.gt(age, 18) // 年龄18 .like(email, test.com) // 邮箱包含test.com .orderByDesc(age); // 按年龄降序 IPageUser userIPage userMapper.selectPage(page, queryWrapper); System.out.println(selectPage-总条数 userIPage.getTotal()); System.out.println(selectPage-当前页数据); userIPage.getRecords().forEach(System.out::println); } // selectMapsPage分页查询返回Map集合仅查指定字段 Test public void testSelectMapsPage() { PageMapString, Object page new Page(1, 5); QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.select(uid, name, age) // 只查3个字段 .between(age, 18, 30); // 年龄在18-30之间 IPageMapString, Object mapIPage userMapper.selectMapsPage(page, queryWrapper); System.out.println(selectMapsPage-总页数 mapIPage.getPages()); System.out.println(selectMapsPage-当前页Map数据); mapIPage.getRecords().forEach(System.out::println); } // selectObjs仅查询指定字段返回Object集合适合单字段查询 Test public void testSelectObjs() { QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.select(name) // 只查name字段 .eq(age, 20); ListObject nameList userMapper.selectObjs(queryWrapper); System.out.println(selectObjs-仅查询name字段结果); nameList.forEach(System.out::println); } // updateUpdateWrapper条件更新非ID更新 Test public void testUpdateWithWrapper() { User user new User(); user.setEmail(update_wrappertest.com); // 要更新的字段 UpdateWrapperUser updateWrapper new UpdateWrapper(); updateWrapper.eq(name, 张三) .gt(age, 18); // 条件name张三 且 age18 int rows userMapper.update(user, updateWrapper); System.out.println(testUpdateWithWrapper-影响行数 rows); } // update链式UpdateWrapper直接设置更新字段无需new User Test public void testUpdateForSet() { UpdateWrapperUser updateWrapper new UpdateWrapper(); updateWrapper.eq(uid, 1L) .set(age, 28) // 直接设置要更新的字段和值 .set(email, update_settest.com); int rows userMapper.update(null, updateWrapper); System.out.println(testUpdateForSet-影响行数 rows); } // deleteQueryWrapper条件删除支持复杂条件 Test public void testDeleteWithWrapper() { QueryWrapperUser queryWrapper new QueryWrapper(); queryWrapper.like(name, 测试删除) .lt(age, 18); // 条件name含测试删除 且 age18 int rows userMapper.delete(queryWrapper); System.out.println(testDeleteWithWrapper-影响行数 rows); }二、IServceMyBatis-Plus中有一个接口IService和其实现类ServiceImpl封装了常见的业务层逻辑。采用get查询单行、remove删除、list查询集合、page分页前缀命名方式区分mapper层避免混淆。接口如下public interface IServiceT { int DEFAULT_BATCH_SIZE 1000; default boolean save(T entity) { return SqlHelper.retBool(this.getBaseMapper().insert(entity)); } Transactional( rollbackFor {Exception.class} ) default boolean saveBatch(CollectionT entityList) { return this.saveBatch(entityList, 1000); } boolean saveBatch(CollectionT entityList, int batchSize); Transactional( rollbackFor {Exception.class} ) default boolean saveOrUpdateBatch(CollectionT entityList) { return this.saveOrUpdateBatch(entityList, 1000); } boolean saveOrUpdateBatch(CollectionT entityList, int batchSize); default boolean removeById(Serializable id) { return SqlHelper.retBool(this.getBaseMapper().deleteById(id)); } default boolean removeById(Serializable id, boolean useFill) { throw new UnsupportedOperationException(不支持的方法!); } default boolean removeById(T entity) { return SqlHelper.retBool(this.getBaseMapper().deleteById(entity)); } default boolean removeByMap(MapString, Object columnMap) { Assert.notEmpty(columnMap, error: columnMap must not be empty, new Object[0]); return SqlHelper.retBool(this.getBaseMapper().deleteByMap(columnMap)); } default boolean remove(WrapperT queryWrapper) { return SqlHelper.retBool(this.getBaseMapper().delete(queryWrapper)); } default boolean removeByIds(Collection? list) { return CollectionUtils.isEmpty(list) ? false : SqlHelper.retBool(this.getBaseMapper().deleteBatchIds(list)); } Transactional( rollbackFor {Exception.class} ) default boolean removeByIds(Collection? list, boolean useFill) { if (CollectionUtils.isEmpty(list)) { return false; } else { return useFill ? this.removeBatchByIds(list, true) : SqlHelper.retBool(this.getBaseMapper().deleteBatchIds(list)); } } Transactional( rollbackFor {Exception.class} ) default boolean removeBatchByIds(Collection? list) { return this.removeBatchByIds(list, 1000); } Transactional( rollbackFor {Exception.class} ) default boolean removeBatchByIds(Collection? list, boolean useFill) { return this.removeBatchByIds(list, 1000, useFill); } default boolean removeBatchByIds(Collection? list, int batchSize) { throw new UnsupportedOperationException(不支持的方法!); } default boolean removeBatchByIds(Collection? list, int batchSize, boolean useFill) { throw new UnsupportedOperationException(不支持的方法!); } default boolean updateById(T entity) { return SqlHelper.retBool(this.getBaseMapper().updateById(entity)); } default boolean update(WrapperT updateWrapper) { return this.update((Object)null, updateWrapper); } default boolean update(T entity, WrapperT updateWrapper) { return SqlHelper.retBool(this.getBaseMapper().update(entity, updateWrapper)); } Transactional( rollbackFor {Exception.class} ) default boolean updateBatchById(CollectionT entityList) { return this.updateBatchById(entityList, 1000); } boolean updateBatchById(CollectionT entityList, int batchSize); boolean saveOrUpdate(T entity); default T getById(Serializable id) { return this.getBaseMapper().selectById(id); } default ListT listByIds(Collection? extends Serializable idList) { return this.getBaseMapper().selectBatchIds(idList); } default ListT listByMap(MapString, Object columnMap) { return this.getBaseMapper().selectByMap(columnMap); } default T getOne(WrapperT queryWrapper) { return this.getOne(queryWrapper, true); } T getOne(WrapperT queryWrapper, boolean throwEx); MapString, Object getMap(WrapperT queryWrapper); V V getObj(WrapperT queryWrapper, Function? super Object, V mapper); default long count() { return this.count(Wrappers.emptyWrapper()); } default long count(WrapperT queryWrapper) { return SqlHelper.retCount(this.getBaseMapper().selectCount(queryWrapper)); } default ListT list(WrapperT queryWrapper) { return this.getBaseMapper().selectList(queryWrapper); } default ListT list() { return this.list(Wrappers.emptyWrapper()); } default E extends IPageT E page(E page, WrapperT queryWrapper) { return this.getBaseMapper().selectPage(page, queryWrapper); } default E extends IPageT E page(E page) { return this.page(page, Wrappers.emptyWrapper()); } default ListMapString, Object listMaps(WrapperT queryWrapper) { return this.getBaseMapper().selectMaps(queryWrapper); } default ListMapString, Object listMaps() { return this.listMaps(Wrappers.emptyWrapper()); } default ListObject listObjs() { return this.listObjs(Function.identity()); } default V ListV listObjs(Function? super Object, V mapper) { return this.listObjs(Wrappers.emptyWrapper(), mapper); } default ListObject listObjs(WrapperT queryWrapper) { return this.listObjs(queryWrapper, Function.identity()); } default V ListV listObjs(WrapperT queryWrapper, Function? super Object, V mapper) { return (List)this.getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); } default E extends IPageMapString, Object E pageMaps(E page, WrapperT queryWrapper) { return this.getBaseMapper().selectMapsPage(page, queryWrapper); } default E extends IPageMapString, Object E pageMaps(E page) { return this.pageMaps(page, Wrappers.emptyWrapper()); } BaseMapperT getBaseMapper(); ClassT getEntityClass(); default QueryChainWrapperT query() { return ChainWrappers.queryChain(this.getBaseMapper()); } default LambdaQueryChainWrapperT lambdaQuery() { return ChainWrappers.lambdaQueryChain(this.getBaseMapper()); } default KtQueryChainWrapperT ktQuery() { return ChainWrappers.ktQueryChain(this.getBaseMapper(), this.getEntityClass()); } default KtUpdateChainWrapperT ktUpdate() { return ChainWrappers.ktUpdateChain(this.getBaseMapper(), this.getEntityClass()); } default UpdateChainWrapperT update() { return ChainWrappers.updateChain(this.getBaseMapper()); } default LambdaUpdateChainWrapperT lambdaUpdate() { return ChainWrappers.lambdaUpdateChain(this.getBaseMapper()); } default boolean saveOrUpdate(T entity, WrapperT updateWrapper) { return this.update(entity, updateWrapper) || this.saveOrUpdate(entity); } }1. 创建Service接口和实现类/** * UserService继承IService模板提供的基础功能 */ public interface UserService extends IServiceUser {}/** * ServiceImpl实现了IService提供了IService中基础功能的实现 * 若ServiceImpl无法满足业务需求则可以使用自定的UserService定义方法并在实现类中实现 */ Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService {}2. 测试查询记录数Autowired private UserService userService; Test public void testGetCount(){ long count userService.count(); System.out.println(总记录数 count); }3. 测试批量插入/** * 批量插入 */ Test public void testSaveBatch(){ // SQL长度有限制海量数据插入单条SQL无法实行 // 因此MP将批量插入放在了通用Service中实现而不是通用Mapper ArrayListUser users new ArrayList(); // 未传参的字段默认为null但是id雪花自增 for (int i 0; i 5; i) { User user new User(); // 字符串拼接 user.setName(kk i); // 加法运算 user.setAge(20 i); users.add(user); } //SQL:INSERT INTO user ( username, age ) VALUES ( ?, ? ) userService.saveBatch(users); }4. 其他常用接口// 测试saveOrUpdate新增或更新有ID则更新无则新增 Test public void testSaveOrUpdate() { // 场景1无ID → 新增 User user1 new User(); user1.setName(新增或更新1); user1.setAge(23); user1.setEmail(saveOrUpdate1test.com); userService.saveOrUpdate(user1); // 场景2有ID → 更新 User user2 new User(); user2.setId(1L); user2.setName(新增或更新2); user2.setAge(24); userService.saveOrUpdate(user2); } // 测试saveOrUpdateBatch批量新增或更新 Test public void testSaveOrUpdateBatch() { User user1 new User(); user1.setId(1L); // 有ID → 更新 user1.setName(批量更新); user1.setAge(25); User user2 new User(); // 无ID → 新增 user2.setName(批量新增); user2.setAge(26); ListUser userList Arrays.asList(user1, user2); boolean result userService.saveOrUpdateBatch(userList); System.out.println(批量新增/更新是否成功 result); } // 测试updateBatchById批量更新按ID Test public void testUpdateBatchById() { User user1 new User(); user1.setId(1L); user1.setAge(30); User user2 new User(); user2.setId(2L); user2.setAge(31); ListUser userList Arrays.asList(user1, user2); boolean result userService.updateBatchById(userList); System.out.println(批量更新是否成功 result); } // 测试removeById根据ID删除 Test public void testRemoveById() { boolean result userService.removeById(1L); System.out.println(删除是否成功 result); } // 测试removeByIds批量删除 Test public void testRemoveByIds() { ListLong idList Arrays.asList(7L, 8L); boolean result userService.removeByIds(idList); System.out.println(批量删除是否成功 result); } // 测试remove按条件删除 Test public void testRemove() { LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper(); queryWrapper.eq(User::getName, 测试删除).eq(User::getAge, 0); boolean result userService.remove(queryWrapper); System.out.println(条件删除是否成功 result); } // 测试getById根据ID查询 Test public void testGetById() { User user userService.getById(1L); System.out.println(user); } // 测试listByIds批量查询 Test public void testListByIds() { ListLong idList Arrays.asList(1L, 2L); ListUser userList userService.listByIds(idList); userList.forEach(System.out::println); } // 测试listPage分页查询 Test public void testListPage() { PageUser page new Page(1, 5); LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper(); queryWrapper.gt(User::getAge, 18); IPageUser userIPage userService.page(page, queryWrapper); System.out.println(总条数 userIPage.getTotal()); userIPage.getRecords().forEach(System.out::println); } // 测试count统计总数 Test public void testCount() { LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper(); queryWrapper.gt(User::getAge, 20); long count userService.count(queryWrapper); System.out.println(年龄大于20的用户数 count); } // 测试链式查询LambdaQueryChainWrapper Test public void testLambdaQueryChain() { ListUser userList new LambdaQueryChainWrapper(userService.getBaseMapper()) .eq(User::getAge, 20) .like(User::getName, 张三) .list(); userList.forEach(System.out::println); } // 测试事务性批量操作Transactional Test Transactional // 测试完成后回滚避免污染数据 public void testTransactionalBatch() { // 批量新增 ListUser saveList Arrays.asList( new User(null, 事务测试1, 28, tx1test.com, SexEnum.MALE, null), new User(null, 事务测试2, 29, tx2test.com, SexEnum.FEMALE,null) ); userService.saveBatch(saveList); // 批量更新 ListUser updateList Arrays.asList( new User(2026L, 事务更新1, 30, null, SexEnum.MALE, null), new User(2027L, 事务更新2, 31, null, SexEnum.FEMALE, null) ); userService.updateBatchById(updateList); // 验证事务内可查事务外回滚 System.out.println(事务内查询 userService.getById(2026L)); }

相关新闻

第3章 先从看得到的入手,探究Activity

第3章 先从看得到的入手,探究Activity

Android入门必备:Activity创建、配置与启动实战 在Android开发中,Activity是与用户交互的核心组件,它承载着应用的可视化界面,是开发中最基础也最核心的知识点。本文将结合《第一行代码——Android(第3版)…

2026/7/6 18:50:20 阅读更多 →
04-YOLO项目目录结构最佳实践

04-YOLO项目目录结构最佳实践

很多人跑 YOLO 的思路是先让它跑通,目录结构的事以后再说。但"以后"往往不会到来,等到项目规模稍大,或者需要复现某次实验、交接给同事的时候,乱掉的目录就变成了真实的工程负担。目录结构不是形式,它决定了…

2026/7/7 23:04:58 阅读更多 →
Kotlin程序员面试算法宝典【3.7】

Kotlin程序员面试算法宝典【3.7】

8.6 如何进行希尔排序 【出自 BD 笔试题】 难度系数:★★★★☆ 题目描述: 被考察系数:★★★☆☆ 给定一个无序整型数组,请用希尔排序对数组进行升序排列。分析与解答: 希尔排序也称为“缩小增量排序”。它的基本原理是:首先将待排序的元素分成多个子序列,使得每个子…

2026/5/17 6:59:40 阅读更多 →

最新新闻

如何用ncmdump解锁网易云音乐加密文件?三步实现NCM文件解密

如何用ncmdump解锁网易云音乐加密文件?三步实现NCM文件解密

如何用ncmdump解锁网易云音乐加密文件?三步实现NCM文件解密 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为网易云音乐下载的歌曲只能在特定客户端播放而烦恼?😫 想在其他设备上自由聆听…

2026/7/8 14:48:21 阅读更多 →
如何在PotPlayer中实现实时字幕翻译:3步配置百度翻译插件

如何在PotPlayer中实现实时字幕翻译:3步配置百度翻译插件

如何在PotPlayer中实现实时字幕翻译:3步配置百度翻译插件 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu PotPlayer作为一款…

2026/7/8 14:46:20 阅读更多 →
TPD2015FN智能功率开关在工业负载控制中的应用

TPD2015FN智能功率开关在工业负载控制中的应用

1. 项目背景与核心器件选型在工业自动化控制系统中,电感负载(如电磁阀、继电器线圈)和电阻负载(如加热元件)的精确控制一直是设计难点。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18LF4680微控制…

2026/7/8 14:38:15 阅读更多 →
AI辅助API文档生成:从Swagger注解到智能化接口说明

AI辅助API文档生成:从Swagger注解到智能化接口说明

AI辅助API文档生成:从Swagger注解到智能化接口说明 一、从"手动注解"到"智能生成"的文档工程演进 API文档的维护成本是后端团队的隐性负担:Swagger注解与代码逻辑的耦合导致每次接口变更都要同步修改注解,而注解中的业务…

2026/7/8 14:34:13 阅读更多 →
定时器Timer详解:计数、延时、PWM输出和输入捕获一次讲清

定时器Timer详解:计数、延时、PWM输出和输入捕获一次讲清

定时器Timer详解:计数、延时、PWM输出和输入捕获一次讲清 一、本文适用场景 定时器 Timer 是单片机中非常核心的基础外设。无论是 STM32、GD32、51 单片机,还是其他 MCU,只要涉及时间控制、周期任务、PWM 输出、测频率、测脉宽,基…

2026/7/8 14:28:08 阅读更多 →
B站视频转Markdown笔记:构建个人AI知识库的完整指南

B站视频转Markdown笔记:构建个人AI知识库的完整指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 在实际学习过程中,很多人习惯把 B 站的优质视频教程、技术分享、深度解析等内容收藏起来,打算“以后再看”。但…

2026/7/8 14:28:08 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻