关于XML映射文件写Mybatis查询和分页查询的实现方法

news/2025/4/1 23:26:46/文章来源:https://www.cnblogs.com/zhaozhijiong/p/18801434

XML映射文件规范

  1. XML映射文件的名称必须与Mapper接口的名称一致,并且将XML文件和Mapper接口放置在相同包下(同包同名)

  2. XML映射文件的namespace属性为Mapper接口的全限定类名(online.zhaozhijiong.mapper.EmpMapper)

  3. XML映射文件中sql语句的idMapper接口的方法名一致,并保持相同的返回类型(ResultType

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">	//必要的设定
    <mapper namespace="online.zhaozhijiong.mapper.EmpMapper">	//全限定类名<select id="getSearchInfo" resultType="online.zhaozhijiong.pojo.Emp">select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_timefrom emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">gender = #{gender}</if><if test="start != null and end != null">entrydate between #{start} and #{end}</if></where>order by create_time desc</select>
    </mapper>
    

细节

  1. 在通过@Mapper注解的方式,操作数据库时,占位符中的字段名不需要严格按照数据库设计的字段名填写,例如当有下划线的字段名时,可以直接使用驼峰命名法 ,如下: 在数据库中,部门编号dept_id,是以含下划线的形式命名的,但是在通过占位符解析emp对象字段名的时候,并不一定要将emp对象的属性定义为和数据库字段中相同的属性名,而是采用驼峰命名法

    @Update("UPDATE emp SET username = #{username}, name = #{name}, gender = #{gender}, image = #{image}, job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId} WHERE id = #{id}")
    public void update(Emp emp);	
    

    此时要在SpringBoot配置文件中加入一下配置:

    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    

    在XMl映射文件中也是同样

    <update id="update">UPDATE emp<set><if test="username != null">username = #{username},</if><if test="name != null">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="dept_id != null">dept_id = #{deptId}</if></set>WHERE id = #{id}
    </update>
    
  2. 但是要记住的是,如果不是在占位符中的字段名,一定要按照数据库中的字段名填写

动态sql

标签

标签 用法
<if test="Logical statement"></if> 如果test中的条件成立,则拼接sql语句
  1. <if test="Logical statement"></if>

    <update id="update">UPDATE emp<set><if test="username != null">username = #{username},</if><if test="name != null">name = #{name},</if><if test="gender != null">gender = #{gender},</if><if test="image != null">image = #{image},</if><if test="job != null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="dept_id != null">dept_id = #{deptId}</if></set>WHERE id = #{id}
    </update>
    
  2. <foreach></foreach>

    <foreach>中有常用的属性

    1. collection:与mapper传中递的变量名一致
    2. item :每一项的名称
    3. separator:定义分隔符
    4. open:在拼接前需要拼接符号
    5. close:在拼接之后的需要拼接的符号
    <delete id="delete2">DELETEfrom empwhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
    </delete>
    
  3. <compoment id=""></compoment>

    <include/>搭配使用

    <sql id="common_sql">SELECT id,username,password,name,gender,image,job,entrydate,dept_id,create_time,update_timefrom emp
    </sql>
    <select id="getAll"><include refid="common_sql"/>
    </select>
    

分页查询

基础写法

需要前端传递两个参数,分别为page和pageSize, 分别表示第几页和每一页多少条数据

但是在后端需要对参数page进行处理

原因:由于sql查询的机制,是通过limit start, pageSize实现但是start的含义并不是从第几页开始,而是从第几条数据开始,所以要将前端传递来的page参数进行转变,得到当前页数起始数据的索引

Integer start = (page - 1) * pageSize;

然后再通过mapper查询

@Select("select * from tails.emp limit #{start}, #{pageSize}")
List<Emp> getPage(Integer start, Integer pageSize);

并且一般会返回一个数据总数的信息

@Select("select count(*) from tails.emp")
Long getCount();

然后将数据封装再一个自定义的pageBean对象中

@Override
public PageBean page(Integer page, Integer pageSize) {Integer start = (page - 1) * pageSize;PageBean pageBean = new PageBean();pageBean.setTotal(empMapper.getCount());pageBean.setRows(empMapper.getPage(start, pageSize));return pageBean;
}

PageBean.java

@Data
public class PageBean {private Long total;private List<Emp> rows;
}

EmpController.java

@GetMapping("/emps")
public Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "5") Integer pageSize,String name,Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);
}

通过插件(pagehelper)编写

pom.xml

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version>
</dependency>

EmpMapper.java

@Select("select * from tails.emp")    
List<Emp> list();

EmpService.java

@Override
public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {PageHelper.startPage(page, pageSize);List<Emp> empList = empMapper.list(name, gender, begin, end);Page<Emp> empPage = (Page<Emp>) empList;PageBean pageBean = new PageBean(empPage.getTotal(), empPage.getResult());return pageBean;
}

使用pagehelper插件时,要先调用PageHelper.startPage();将page,pageSize传入进去,然后直接查询全部数据即可完成分页,但是要将返回的数据强转为'Page'类型,通过page类型得到总数据数empPage.getTotal(),得到每一页的数据empPage.getResult()

知识回顾

关于注解

注解
@RequestParam(defaultValue = "1") 给查询参数设置默认值
@DateTimeFormat(pattern = "yyyy-MM-dd") 格式化时间
@PathVariable 获取路径参数
@RequestBody 获取请求方法的请求体

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908438.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

visual stdio 使用CMake

基础知识 工具>选项>CMake>常规 选中从不使用CMake预设重启 visual stdio,点击打开本地文件夹(F),打开CMakeList.txt根目录此时会在CMake根目录自动生成CMakeSettings.json文件,使用visual stdio文件打开CMakeSettings.json如果打开时,是json文件时,可以右键CMa…

mysql InnoDB的事务

一、事务的概念 一组数据库操作要么全部成功,要么全部失败,目的是为了保证数据的最终一致性 二、事务的四大特性(ACID)原子性(Actomicity):当前事务的操作要么成功,要么失败,原子性是由undo log日志来保证 一致性(Consistency):使用事务的最终目的,由业务代码正确…

如何使用 OpenAI Agents SDK 构建 MCP

1.概述 OpenAI Agents SDK 现已支持 MCP(模型上下文协议),这是 AI 互操作性的重大变革。这使开发人员能够高效地将 AI 模型连接到外部工具和数据源。本篇博客,笔者将指导使用 OpenAI Agents SDK 构建 MCP 服务器,以增强你的 AI 应用程序。 2.内容 2.1 什么是 MCP MCP 服务…

C语言打卡学习第11天(2025.3.30)(补发)

冒泡排序的一个学习。还了解了一个快速排序的“挖坑法”,能省变量位置,但挺难写的,挺有意思:把数组第一个元素放一个空作为一个标准值,第一个位置就空了出来,然后将第一个“暂时标准值”从最后一个数开始比较,后面小就放到第一个“坑”,然后“坑”又到后面了,再从前面…

C语言打卡学习第10天(2025.3.29)(补发)

指针和数组的学习,数组现在能做到基本掌握和简单运用,指针有些难,还是得练

FastAPI中的Pydantic密码验证机制与实现

title: FastAPI中的Pydantic密码验证机制与实现 date: 2025/03/31 00:04:51 updated: 2025/03/31 00:04:51 author: cmdragon excerpt: FastAPI 中通过 Pydantic 模型实现密码验证,采用分层机制确保高效与灵活扩展。验证流程包括基础类型检查、长度验证、复杂度验证和泄露检…

PicGo+Github图床配置

PicGo+Github图床配置 参考 PicGo指南 PicGo+Github图床配置配置 Github 图床 创建 Github 仓库登录 Github,新建一个公开(Public)或私有(Private)仓库 (我个人选择新建公开仓库) 用于存储图片,仓库名任意取,例如 image-host​,进入新建的仓库,点击 Create a codespac…

独立按键控制 LCD1602 显示不同的谚语

前言 今天我又学到了一句话 “好的开始是成功的一半” 英语就是 “Well Begun Is Half Done” 所以希望能够通过独立按键,来控制LCD1602显示不同的谚语 演示函数数组的使用 错误用法 void (*sayings)(void)[MAX_SAYING] = {attitude,well_begun};报错正确用法 void (*sayings[…

OpenEuler RISC-V 上跑bitcoin(实战版)

不久前刚在OpenEuler 24.09 RISC-V上部署了 bitcoin,不过还没跑起来,这次我打算在这个环境下面运行一些应用服务,体验一下 OERV 的开发感觉。编译出来的 bitcoin 主要有几个命令,bitcoin-cli、bitcoind、bitcoin-util、bitcoin-wallet、bitcoin-tx和test_bitcoin。bitcoind…

javawebDay3-Maven框架

1.添加依赖 eg<dependencies><dependency><groupId></groupId><artifactId></artifactId></dependency></dependencies>从外部导入jar包等无需手动添加依赖 2.集成度高,eclipse和intellIDEA都能使用,在不同的操作系统也可以使…

Five Hundred Miles

一百英里 是自由,是初出茅庐的憧憬。 二百英里 是快乐,是逃离故里的喜悦。 三百英里 是忧伤,是萦绕心间的挂念。 四百英里 是思恋,是莺歌燕舞的家乡。 五百英里 是乡愁,是一去不返的凄凉。