一、XML映射文件进阶标签
1. 核心辅助标签
标签 | 作用 | 示例 |
---|---|---|
<resultMap> |
自定义结果集映射规则 | <resultMap id="userMap" type="User"> <id property="id" column="user_id"/> |
<sql> |
定义可重用的SQL片段 | <sql id="baseColumn">id,name,age</sql> |
<include> |
引用SQL片段 | SELECT <include refid="baseColumn"/> FROM users |
<selectKey> |
获取非自增主键值 | 支持order="BEFORE/AFTER" 获取序列值 |
<parameterMap> |
参数映射(已废弃,推荐内联参数) | — |
2. 动态SQL九大标签
<!-- 条件分支示例 -->
<select id="findUser">
SELECT * FROM users
<where>
<if test="name != null">
AND name LIKE CONCAT('%',#{name},'%')
</if>
<choose>
<when test="age != null">AND age = #{age}</when>
<otherwise>AND status = 1</otherwise>
</choose>
<foreach item="id" collection="ids" open="AND id IN (" separator="," close=")">
#{id}
</foreach>
</where>
</select>
作用范围:
<if>
,<choose>/<when>/<otherwise>
,<trim>
,<where>
,<set>
,<foreach>
,<bind>
二、XML文件ID重复问题
命名空间(namespace)是关键:
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="selectById">...</select>
</mapper>
<!-- AdminMapper.xml -->
<mapper namespace="com.example.AdminMapper">
<select id="selectById">...</select> <!-- 允许相同id -->
</mapper>
- 无namespace:ID直接作为Map键值,重复导致覆盖
- 有namespace:
命名空间+ID
构成唯一键(如com.example.UserMapper.selectById
)
三、半自动ORM vs 全自动ORM
特性 | MyBatis (半自动) | Hibernate (全自动) |
---|---|---|
SQL控制 | 需手动编写SQL | 自动生成HQL |
关联查询 | 需配置<association> /<collection> |
对象导航自动加载关联 |
性能优化 | 精准控制SQL,避免N+1问题 | 需解决N+1查询问题 |
灵活性 | 支持复杂SQL和存储过程 | 对复杂SQL支持较弱 |
核心区别:MyBatis将对象映射自动化,但SQL生成需手动控制 |