Mybatis 学习 之 XML 手册

目录

单次执行

单次新增

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

单次更新

xml 复制代码
<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>

单次删除

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

批量执行

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

批量新增

xml 复制代码
<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

xml 复制代码
<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>

批量删除

xml 复制代码
<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,用于传递表名、列名、排序字段名 等

安全

相关推荐
白慕慕4 小时前
文档网站大全
学习
一轮弯弯的明月6 小时前
Python基础-速通秘籍(下)
开发语言·笔记·python·学习
charlie1145141917 小时前
2026年正点原子开发板移植方案——从0开始的Rootfs之路(3)inittab 与 init 系统:Linux 启动的“第一号进程“全解析
linux·驱动开发·学习·嵌入式开发·嵌入式linux
wsx_iot8 小时前
TDengine学习
数据库·学习·tdengine
AI成长日志9 小时前
【笔面试算法学习专栏】二分查找专题:力扣hot100经典题目深度解析
学习·算法·面试
独断万古他化10 小时前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
m0_5649149210 小时前
AI学习课堂网站丨OPENMAIC丨清华团队开源项目
学习
开源盛世!!10 小时前
3.26-3.27学习笔记
笔记·学习
我的xiaodoujiao12 小时前
API 接口自动化测试详细图文教程学习系列7--相关Python基础知识6
python·学习·测试工具·pytest
山川行12 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio