iBatis是早期流行的持久层框架,后来更名为MyBatis,sql-map.xml是其核心配置文件,用于定义SQL语句、参数映射和结果集映射,实现SQL与业务代码的解耦。开发者通过编写该文件,可以灵活管理各类数据库操作逻辑。

sql-map.xml的基础结构
一个标准的sql-map.xml文件需要遵循iBatis的DTD约束,基础结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<!-- 类型别名定义 -->
<typeAlias alias="User" type="com.example.pojo.User"/>
<!-- SQL语句定义区域 -->
</sqlMap>
其中namespace用于区分不同模块的SQL配置,避免id冲突;typeAlias可以给全路径类名定义短别名,简化后续配置。
常用标签说明
1. 结果集映射标签resultMap
当数据库字段名和Java实体类属性名不一致时,需要使用resultMap定义映射规则:
<resultMap id="userResultMap" class="User">
<result property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="userAge" column="user_age"/>
<result property="createTime" column="create_time"/>
</resultMap>
property对应Java实体类的属性名,column对应数据库表的字段名。
2. 查询语句标签select
查询标签用于定义查询类SQL,支持参数传入和结果集映射:
<select id="queryUserById" parameterClass="int" resultMap="userResultMap">
SELECT user_id, user_name, user_age, create_time
FROM t_user
WHERE user_id = #value#
</select>
parameterClass指定传入参数的类型,resultMap指定结果集映射规则,#value#是基本类型参数的占位符。
3. 插入语句标签insert
插入标签用于定义新增数据的SQL,支持返回自增主键:
<insert id="insertUser" parameterClass="User">
INSERT INTO t_user (user_name, user_age, create_time)
VALUES (#userName#, #userAge#, #createTime#)
<selectKey resultClass="int" keyProperty="userId">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
selectKey用于获取自增主键,keyProperty指定主键对应的Java实体类属性名。
4. 更新语句标签update
更新标签用于定义修改数据的SQL:
<update id="updateUser" parameterClass="User">
UPDATE t_user
SET user_name = #userName#,
user_age = #userAge#
WHERE user_id = #userId#
</update>
5. 删除语句标签delete
删除标签用于定义删除数据的SQL:
<delete id="deleteUserById" parameterClass="int">
DELETE FROM t_user
WHERE user_id = #value#
</delete>
完整示例
下面是一个包含增删改查完整配置的sql-map.xml示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="User" type="com.example.pojo.User"/>
<resultMap id="userResultMap" class="User">
<result property="userId" column="user_id"/>
<result property="userName" column="user_name"/>
<result property="userAge" column="user_age"/>
<result property="createTime" column="create_time"/>
</resultMap>
<select id="queryUserById" parameterClass="int" resultMap="userResultMap">
SELECT user_id, user_name, user_age, create_time
FROM t_user
WHERE user_id = #value#
</select>
<select id="queryAllUsers" resultMap="userResultMap">
SELECT user_id, user_name, user_age, create_time
FROM t_user
</select>
<insert id="insertUser" parameterClass="User">
INSERT INTO t_user (user_name, user_age, create_time)
VALUES (#userName#, #userAge#, #createTime#)
<selectKey resultClass="int" keyProperty="userId">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
<update id="updateUser" parameterClass="User">
UPDATE t_user
SET user_name = #userName#,
user_age = #userAge#
WHERE user_id = #userId#
</update>
<delete id="deleteUserById" parameterClass="int">
DELETE FROM t_user
WHERE user_id = #value#
</delete>
</sqlMap>
注意事项
- SQL语句中的参数占位符如果是基本类型用
#value#,如果是对象类型用#属性名# - 如果数据库字段和实体类属性名一致,可以直接使用
resultClass指定返回类型,不需要定义resultMap - sql-map.xml文件需要配置在iBatis的主配置文件中才能被框架加载识别
- SQL语句中的特殊字符需要进行转义,比如小于号要写成
<,大于号写成>
iBatissql-map.xmlMyBatisSQL映射修改时间:2026-07-14 05:03:27