MyBatis的 `Mapper.xml` 文件配置详解(含完整代码示例)

MyBatis的 Mapper.xml 文件配置详解(含完整代码示例)

1. 核心配置标签及示例

1.1 根标签

所有配置必须包裹在 标签中,并指定命名空间(通常为 Mapper 接口的全限定名)。

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

1.2 缓存配置

启用当前命名空间的二级缓存。

type="org.mybatis.caches.ehcache.EhcacheCache"

eviction="LRU"

flushInterval="60000"

size="1024"

readOnly="false"/>

1.3 结果映射

定义结果集到对象的映射关系,处理复杂字段(如关联查询)。

select="com.example.mapper.OrderMapper.selectOrdersByUserId"/>

1.4 基础 SQL 语句标签

INSERT INTO user (name, age) VALUES (#{name}, #{age})

SELECT LAST_INSERT_ID()

UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}

DELETE FROM user WHERE id = #{id}

1.5 动态 SQL 标签

1.6 代码片段复用

id, name, age, create_time

1.7 动态 SQL 生成

通过 Java 类生成 SQL 语句:

// 动态 SQL 生成器类(DynamicSqlProvider.java)

public class DynamicSqlProvider {

public String selectUsersByCondition(Map params) {

String sql = "SELECT * FROM user WHERE 1=1";

if (params.containsKey("name")) {

sql += " AND name = #{name}";

}

return sql;

}

}

1.8 主键生成

INSERT INTO user (name, age) VALUES (#{name}, #{age})

SELECT LAST_INSERT_ID()

1.9 结果映射高级用法

select="com.example.mapper.OrderMapper.selectOrdersByUserId"/>

1.10 标签

在 SQL 中动态绑定变量:

1.11

resultType="User"

parameterType="long"

flushCache="true"

timeout="10000"

statementType="PREPARED"

resultOrdered="true"

useCache="false">

SELECT * FROM user WHERE id = #{id}

2. 完整 Mapper.xml 示例

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

id, name, age, create_time

INSERT INTO user (name, age) VALUES (#{name}, #{age})

SELECT LAST_INSERT_ID()

UPDATE user

name = #{name},

age = #{age},

WHERE id = #{id}

DELETE FROM user WHERE id = #{id}

select="com.example.mapper.OrderMapper.selectOrdersByUserId"/>

3. 标签分类及作用表格

标签作用示例关键属性定义 Mapper 的根标签,指定命名空间。namespace(必填)启用当前命名空间的二级缓存。type, eviction, flushInterval, size, readOnly定义结果集到对象的映射关系。...id, type, extends映射主键字段。column, property映射普通字段。column, property映射一对一关联对象。...property, javaType, columnPrefix映射一对多关联对象。property, ofType, column, select...id, resultType, resultMap, parameterType, flushCache, useCache定义插入语句。...id, parameterType, useGeneratedKeys, keyProperty定义更新语句。...id, parameterType, flushCache, timeout定义删除语句。...id, parameterType, flushCache定义可复用的 SQL 片段。id, name, ageid引用 定义的片段。refid条件判断。AND name = #{name}test, , 多条件分支。 ... ... test自动处理 WHERE 子句前缀。 AND name = #{name} 自动处理 UPDATE 的 SET 子句。 name = #{name}, 遍历集合参数(如 IN 子句)。item, collection, open, separator, close在 SQL 中动态绑定变量。name, value自定义主键生成逻辑。...keyProperty, resultType, order通过 Java 类动态生成 SQL。factory, method, paramETER

4. 标签属性详解

4.1 定义查询语句。id, resultType, resultMap, parameterType定义插入语句。...id, useGeneratedKeys, keyProperty定义更新语句。...id, timeout, flushCache定义删除语句。...id, flushCache定义可复用的 SQL 片段。...id引用 定义的片段。refid条件判断。...test自动处理 WHERE 子句的 AND/OR 前缀。 ... 自动处理 UPDATE 的 SET 子句的逗号。 ... 遍历集合参数(如 IN 子句)。collection, item, open, separator, close动态绑定变量。name, value自定义主键生成逻辑。keyProperty, resultType, order通过 Java 类动态生成 SQL。factory, method, paramETER

7. 关键配置说明

7.1 的高级用法

嵌套结果(嵌套查询):

javaType="Department"

select="com.example.mapper.DepartmentMapper.selectById"/>

延迟加载:

column="dept_id"

select="com.example.mapper.DepartmentMapper.selectById"

fetchType="lazy"/>

7.2 动态 SQL 组合示例

8. 常见问题与最佳实践

Q:如何处理一对多关联?

同步查询:在 SQL 中直接 JOIN 并使用 映射。延迟加载:通过 的 select 属性引用其他 Mapper 的查询方法。

Q:如何避免 SQL 注入?

使用 #{} 占位符,MyBatis 会自动进行预编译。对动态条件使用 标签。

Q:如何复用 SQL 片段?

通过 定义片段,用 引用。

9. 总结

核心标签: