详细分析 MyBatis 参数映射与使用(附Demo)

server/2024/11/28 13:55:20/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 拓展

前言

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. Java项目】实战CRUD的功能整理(持续更新)

原先写过xml的动态Sql,基本知识推荐阅读:详细分析Mybatis中的动态Sql(附Demo)

以下是在实战中遇到某个Bug,对应进行科普了解

1. 基本知识

  • 参数传递方式
    对象属性:使用对象作为参数,通过对象的属性进行查询
    简单属性:直接将参数作为方法参数,使用时引用参数名

  • 使用场景
    对象属性:适合多个相关属性传递的情况
    简单属性:适合少数参数的情况,特别是不相关联的参数

传递方式描述示例代码
对象属性使用对象作为参数#{deviceChargeHist.deviceName}
简单属性直接传递参数#{startTime}
使用场景多个相关属性DeviceChargeHistVO
使用场景少数不相关的参数Date startTime, Date endTime

2. Demo

基本的Demo示例如下:

对象属性查询示例

public List<DeviceChargeHistVO> selectDeviceChargeHistPage(IPage page, DeviceChargeHistVO deviceChargeHist) {return baseMapper.selectDeviceChargeHistPage(page, deviceChargeHist);
}
xml"><select id="selectDeviceChargeHistPage" resultMap="deviceChargeHistResultMap"><where><if test="deviceChargeHist.deviceName != null and deviceChargeHist.deviceName != ''">DEVICE_NAME = #{deviceChargeHist.deviceName}</if><if test="deviceChargeHist.startTime != null">and CREATE_TIME &gt; #{deviceChargeHist.startTime}</if></where>
</select>

简单属性查询示例

public List<DeviceChargeHist> selectAllDeviceChargeHistPage(Date startTime, Date endTime) {return baseMapper.selectAllDeviceChargeHistPage(startTime, endTime);
}
xml"><select id="selectAllDeviceChargeHistPage" resultMap="deviceChargeHistResultMap"><where><if test="startTime != null">and CREATE_TIME &gt; #{startTime}</if></where>
</select>

以上很常用,但是在实战中遇到这种场景需要变通一下

3. 拓展

对应的类定义如下:

@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DeviceChargeHistVO对象", description = "设备运行历史")
public class DeviceChargeHistVO extends DeviceChargeHist {
@Data
@TableName("E_DEVICE_CHARGE_HIST")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "DeviceChargeHist对象", description = "设备充电历史")
public class DeviceChargeHist extends BaseEntity {

如果在接口中使用如下:

  • 使用DeviceChargeHist作为返回值,那么xml查询字段如果有来自DeviceChargeHistVO 的类,可能不可跨级别,不可直接使用DeviceChargeHistVO的各个属性
  • 如果使用DeviceChargeHistVO作为返回值,那么xml查询字段可以使用DeviceChargeHistVO的所有字段,因为他继承了实体类

下面的方式都是配合使用:

方案一:

public interface DeviceChargeHistMapper extends BaseMapper<DeviceChargeHist> {List<DeviceChargeHist> selectAllDeviceChargeHistPage(DeviceChargeHistVO deviceChargeHist);}

其中xml如下:

xml"><select id="selectAllDeviceChargeHistPage" resultMap="deviceChargeHistResultMap">select DEVICE_ID, DEVICE_NAME, STATUS, BEGIN_CAPACITY, END_CAPACITY, BEGIN_MILEAGE, END_MILEAGE, CHARGE_CAPACITY, BATTERY_CAPACITY, CHARGE_START_TIME, CHARGE_END_TIME, LAT, LON, CREATE_TIME, CREATE_USER, UPDATE_TIME, UPDATE_USER from E_DEVICE_CHARGE_HIST<where><if test="deviceName != null and deviceName != ''">DEVICE_NAME = #{deviceName}</if><if test="startTime != null">and CREATE_TIME &gt; #{startTime}</if><if test="endTime != null" >and CREATE_TIME &lt;= #{endTime}</if></where>order by CREATE_TIME DESC
</select>

方案二:

public interface DeviceChargeHistMapper extends BaseMapper<DeviceChargeHist> {// 修改返回值List<DeviceChargeHistVO> selectAllDeviceChargeHistPage(DeviceChargeHistVO deviceChargeHist);}

其中xml如下:

xml"><select id="selectAllDeviceChargeHistPage" resultMap="deviceChargeHistResultMap">select DEVICE_ID, DEVICE_NAME, STATUS, BEGIN_CAPACITY, END_CAPACITY, BEGIN_MILEAGE, END_MILEAGE, CHARGE_CAPACITY, BATTERY_CAPACITY, CHARGE_START_TIME, CHARGE_END_TIME, LAT, LON, CREATE_TIME, CREATE_USER, UPDATE_TIME, UPDATE_USER from E_DEVICE_CHARGE_HIST<where><if test="deviceChargeHist.deviceName != null and deviceChargeHist.deviceName != ''">DEVICE_NAME = #{deviceChargeHist.deviceName}</if><if test="deviceChargeHist.startTime != null">and CREATE_TIME &gt; #{deviceChargeHist.startTime}</if><if test="deviceChargeHist.endTime != null" >and CREATE_TIME &lt;= #{deviceChargeHist.endTime}</if></where>order by CREATE_TIME DESC
</select>

注意甄别这种用法!


http://www.ppmy.cn/server/137705.html

相关文章

[MySQL]介绍与基础指令

介绍 现在常见的数据库如:Oracle、DB 2、SQL Server、MySQL等都是关系型数据库&#xff0c;使用二维表格来存储数据。 关系结构型数据库系统 管理员 仓库 MySQL的数据存储目录为data&#xff0c;在data下的每个目录都代表一个数据库。 MySQL的安装目录下&#xff1a; bin目录…

【51单片机】矩阵键盘

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 矩阵键盘 矩阵键盘 矩阵键盘位于开发板的右下角 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键…

excel IF函数用法

IF函数以其灵活多变、易于上手的特点&#xff0c;成为了众多Excel用户不可或缺的好帮手&#xff0c;无论是简单的条件判断&#xff0c;还是复杂的逻辑分析&#xff0c;IF函数都能游刃有余地应对。 本文将深入探讨IF函数的10种精妙用法&#xff0c;从基础到进阶&#xff0c;相信…

JS | CommonJS、AMD、CMD、ES6-Module、UMD五种JS模块化规范

目录 前言 一、CommonJS 模块化规范 二、ES6 模块化规范 三、AMD 模块化规范 四、CMD 模块化规范 五、UMD模块化规范 前言 这三个规范都是为Js模块化加载而生的&#xff0c;使模块能够按需加载&#xff0c;使系统同庞杂的代码得到组织和管理。模块化的管理代码使多人开发…

SYN590RH

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围&#xff0c;低功耗&#xff0c;高性能&#xff0c;无需外置AGC电容&#xff0c;灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

大数据之文件服务器方案

大数据文件服务器方案 一&#xff0c;文件服务器常用框架 二&#xff0c;文件服务器常用框架的实现技术 文件服务器常用框架 文件服务器是一种专门用于存储、管理和共享文件的服务器&#xff0c;其常用框架的实现技术涉及多个方面&#xff0c;以下是一些主要的实现技术及其详…

第八章 利用CSS制作导航菜单课后习题

1.利用CSS技术&#xff0c;结合链接和列表&#xff0c;设计并实现“山水之间”页面。 参考代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>山水之间</title><style>.all{width:900px;}.top…

Python-GUI-概览

1 需求 2 接口 3 示例 Tkinter 介绍&#xff1a;Tkinter 是 Python 的标准 GUI&#xff08;Graphical User Interface&#xff09;库&#xff0c;它提供了基本的组件来构建简单的图形用户界面。由于它是标准库&#xff0c;所以无需额外安装&#xff0c;使用起来很方便。组件和…