导读:本期聚焦于IT小魔仙创作的《Mybatis的XML映射文件怎么写?SQL语句配置完整教程》,敬请观看详情。Mybatis的XML映射文件到底该怎么写?本文从映射文件的基本结构讲起,详细介绍namespace配置、select、insert、update、delete四种SQL语句的编写方式,重点解析parameterType传参、resultMap结果映射、动态SQL标签等核心知识点,并配上可直接运行的代码示例。无论你是刚接触Mybatis的新手,还是想系统梳理映射文件写法的开发者,都能通过这篇教程快速掌握XML方式配置SQL语句的完整流程和常见避坑技巧。

Mybatis作为国内使用最广泛的持久层框架之一,其核心魅力就在于把SQL语句从Java代码中抽离出来,放到XML映射文件里统一管理。这样做的好处很直接:SQL改动不需要重新编译Java代码,SQL的可读性和维护性也大幅提升。不过不少刚上手的朋友在写第一个映射文件时就会卡住,不知道namespace该填什么、parameterType和resultType有什么区别、动态SQL的标签怎么嵌套。这篇文章就把XML映射文件的写法从头到尾捋一遍,配合完整代码示例,看完就能动手写。

Mybatis的XML映射文件怎么写?SQL语句配置完整教程

XML映射文件的基本结构

一个标准的Mybatis映射文件以<mapper>标签作为根节点, namespace属性是整个文件的灵魂,它通常绑定一个Dao接口的全限定名。Mybatis在运行时会根据这个namespace加上SQL的id,定位到具体要执行的SQL语句。假设你有一个接口com.demo.mapper.UserMapper,那么映射文件就要写成下面这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"&>
<mapper namespace="com.demo.mapper.UserMapper">

    <!-- SQL语句都写在这里 -->

</mapper></code>

需要注意的是,文件开头的DTD声明不能省,否则Mybatis解析标签时会报错。另外,映射文件的位置要与Mybatis全局配置文件中<mappers>节点的注册路径一致。如果项目把映射文件放在src\main\resources\mapper目录下,配置时就要写对应的资源路径,Windows开发环境下路径分隔符用反斜杠表示,例如mapper\UserMapper.xml。

namespace绑定接口之后,接口中每个方法对应映射文件里一条SQL语句的id。方法名和id必须完全一致,参数类型和返回类型也要匹配,这是初学者最容易出错的地方。方法名写成了getUserById而XML里id写成了getUserByID,启动时不会报错,调用时才会抛出绑定异常。

增删改查四种SQL语句的写法

查询语句用<select>标签,最关键的两个属性是parameterType和resultType。前者指定传入参数的类型,后者指定单条结果映射的类型。查询单个用户和查询用户列表的写法如下:

<select id="getUserById" parameterType="int" resultType="com.demo.entity.User">
    SELECT id, username, email, age
    FROM t_user
    WHERE id = #{id}
</select>

<select id="listUsers" resultType="com.demo.entity.User">
    SELECT id, username, email, age
    FROM t_user
    ORDER BY id DESC
</select>

这里的#{id}是预编译参数占位符,底层会转化为JDBC的PreparedStatement参数,能有效防止SQL注入。取参数时还有另一种写法${id},它是直接做字符串拼接的,一般只用于动态表名、排序字段这类不能预编译的场景,切记不要用它接收用户输入的查询条件。

插入语句用<insert>标签。如果数据库主键是自增的,可以配置useGeneratedKeys和keyProperty,插入完成后Mybatis会把生成的主键回填到实体对象中:

<insert id="addUser" parameterType="com.demo.entity.User"
        useGeneratedKeys="true" keyProperty="id">
    INSERT INTO t_user (username, email, age)
    VALUES (#{username}, #{email}, #{age})
</insert>

更新和删除分别用<update>和<delete>标签,写法与查询类似,只是不需要resultType。它们的返回值是受影响的行数,接口方法直接声明为int即可。删除操作建议养成用<where>条件限定主键的习惯,避免因为条件拼接失误导致全表更新或删除。

resultMap结果映射与动态SQL

当数据库字段名和实体类属性名不一致时,单靠resultType就不够了,这时候需要<resultMap>显式定义映射关系。比如数据库字段是user_name而实体属性是username:

<resultMap id="userResultMap" type="com.demo.entity.User">
    <id property="id" column="id"/>
    <result property="username" column="user_name"/>
    <result property="email" column="email"/>
    <result property="age" column="age"/>
</resultMap>

<select id="getUserList" resultMap="userResultMap">
    SELECT id, user_name, email, age FROM t_user
</select>

<id>标签标记主键字段有助于提升性能和唯一性判断,一对多、多对一关联映射也建立在resultMap之上,通过<association>和<collection>标签可以完成复杂对象关系的装配。

动态SQL是XML映射文件最实用的能力。常用的标签有<if>、<where>、<foreach>、<choose>等。以多条件查询为例,条件个数不确定时,<if>配合<where>标签可以自动处理掉多余的AND:

<select id="searchUsers" parameterType="com.demo.dto.UserQuery"
        resultType="com.demo.entity.User">
    SELECT id, username, email, age FROM t_user
    <where>
        <if test="username != null and username != ''">
            AND username LIKE CONCAT('%', #{username}, '%')
        </if>
        <if test="minAge != null">
            AND age >= #{minAge}
        </if>
        <if test="email != null and email != ''">
            AND email = #{email}
        </if>
    </where>
</select>

<foreach>标签专门用于遍历集合参数,批量删除的典型写法是用它拼接IN条件。test属性中的判断直接写OGNL表达式,字符串判空用!= null and != ''双条件,只判null会漏掉空字符串的情况。把上面这些内容组合起来,就足以应付日常开发中绝大多数映射文件的编写需求了,遇到复杂SQL时再逐步深入关联映射和SQL片段复用即可。

MybatisXML映射文件SQL配置修改时间:2026-09-09 23:00:45

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0909/53648.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。