在 MyBatis 的 Mapper.xml
文件中,statement
标签(如 <select>
、<insert>
等)包含多个关键属性,用于定义 SQL 语句的行为和映射规则。以下是核心属性及其含义:
🔍 一、基础属性
-
id
- 作用:当前命名空间下 SQL 语句的唯一标识,必须与对应 Mapper 接口的方法名一致。
- 示例:
<select id="getUserById" ...>
对应接口方法User getUserById(int id)
。
-
parameterType
- 作用:指定输入参数的类型(如
java.lang.Integer
或 POJO 全限定名),可省略(MyBatis 会自动推断)。 - 注意:旧版本支持
parameterMap
,但已不推荐使用。
- 作用:指定输入参数的类型(如
-
resultType
- 作用:将查询结果映射为 Java 对象类型(需列名与属性名一致)。
- 示例:
resultType="com.example.User"
表示结果映射为User
对象。
-
resultMap
- 作用:通过自定义映射规则处理复杂结果集(如字段名与属性名不一致或嵌套对象)。
- 与
resultType
二选一,优先使用resultMap
应对复杂场景。
⚙️ 二、高级控制属性
-
statementType
- 取值:
STATEMENT
:直接执行 SQL,无预编译(易受 SQL 注入风险)。PREPARED
(默认):预编译 SQL,参数占位符为#{}
。CALLABLE
:调用存储过程。
- 示例:
<select statementType="CALLABLE">
用于执行存储过程。
- 取值:
-
useGeneratedKeys
- 作用:启用 JDBC 主键回写(如 MySQL 自增 ID),需配合
keyProperty
指定接收属性。 - 示例:
<insert useGeneratedKeys="true" keyProperty="id">
。
- 作用:启用 JDBC 主键回写(如 MySQL 自增 ID),需配合
-
timeout
- 作用:设置 SQL 执行超时时间(单位:秒),超时抛出异常。
-
fetchSize
- 作用:控制数据库每次返回的最大记录数(优化大数据量查询性能)。
🔄 三、缓存与结果集控制
-
flushCache
- 作用:执行后是否清空一级/二级缓存(默认
false
,查询不刷新)。
- 作用:执行后是否清空一级/二级缓存(默认
-
resultSetType
- 取值:
FORWARD_ONLY
(默认):单向遍历结果集。SCROLL_SENSITIVE
:可滚动且敏感(实时反映数据库变化)。SCROLL_INSENSITIVE
:可滚动但不敏感(快照模式)。
- 取值:
-
useCache
- 作用:是否将结果存入二级缓存(默认
true
)。
- 作用:是否将结果存入二级缓存(默认
📌 四、动态 SQL 相关属性
-
databaseId
- 作用:指定数据库厂商(如
mysql
、oracle
),用于多数据库适配。
- 作用:指定数据库厂商(如
-
lang
- 作用:指定动态 SQL 语言驱动(如自定义脚本语言)。
总结
MyBatis 的 statement
属性通过灵活配置平衡了 SQL 控制力与开发效率,核心在于:
- 基础映射:
id
、resultType
/resultMap
实现对象关系映射。 - 性能优化:
timeout
、fetchSize
等提升执行效率。 - 安全与扩展:
statementType
和动态 SQL 支持复杂场景。