MyBatis XML配置分为mybatis-config.xml(须严格按properties→settings→typeAliases→environments→mappers顺序)和Mapper XML(以namespace绑定接口,含select/insert/update/delete/resultMap等核心标签)。

MyBatis 的 XML 配置分两类:全局配置文件 mybatis-config.xml 和 SQL 映射文件(如 UserMapper.xml)。前者管连接、缓存、别名等基础设置;后者专注 SQL 编写与结果映射,两者配合才能让 DAO 接口正常工作。
mybatis-config.xml 必须遵守的结构顺序
这个文件是 MyBatis 启动时加载的根配置,所有标签必须严格按以下顺序书写,否则会解析失败:
-
properties:外部属性引入(如数据库配置),支持
resource(类路径)或url(绝对路径),也支持内联<property> -
settings:全局开关控制,比如
lazyLoadingEnabled="true"开启延迟加载,cacheEnabled="true"启用二级缓存 -
typeAliases:简化实体类引用,可用
<typeAlias type="com.example.User" alias="user"/>,更常用的是<package name="com.example.entity"/>批量注册 -
environments:定义数据源环境,
default="dev"指定默认激活环境,每个<environment id="dev">内需包含<transactionManager type="JDBC"/>和<dataSource type="POOLED"> -
mappers:注册映射文件,支持
<mapper resource="com/example/mapper/UserMapper.xml"/>或<package name="com.example.mapper"/>(要求 XML 与接口同包同名)
Mapper XML 文件的核心标签
每个映射文件以 <mapper namespace="com.example.mapper.UserMapper"> 开头,namespace 必须和对应接口全限定名一致,这是方法绑定的基础。
-
<select>:执行查询,
id对应接口方法名,resultType用于字段名与属性名完全匹配的简单映射;若不一致或需嵌套对象,改用resultMap引用外部定义 -
<insert>:插入语句,设
useGeneratedKeys="true" keyProperty="id"可自动回填数据库自增主键到参数对象 -
<update> 和 <delete>:结构类似,只需写 SQL 和匹配
id,无返回值要求 -
<sql>:定义可复用的 SQL 片段,用
<include refid="xxx"/>引入,避免重复写WHERE或字段列表 -
<resultMap>:复杂结果映射核心,支持
<id>(主键)、<result>(普通字段)、<association>(一对一)、<collection>(一对多)
常见易错点和实用技巧
实际配置中几个关键细节容易被忽略,但直接影响运行效果:
- XML 文件开头的 DTD 声明不能省略或写错,例如:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -
properties中定义的变量,可在environments的<dataSource>里用${username}引用;若内外同名,外部文件优先 - 使用
<package>批量注册 mapper 时,确保 XML 文件放在 classpath 对应路径下,且文件名与接口名一致(如UserMapper.java→UserMapper.xml) - 动态 SQL 标签(
<if>、<choose>、<foreach>)只能出现在<select>/<update>等语句内部,不能直接放在<mapper>下
一个最小可用的 UserMapper.xml 示例
结合实际场景更易理解:
<?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.example.mapper.UserMapper">
<resultMap id="userMap" type="com.example.entity.User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
</resultMap>
<select id="getUserById" parameterType="long" resultMap="userMap">
SELECT user_id, user_name, age FROM user WHERE user_id = #{id}
</select>
</mapper>










