MyBatis 之分页四式传参与聚合、主键操作全解

目录

[1. 📑分页查询](#1. 📑分页查询)

[1.1. 🔢顺序传参](#1.1. 🔢顺序传参)

[1.1.1. 持久层方法](#1.1.1. 持久层方法)

[1.1.2. 映射文件](#1.1.2. 映射文件)

[1.1.3. 测试类](#1.1.3. 测试类)

[1.2. 💡@Param传参](#1.2. 💡@Param传参)

[1.2.1. 持久层接口方法](#1.2.1. 持久层接口方法)

[1.2.2. 映射文件](#1.2.2. 映射文件)

[1.2.3. 测试类](#1.2.3. 测试类)

[1.3. 📦POJO传参](#1.3. 📦POJO传参)

[1.3.1. 自定义POJO](#1.3.1. 自定义POJO)

[1.3.2. 持久层接口方法](#1.3.2. 持久层接口方法)

[1.3.3. 映射文件](#1.3.3. 映射文件)

[1.3.4. 测试类](#1.3.4. 测试类)

[1.4. 🗺️Map传参](#1.4. 🗺️Map传参)

[1.4.1. 持久层接口方法](#1.4.1. 持久层接口方法)

[1.4.2. 映射文件](#1.4.2. 映射文件)

[1.4.3. 测试类](#1.4.3. 测试类)

[2. 📊聚合查询、主键回填](#2. 📊聚合查询、主键回填)

[2.1. 🧮查询用户总数](#2.1. 🧮查询用户总数)

[2.1.1. 持久层接口方法](#2.1.1. 持久层接口方法)

[2.1.2. 映射文件](#2.1.2. 映射文件)

[2.1.3. 测试类](#2.1.3. 测试类)

[2.2. 🔙主键回填](#2.2. 🔙主键回填)

[2.2.1. 持久层接口方法](#2.2.1. 持久层接口方法)

[2.2.2. 映射文件](#2.2.2. 映射文件)

[2.2.3. 测试类](#2.2.3. 测试类)

[3. 📌总结](#3. 📌总结)


💡【开发哲学共勉】

在 MyBatis 的世界里,事务提交是对数据变更的郑重承诺,参数绑定藏着对安全的敬畏,资源闭环是对系统的温柔守护,而接口与映射的一 一对应,恰是规范赋予效率的礼物

🎉 前言

在日常开发中,MyBatis 的数据交互操作里,分页查询、聚合统计与主键处理是高频场景。看似基础的传参方式选择、聚合函数使用、主键回填配置,实则藏着代码规范与开发效率的密钥。本文聚焦这些核心操作的实现细节与最佳实践,愿能为开发者提供清晰指引,让每一次数据交互都更规范、更高效

个人主页:艺杯羹🌿

系列专栏:MyBatis🚀

1. 📑分页查询

分页查询时,Sql语句使用limit 关键字,需要传入开始索引和每页条数两个参数

MyBatis的多参数处理有以下方式:

1.1. 🔢顺序传参

Sql中的参数使用arg0arg1 ...或 param1param2 ...表示参数的顺序

此方法可读性较低,在开发中不建议使用

演示一下

1.1.1. 持久层方法

java 复制代码
/**
   * 分页查询
   * @param startIndex 开始索引
   * @param pageSize 每页条数
   * @return
   */
List<User> findPage(int startIndex,int pageSize);

1.1.2. 映射文件

XML 复制代码
<select id="findPage" resultType="com.itbaizhan.mapper.User">
    -- #{arg0},#{arg1} 相当于从外面传值到这两个当中
   select * from user limit #{arg0},#{arg1}
</select>


<select id="findPage" resultType="com.itbaizhan.mapper.User">
   select * from user limit #{param1},#{param2}
</select>

1.1.3. 测试类

java 复制代码
public void testFindPage(){
	List<User> page = userMapper.findPage(0, 3);
    page.forEach(user -> System.out.println(user.getUsername()));
}

1.2. 💡@Param传参

在接口方法的参数列表中通过@Param定义参数名称,在Sql语句中通过注解中所定义的参数名称指定参数位置

此方式参数比较直观的,推荐使用

演示一下

1.2.1. 持久层接口方法

java 复制代码
List<User> findPage1(@Param("startIndex") int startIndex, @Param("pageSize")int pageSize);

1.2.2. 映射文件

XML 复制代码
<select id="findPage1" resultType="com.yibeigen.pojo.User">
  -- SQL 语句里的 #{startIndex} 和 #{pageSize} 要和这些注解的名称相对应
  select * from user limit #{startIndex},#{pageSize}
</select>

1.2.3. 测试类

java 复制代码
@Test
public void testFindPage1(){
  List<User> users = userMapper.findPage1(3,3);
  users.forEach(System.out::println);
}

1.3. 📦POJO传参

自定义POJO类,该类的属性就是要传递的参数

在SQL语句中绑定参数时使用POJO的属性名作为参数名即可

这个方法也是推荐使用的

1.3.1. 自定义POJO

java 复制代码
// 省略getter/setter/构造方法
public class PageQuery {
  private int startIndex;
  private int pageSize;
}

1.3.2. 持久层接口方法

java 复制代码
List<User> findPage2(PageQuery pageQuery);

1.3.3. 映射文件

XML 复制代码
<select id="findPage2" resultType="com.yibeigen.pojo.User" parameterType="com.itbaizhan.pojo.PageQuery">
   select * from user limit #{startIndex},#{pageSize}
</select>

1.3.4. 测试类

java 复制代码
@Test
public void testFindPage2(){
  PageQuery pageQuery = new PageQuery(3, 3);
  List<User> users = userMapper.findPage2(pageQuery);
  users.forEach(System.out::println);
}

1.4. 🗺️Map传参

如果不想自定义POJO,可以使用Map作为传递参数的载体

在SQL语句中绑定参数时使用Map的Key作为参数名即可

此方法推荐使用

1.4.1. 持久层接口方法

java 复制代码
// 参数要是 Map<String,Object>
List<User> findPage3(Map<String,Object> params);

1.4.2. 映射文件

java 复制代码
<select id="findPage3" resultType="com.yibeigen.pojo.User" parameterType="map">
   select * from user limit #{startIndex},#{pageSize}
</select>

1.4.3. 测试类

java 复制代码
@Test
public void testFindPage3(){
  Map<String,Object> params = new HashMap();
  params.put("startIndex",0);
  params.put("pageSize",4);
  List<User> users = userMapper.findPage3(params);
  users.forEach(System.out::println);
}

2. 📊聚合查询、主键回填

聚合查询也就是将查询的所有总结成一条结果,例如查询用户总数

2.1. 🧮查询用户总数

2.1.1. 持久层接口方法

java 复制代码
int findCount();

2.1.2. 映射文件

java 复制代码
<select id="findCount" resultType="int">
   select count(id) from user
</select>

2.1.3. 测试类

java 复制代码
@Test
public void testFindCount(){
  System.out.println(userMapper.findCount());
}

2.2. 🔙主键回填

有时我们需要获取新插入数据的主键值

如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能

2.2.1. 持久层接口方法

java 复制代码
void add(User user);

2.2.2. 映射文件

java 复制代码
<insert id="add" parameterType="com.itbaizhan.user.User">
  <!-- keyProperty:主键属性名,keyColumn:主键列名,resultType:主键类型,order:执行时机 -->
  <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
     SELECT LAST_INSERT_ID();
  </selectKey>
   insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>

SELECT LAST_INSERT_ID():查询刚刚插入的记录的主键值,只适用于自增主键,且必须和insert语句一起执行

2.2.3. 测试类

java 复制代码
@Test
public void testAdd(){
  User user = new User("艺杯羹", new Date(), "男", "湖南");
  userMapper.add(user);
  session.commit();
  System.out.println(user.getId());
}

3. 📌总结

到现在就讲解完了分页查询和聚合查询以及主键回填,希望能够帮助到大家, 如果有什么建议评论区见哦(๑•̀ㅂ•́)و✧

相关推荐
鸿儒51712 分钟前
C++ Qt插件开发样例
开发语言·c++·qt
长安即是故里18 分钟前
UV和Mamba包管理工具
开发语言·python
ZHENGZJM21 分钟前
使用JS编写一个购物车界面
开发语言·javascript·ecmascript
duration~23 分钟前
Spring AI快速入门
java·人工智能·后端·spring·flask
没有羊的王K24 分钟前
SSM框架学习——day3
java·spring boot·学习
布丁052326 分钟前
JavaScript基础(三)
开发语言·javascript·ecmascript
月堂28 分钟前
【无标题】
java·linux·windows
remCoding38 分钟前
Java大厂面试实录:从Spring Boot到AI大模型的深度技术拷问
java·spring boot·redis·spring cloud·ai·kafka·microservices
天天摸鱼的java工程师40 分钟前
扫码登录设计原理:扫码一笑,身份到手!
java·后端·面试
hardStudy_h1 小时前
QT——文件选择对话框 QFileDialog
开发语言·qt