DS4-DAY1-概率论基础与条件概率

核心内容摘要

开启mysql的binlog日志
解密书匠策AI:毕业论文写作的“智能外挂军团”如何颠覆传统流程

【RabbitMQ】超详细Windows系统下RabbitMQ的安装配置

MyBatis-Plus Mapper 完全指南从基础用法到高级扩展在MyBatis-PlusMP的技术体系中Mapper层是持久层的核心载体承接业务层请求与数据库操作既是MP自动化能力的入口也是自定义SQL的落地载体。

相较于原生MyBatis的MapperMP的Mapper通过BaseMapper接口封装了全量单表CRUD方法同时支持灵活扩展自定义逻辑大幅降低了持久层代码量。

本文将从基础用法、自定义扩展、进阶技巧、避坑指南四个维度拆解MP Mapper的完整使用流程助力开发者精准掌握这一核心组件。

MP Mapper 核心基础BaseMapper 接口详解MP的核心优势之一就是通过BaseMapperT接口提供了开箱即用的单表CRUD方法开发者只需让自定义Mapper接口继承该接口无需编写任何方法体即可获得完整的单表操作能力。

这一设计彻底解决了原生MyBatis中单表操作SQL冗余、方法重复定义的问题。

BaseMapper 核心方法分类与使用示例BaseMapper接口包含30个单表操作方法覆盖新增、删除、修改、查询四大场景以下按高频场景分类说明结合Order实体类演示用法实体类定义参考前文此处略。

1新增操作核心方法int insert(T entity)自动将实体类属性映射为数据库字段生成INSERT语句支持主键自动填充如雪花算法、自增。

scss// OrderMapper接口仅需继承BaseMapper public interface OrderMapper extends BaseMapperOrder {} // 业务层调用 Service public class OrderServiceImpl { Autowired private OrderMapper orderMapper; public void addOrder() { Order order new Order(); order.setOrderNo(ORDER

; order.setUserId(1002L); order.setAmount(new BigDecimal(

299.

); order.setStatus(

; // 调用BaseMapper的insert方法返回受影响行数 int rows orderMapper.insert(order); System.out.println(新增成功影响行数 rows); } }注意主键生成策略由全局配置或实体类TableId注解指定如ASSIGN_ID雪花算法、AUTO自增插入后实体类会自动回显主键值。

2删除操作提供按主键删除、按条件删除两类方法支持单条、批量删除结合逻辑删除配置可实现假删除。

scss//

按主键删除单条 orderMapper.deleteById(1L); //

批量按主键删除 ListLong ids Arrays.asList(1L, 2L, 3L); orderMapper.deleteBatchIds(ids); //

按条件删除QueryWrapper/LambdaQueryWrapper LambdaQueryWrapperOrder wrapper new LambdaQueryWrapper(); wrapper.eq(Order::getUserId, 1002L) .lt(Order::getCreateTime, LocalDateTime.of(2026, 1, 1, 0,

); orderMapper.delete(wrapper); // 删除指定用户2026年前的订单3修改操作支持按主键更新、按条件更新可选择更新全部字段或非空字段适配不同业务场景。

scss//

按主键更新更新非空字段推荐 Order order new Order(); order.setId(1L); order.setStatus(

; // 仅更新状态字段 orderMapper.updateById(order); //

按条件更新更新指定字段 UpdateWrapperOrder updateWrapper new UpdateWrapper(); updateWrapper.eq(user_id, 1002L) .set(status,

// 强制更新状态为2 .set(update_time, LocalDateTime.now()); orderMapper.update(null, updateWrapper); //

Lambda方式按条件更新类型安全 LambdaUpdateWrapperOrder lambdaWrapper new LambdaUpdateWrapper(); lambdaWrapper.eq(Order::getUserId, 1002L) .set(Order::getStatus,

; orderMapper.update(null, lambdaWrapper);4查询操作覆盖单条查询、列表查询、分页查询、条件查询等场景支持Lambda表达式构造条件避免字段名硬编码。

ini//

按主键查询单条 Order order orderMapper.selectById(1L); //

批量按主键查询 ListLong ids Arrays.asList(1L, 2L); ListOrder orderList orderMapper.selectBatchIds(ids); //

按条件查询列表Lambda方式 LambdaQueryWrapperOrder wrapper new LambdaQueryWrapper(); wrapper.eq(Order::getUserId, 1002L) .eq(Order::getStatus,

.orderByDesc(Order::getCreateTime); ListOrder paidOrders orderMapper.selectList(wrapper); //

分页查询需配合MP分页插件 PageOrder page new Page(1,

; // 第1页每页10条 IPageOrder orderPage orderMapper.selectPage(page, wrapper); ListOrder records orderPage.getRecords(); // 分页数据 long total orderPage.getTotal(); // 总条数 //

查询单条记录无数据返回null多条数据抛异常 Order singleOrder orderMapper.selectOne(wrapper); //

查询条数 long count orderMapper.selectCount(wrapper);

Mapper 扫描配置让Spring识别Mapper接口MP Mapper接口需被Spring扫描才能注入使用有两种常用配置方式按需选择即可。

1启动类添加MapperScan注解推荐在Spring Boot启动类上指定Mapper接口所在包批量扫描所有Mapper无需在每个Mapper上添加Mapper注解。

lessSpringBootApplication // 扫描com.example.mp.mapper包下所有Mapper接口 MapperScan(com.example.mp.mapper) public class MyBatisPlusDemoApplication { public static void main(String[] args) { SpringApplication.run(MyBatisPlusDemoApplication.class, args); } }2单个Mapper接口添加Mapper注解适用于Mapper接口分散在不同包的场景需在每个自定义Mapper接口上添加Mapper注解。

java// 单个Mapper添加Mapper注解 Mapper public interface OrderMapper extends BaseMapperOrder {}避坑提醒避免同时使用两种方式且确保MapperScan注解的包路径准确否则会导致Mapper无法注入抛出NoSuchBeanDefinitionException异常。

自定义 Mapper突破单表限制扩展业务逻辑BaseMapper仅覆盖单表操作实际业务中难免需要多表关联、复杂条件查询等场景此时需通过自定义方法扩展Mapper。

MP支持两种自定义方式XML文件编写SQL、注解编写SQL可根据场景灵活选择。

XML方式自定义Mapper推荐复杂SQL场景XML方式适合SQL逻辑复杂、需动态拼接的场景保持Java代码与SQL分离便于维护。

步骤如下1配置XML文件路径在application.yml中指定Mapper XML文件的存放路径MP会自动扫描该路径下的XML文件。

yamlmybatis-plus: mapper-locations: classpath:mapper/**/*.xml # 扫描resources/mapper下所有XML文件 type-aliases-package: com.example.mp.entity # 实体类别名包XML中可省略全类名2Mapper接口定义自定义方法在OrderMapper接口中添加自定义方法方法名需与XML中SQL的id一致。

lesspublic interface OrderMapper extends BaseMapperOrder { // 自定义关联用户表查询订单详情多表关联 ListOrderVO selectOrderVOList(Param(userId) Long userId, Param(status) Integer status); // 自定义动态条件查询订单结合XML动态SQL ListOrder selectOrderByDynamicCondition(Param(wrapper) QueryWrapperOrder wrapper); }说明Param注解用于指定参数名便于XML中引用若参数为条件构造器QueryWrapper/LambdaQueryWrapper可直接传入XML使用。

3编写XML文件实现SQL在resources/mapper目录下创建OrderMapper.xml编写自定义SQL命名空间需与Mapper接口全类名一致。

xml?xml version

0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper

0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.mp.mapper.OrderMapper !-- 关联查询返回OrderVO对象 -- select idselectOrderVOList resultTypecom.example.mp.vo.OrderVO SELECT o.id, o.order_no, o.amount, o.status, u.id AS user_id, u.username, u.phone FROM t_order o LEFT JOIN t_user u ON o.user_id u.id WHERE 11 if testuserId ! null AND o.user_id #{userId} /if if teststatus ! null AND o.status #{status} /if AND o.deleted 0 ORDER BY o.create_time DESC /selectgt; !-- 动态条件查询复用MP条件构造器 -- select idselectOrderByDynamicCondition resultTypeOrder SELECT * FROM t_order where ${wrapper.sqlSegment} !-- 直接引用QueryWrapper的SQL片段 -- AND deleted 0 lt;/wheregt; lt;/selectgt; lt;/mappergt;

注解方式自定义Mapper适合简单SQL场景对于逻辑简单的SQL可直接通过MP提供的注解Select、Insert、Update、Delete在Mapper接口方法上编写无需XML文件简洁高效。

lesspublic interface OrderMapper extends BaseMapperOrder { // 注解方式查询指定用户的已支付订单 Select(SELECT * FROM t_order WHERE user_id #{userId} AND status 1 AND deleted

ListOrder selectPaidOrdersByUserId(Param(userId) Long userId); // 注解方式动态SQL结合MP的SqlParser注解可选 Select(script SELECT * FROM t_order WHERE deleted 0 if teststatus ! null AND status #{status} /if if teststartTime ! null AND create_time #{startTime} /if /script) ListOrder selectOrdersByCondition(Param(status) Integer status, Param(startTime) LocalDateTime startTime); }说明注解中编写动态SQL需用

Mapper 进阶技巧提升开发效率与性能

批量操作优化减少数据库交互次数BaseMapper提供的insertBatchIds、deleteBatchIds方法虽支持批量操作但底层仍可能分多次执行SQL。

对于大量数据批量插入/更新可通过以下方式优化1使用MP自带批量操作方法基础版scss// 批量插入推荐每批次

条避免单次插入过多数据 ListOrdergt; orderList new ArrayList(); // 填充orderList数据... orderMapper.insertBatchIds(orderList);2配置JDBC批量提交进阶版结合Druid连接池配置批量提交参数让MP批量操作底层复用连接减少网络开销。

yamlspring: datasource: druid: # 开启JDBC批量提交 batch-open-result-set: true # 批量操作提交阈值 connection-properties: druid.stat.mergeSqltrue;druid.stat.slowSqlMillis5000;druid.batch.openResultSettrue

结果映射解决字段不匹配与复杂返回值当实体类字段与数据库字段不一致或查询返回多表关联结果时可通过结果映射解决支持XML配置ResultMap和注解方式两种。

1XML配置ResultMapxmlmapper namespacecom.example.mp.mapper.OrderMappergt; !-- 配置字段映射解决实体类与数据库字段不一致问题 -- resultMap idOrderResultMap typeOrder lt;id columnorder_id propertyid/gt; !-- 数据库字段order_id映射实体类id -- result columnorder_number propertyorderNo/gt; !-- 数据库order_number映射orderNo -- result columntotal_amount propertyamount/ /resultMap select idselectByIdWithResultMap resultMapOrderResultMap SELECT order_id, order_number, total_amount FROM t_order WHERE order_id #{id} /select /mapper2注解方式映射Results、Resultlesspublic interface OrderMapper extends BaseMapperOrder { Select(SELECT order_id, order_number, total_amount FROM t_order WHERE order_id #{id}) Results({ Result(column order_id, property id, id true), // idtrue表示主键 Result(column order_number, property orderNo), Result(column total_amount, property amount) }) Order selectByIdWithAnnotation(Param(id) Long id); }

Mapper 继承与扩展复用通用逻辑当多个Mapper存在重复自定义方法时可创建通用Mapper接口通过继承复用逻辑减少代码冗余。

less// 通用Mapper接口封装公共方法 public interface CommonMapperT extends BaseMapperT { // 公共方法按创建时间范围查询 ListT selectByCreateTimeRange(Param(startTime) LocalDateTime startTime, Param(endTime) LocalDateTime endTime); } // 自定义XML实现通用方法CommonMapper.xml mapper namespacecom.example.mp.mapper.CommonMapper select idselectByCreateTimeRange resultTypeT SELECT * FROM ${tableName} WHERE create_time BETWEEN #{startTime} AND #{endTime} AND deleted 0 /select /mapper // OrderMapper继承通用Mapper获得公共方法 public interface OrderMapper extends CommonMapperOrder { // 自定义Order专属方法... }

多数据源下的Mapper使用集成MP多数据源组件dynamic-datasource-spring-boot-starter后可通过DS注解指定Mapper接口或方法的数据源实现读写分离、多库操作。

java// 方式1在Mapper接口上指定数据源所有方法默认使用slave从库 DS(slave) public interface OrderMapper extends BaseMapperOrder { // 读操作方法从库 ListOrder selectOrderListByUserId(Long userId); // 方式2方法上指定数据源覆盖接口注解使用master主库 DS(master) int insertOrder(Order order); }

Mapper 高频避坑指南

坑点1Mapper注入失败抛出NoSuchBeanDefinitionException现象启动项目时提示无法找到Mapper接口的Bean无法注入使用。

规避方案检查MapperScan注解的包路径是否准确确保覆盖所有Mapper接口若使用单个Mapper注解确认每个Mapper都添加了该注解且接口是public修饰避免Mapper接口与XML文件命名空间不一致XML的namespace必须是Mapper接口全类名。

坑点2自定义SQL中字段名错误报Column not found异常现象执行自定义SQL时提示数据库字段不存在实际字段名正确。

规避方案确认实体类字段与数据库字段映射正确开启驼峰命名自动映射map-underscore-to-camel-case: true自定义SQL中字段名若与数据库关键字冲突如order、user需用反引号包裹order多表关联查询时避免字段名重复需指定表别名如o.id、u.id。

坑点3批量插入性能差耗时过长现象批量插入上千条数据时耗时远超预期数据库压力大。

规避方案分批次批量插入每批次控制在

条避免单次插入过多数据配置JDBC批量提交参数结合Druid连接池优化复杂场景下使用MyBatis原生批量插入XMLforeach标签性能优于MP自带insertBatchIds。

坑点4条件构造器传入XML后SQL拼接异常现象将QueryWrapper传入自定义XML后执行SQL时报语法错误条件未正确拼接。

规避方案XML中引用条件构造器时使用${wrapper.sqlSegment}无#{}且需配合标签消除多余AND/OR避免条件构造器与自定义SQL条件重复如同时拼接deleted0建议统一在XML或构造器中处理若条件构造器中使用了Lambda表达式确保实体类字段与数据库字段映射正确。

坑点5逻辑删除后自定义SQL仍查询到已删除数据现象配置逻辑删除后BaseMapper方法可正常过滤已删除数据但自定义SQL仍返回删除数据。

规避方案BaseMapper方法自动拼接逻辑删除条件但自定义SQL需手动添加AND deleted 0可通过MP的全局SQL注入器自动为自定义SQL添加逻辑删除条件减少手动编写。

五、

总结Mapper 层使用核心原则MP Mapper层的使用核心是“复用优先、灵活扩展”在实际开发中需遵循以下原则平衡开发效率与性能单表操作优先使用BaseMapper自带方法避免重复编写SQL充分发挥MP的自动化能力复杂SQL、多表关联优先选择XML方式实现便于调试和维护简单SQL可使用注解方式简化开发批量操作、多数据源、结果映射等场景需结合业务需求选择优化方案避免性能瓶颈严格规范Mapper接口与XML的命名、路径减少注入失败、SQL错误等问题提升项目可维护性。

Mapper层作为MP与数据库交互的核心桥梁既要熟练掌握BaseMapper的基础用法也要灵活运用自定义扩展能力才能在不同业务场景中高效落地。

掌握本文所述的用法、技巧与避坑要点可大幅减少持久层开发工作量提升代码质量与性能。

桔子视频免费高清观看电视剧大全-桔子视频免费高清观看电视剧大全应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123