mybatis和mysql中查询前六个月订单中每个月的总订单数

本文详细介绍了一种在MyBatis中实现复杂SQL查询的方法,特别是如何通过XML映射文件来处理带有特殊字符的SQL语句,利用CDATA段确保SQL语法正确解析。此外,还提供了一个复杂的SQL查询示例,该示例能够高效地统计不同月份订单的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如在employeeMapper.xml中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="cn.lz.life.dao.EmployeeDao">
	<resultMap id="map" type="HashMap">
		<result column="number" property="number" />
		<result column="monthName" property="monthName" />
	</resultMap>
	<select id="findOrderFormNum" resultType="map" parameterType="HashMap" >
		
		    SELECT 
		    COUNT(*) as number, MONTH(DATE_SUB(SYSDATE(),INTERVAL #{count} MONTH)) as monthName
		    FROM employee e, order_form o, employee_order_middle eom
		    WHERE e.employeeNo = eom.e_id
		    AND o.orderNo = eom.o_id
		    AND e.employeeNo = #{employeeNo}
		    AND o.finishTime <![CDATA[>=]]> DATE_SUB(DATE_FORMAT(SYSDATE(), '%Y-%m-01'),INTERVAL #{count} MONTH) 
			AND o.finishTime <![CDATA[<]]> DATE_SUB(DATE_FORMAT(SYSDATE(), '%Y-%m-01'),INTERVAL #{count}- 1 MONTH)
		
  </select>
</mapper>


在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决


六种sql查询语句


SELECT 
	(
		SELECT COUNT(*) FROM order_form
		WHERE finishTime 
		LIKE CONCAT('%',YEAR(DATE_SUB(SYSDATE(),INTERVAL 0 MONTH)),'-',MONTH(DATE_SUB(SYSDATE(),INTERVAL 0 MONTH)),'%')
	) AS one, MONTH(DATE_SUB(SYSDATE(),INTERVAL 0 MONTH)) AS monthOne,
	(
		SELECT COUNT(*) FROM order_form 
		WHERE finishTime 
		LIKE CONCAT('%',SUBSTR(DATE_SUB(SYSDATE(),INTERVAL 1 MONTH), 1, 7),'%')
	) AS two, MONTH(DATE_SUB(SYSDATE(),INTERVAL 1 MONTH)) AS monthTwo,
	(
		SELECT COUNT(*) FROM order_form 
		WHERE finishTime 
		LIKE CONCAT('%',EXTRACT(YEAR FROM DATE_SUB(SYSDATE(),INTERVAL 2 MONTH)),'-',EXTRACT(MONTH FROM DATE_SUB(SYSDATE(),INTERVAL 2 MONTH)),'%')
	) AS three, MONTH(DATE_SUB(SYSDATE(),INTERVAL 2 MONTH)) AS monthThree,
	(
		SELECT COUNT(*) FROM order_form 
		WHERE finishTime 
		LIKE CONCAT('%',DATE_FORMAT(DATE_SUB(SYSDATE(),INTERVAL 3 MONTH),'%Y-%m'),'%')
	) AS four, MONTH(DATE_SUB(SYSDATE(),INTERVAL 3 MONTH)) AS monthFour,
	(
		SELECT COUNT(*) FROM order_form 
		WHERE finishTime > DATE_SUB(DATE_FORMAT(SYSDATE(), '%Y-%m-01'),INTERVAL 4 MONTH) 
		AND finishTime < DATE_SUB(DATE_FORMAT(SYSDATE(), '%Y-%m-01'),INTERVAL 3 MONTH)
	) AS five, MONTH(DATE_SUB(SYSDATE(),INTERVAL 4 MONTH)) AS monthFive,
	(
		SELECT COUNT(*) FROM order_form 
		WHERE finishTime 
		BETWEEN DATE_SUB(DATE_FORMAT(SYSDATE(), '%Y-%m-01'),INTERVAL 5 MONTH) 
		AND DATE_SUB(DATE_FORMAT(SYSDATE(), '%Y-%m-01'),INTERVAL 4 MONTH)
	) AS six, MONTH(DATE_SUB(SYSDATE(),INTERVAL 5 MONTH)) AS monthSix
FROM DUAL




<think>嗯,用户之让我介绍了包括MyBatis-Plus在内的多个技术,现在他们特别想深入了解MyBatis-Plus的分页查询功能。我需要仔细回想之的回答,确保现在的内容不重复但更深入。 首先,用户可能已经知道MyBatis-Plus是MyBatis的增强工具,所以不需要再重复基本概念。他们需要的是分页查询的具体使用方法、配置步骤以及实际案例。可能他们正在项目中遇到分页需求,或者想优化现有的分页实现。 接下来,我得考虑用户的使用场景。可能是开发一个需要分页展示数据的后台管理系统,比如用户列表、订单记录等。这时候,分页查询的性能易用性非常重要。用户可能关心如何快速集成,是否需要编写大SQL,以及如何避免性能问题,比如内存溢出。 用户的身份可能是Java后端开发人员,对Spring BootMyBatis有一定了解,但可能对MyBatis-Plus的高级功能不熟悉。他们需要明确的步骤代码示例,以便快速应用到项目中。同时,他们可能也关心分页插件的工作原理,比如是否使用了物理分页,以及如何防止SQL注入等安全问题。 此外,用户可能没有明说的深层需求包括分页查询的优化,比如缓存机制、多表联查时的分页处理,或者在分布式系统中分页的一致性。不过,根据当的问题,可能主要集中在基础实现配置上,所以需要先覆盖这些内容,再适当提及高级用法。 需要确保回答结构清晰,分步骤说明配置、基本使用、进阶功能,并提供示例代码。还要注意使用中文,避免技术术语的混淆,同时保持代码的正确性规范性。最后,综合案例部分可以加强用户的理解,展示如何在实际项目中应用这些知识。</think>以下是 MyBatis-Plus 分页查询的详细说明,分模块解析其实现原理、使用步骤实际案例: --- ### 一、分页查询原理 MyBatis-Plus 的分页查询基于 **物理分页**(直接通过 SQL 的 `LIMIT` 语句实现),而非内存分页。 **核心流程**: 1. 创建分页参数对象(页码、每页条数) 2. 自动在 SQL 末尾追加 `LIMIT offset, size` 3. 执行查询并封装分页结果(包含记录数、当页数据) --- ### 二、基础配置(Spring Boot 集成) #### 1. 添加分页插件 在配置类中注入 `PaginationInterceptor`(旧版本)或 `MybatisPlusInterceptor`(新版本): ```java @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } } ``` #### 2. 配置分页参数(可选) 通过 `Page` 对象指定分页参数: ```java Page<User> page = new Page<>(1, 10); // 第1页,每页10条 ``` --- ### 三、基础使用方式 #### 1. Service 层分页查询 直接调用 `page` 方法: ```java // 查询所有用户(无条件) Page<User> userPage = userService.page(page); // 带条件查询(使用 QueryWrapper) QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "张"); Page<User> userPage = userService.page(page, wrapper); ``` #### 2. Mapper 层自定义 SQL 分页 Mapper 接口定义: ```java @Select("SELECT * FROM user WHERE age > #{age}") Page<User> selectByAge(Page<User> page, @Param("age") Integer age); ``` --- ### 四、进阶功能 #### 1. 不查询记录数(提升性能) ```java Page<User> page = new Page<>(1, 10).setSearchCount(false); ``` #### 2. 多表联查分页 在 XML 中编写 SQL,注意 `LIMIT` 必须放在最后: ```xml <select id="selectUserWithRole" resultType="UserVO"> SELECT u.*, r.role_name FROM user u LEFT JOIN role r ON u.role_id = r.id ${ew.customSqlSegment} <!-- 自动拼接 WHERE 条件 --> </select> ``` --- ### 五、实际案例:订单分页查询 #### 场景需求 - 按订单状态筛选 - 按时间倒序排序 - 每页显示 15 条 #### 实现代码 ```java // 1. 创建分页对象 Page<Order> page = new Page<>(currentPage, 15); // 2. 构建查询条件 LambdaQueryWrapper<Order> wrapper = Wrappers.lambdaQuery(); wrapper.eq(Order::getStatus, 1) // 状态为已支付 .orderByDesc(Order::getCreateTime); // 3. 执行分页查询 Page<Order> result = orderService.page(page, wrapper); // 4. 获取结果 List<Order> records = result.getRecords(); // 当页数据 long total = result.getTotal(); // 记录数 ``` --- ### 六、注意事项 1. **数据库类型**:需正确配置 `DbType`(如 `DbType.MYSQL`) 2. **性能优化**:大数据时建议关闭 `count` 查询 3. **SQL 注入防护**:避免直接拼接用户输入参数 4. **排序字段**:推荐使用数据库字段名而非 Java 属性名 --- 通过 MyBatis-Plus 的分页机制,开发者可以快速实现高性能分页功能,减少模板代码,典型应用于后台管理系统中的表格数据展示场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值