当前位置: 首页 > article >正文

Mybatis 学习 之 XML 手册

目录

  • 单次执行
    • 单次新增
    • 单次更新
    • 单次删除
  • 批量执行
    • 批量新增
    • 批量更新
      • for 循环执行更新
      • for 循环生成多条 sql,一次执行
    • 批量删除
  • 参数传递
    • 预处理方式 (`OGNL表达式 #{}`)
      • 数据类型转换
    • 直接替换 `(EL表达式 ${})`
  • 安全

单次执行

单次新增

<insert id="insert" parameterType="java.util.List">  
    INSERT INTO USERS 
    (
    	NAME, 
    	EMAIL, 
    	AGE
    )  
    VALUES  
	(
		#{item.name}, 
		#{item.email},
		#{item.age}
	)  
</insert>

单次更新

<update id="update"  parameterType="java.util.List">  
	UPDATE USER
	<set>
	    NAME = #{item.name},
	    EMAIL = #{item.email},
	    AGE = #{item.age}
	</set>
	where ID = ${item.id}
</update>

单次删除

<delete id="delete" parameterType="java.util.List">  
    DELETE FROM 
    	USERS  
    WHERE 
    	ID = #{id}
</delete>

批量执行

MyBatis 的设计初衷是每个标签对应一个 SQL 语句,也就是不支持单个标签多条 SQL 语句的执行。

批量新增

<insert id="insertBatch" parameterType="java.util.List">  
    INSERT INTO USERS 
    (
    	NAME, 
    	EMAIL, 
    	AGE
    )  
    VALUES  
    <foreach collection="list" item="item" index="index" separator=",">  
	(
		#{item.name}, 
		#{item.email},
		#{item.age}
	)  
    </foreach>  
</insert>

批量更新

for 循环执行更新

for 循环生成多条 sql,一次执行

如需要在连接 MySQLURL 上加 &allowMultiQueries=true

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" separator=";">
        UPDATE USER
        <set>
            NAME = #{item.name},
            EMAIL = #{item.email},
            AGE = #{item.age}
        </set>
        where ID = ${item.id}
    </foreach>      
</update>

批量删除

<delete id="deleteBatch" parameterType="java.util.List">  
    DELETE FROM USERS  
    WHERE ID IN  
    <foreach collection="list" item="item" open="(" separator="," close=")">  
        #{item}  
    </foreach>  
</delete>

参数传递

  • XML 中逻辑判断 (<if> 等标签),不同的 Java 类型不同的判断规则
  • 入参类型应提前处理为与数据库中相匹配的类型,SQL 中处理类型问题不仅麻烦且可能存在版本问题

预处理方式 (OGNL表达式 #{})

  • 支持防 SQL 注入
  • 传入的参数自动数据类型转换
  • 有预处理,不能用于传递表名、列名 等

数据类型转换

Java 类型XML 代码示例
Char<if test="req.parameter != null and req.parameter == 'A'">
Int<if test="req.parameter != null and req.parameter == 18">
Boolean<if test="req.parameter != null and req.parameter'">
String<if test="req.parameter != null and req.parameter != ''">
List<if test="req.parameter != null and req.parameter.size() > 0">
Array<if test="req.parameter != null and req.parameter.length > 0">
Map<if test="req.parameter != null and !req.parameter.isEmpty()">
Date<if test="req.parameter != null">
LocalDateTime<if test="req.parameter != null">

直接替换 (EL表达式 ${})

  • 有 SQL 注入风险
  • 传入的参数不支持自动数据类型转换
  • 可用于动态构建 SQL,用于传递表名、列名、排序字段名 等

安全


http://www.kler.cn/a/420931.html

相关文章:

  • STM32 PWM波形详细图解
  • 微服务搭建----springboot接入Nacos2.x
  • 【MySql】navicat连接报2013错误
  • 使用 Pytorch 构建 Vanilla GAN
  • flink学习(13)—— 重试机制和维表join
  • @antv/x6 再vue中 ,自定义图形,画流程图、数据建模、er图等图形
  • debian ubuntu armbian部署asp.net core 项目 开机自启动
  • 贴片式内存卡 ​SD NAND​
  • 【数据结构】队列实现剖析:掌握队列的底层实现
  • 零基础快速掌握——【c语言基础】数组的相关概念及操作
  • 电子应用设计方案-37:智能鼠标系统方案设计
  • re正则通配表达式的详尽/简洁,从来不是一对悖论
  • 二叉树的概念及其在Java中的实现
  • 【第 1 章 初识 C 语言】1.6 C 语言标准:C89/90、C99、C11、C17、C23
  • Java中如何停止一个正在运行的线程
  • Vue 90 ,Element 13 ,Vue + Element UI 中 el-switch 使用小细节解析,避免入坑(获取后端的数据类型自动转变)
  • Python+Requests接口自动化测试框架:多线程-异步执行
  • Python 爬虫实战基于 Class 的天气查询与反爬虫练习
  • ArcGIS求取多个点距离线要素的最近距离以及距离倒数
  • 数据结构基础之《(10)—快速排序》
  • RoBERTa- 稳健优化的 BERT 预训练模型详解
  • AI - 谈谈RAG中的查询分析(2)
  • 《封装、继承与多态》问题一:封装只有类能做吗?结构体如何封装?名空间、文件能实现封装吗?还有没有其他方式?
  • Vue.js 中集成 Socket.IO 实现实时聊天功能
  • Microi 吾码:后端开发的创新引擎与代码艺术
  • Android Studio安装ADB Wi-Fi插件使用WIFI连接终端设备调试程序