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

安全

相关推荐
QT 小鲜肉5 分钟前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
SpiderPex39 分钟前
论MyBatis和JPA权威性
java·mybatis
QT 小鲜肉3 小时前
【数据结构与算法基础】05. 栈详解(C++ 实战)
开发语言·数据结构·c++·笔记·学习·算法·学习方法
A9better3 小时前
嵌入式开发学习日志40——stm32之I2C协议层
stm32·单片机·嵌入式硬件·学习
ha20428941944 小时前
Linux操作系统学习之---线程控制
java·linux·学习
Laplaces Demon5 小时前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
青衫码上行6 小时前
【从0开始学习Java | 第22篇】反射
java·开发语言·学习
hmbbcsm6 小时前
python学习之路(四)
学习
Greedy Alg6 小时前
Socket编程学习记录
网络·websocket·学习
知识分享小能手6 小时前
uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
前端·javascript·windows·学习·微信小程序·小程序·uni-app