MyBatis XML映射配置的作用
MyBatis的XML映射文件(通常为Mapper.xml
)用于定义SQL语句、结果映射、缓存规则等,实现Java方法与数据库操作的解耦。核心功能包括:
- SQL定义:编写动态SQL语句,支持条件分支、循环等逻辑。
- 结果映射:将查询结果自动映射为Java对象(POJO)。
- 参数绑定:将Java方法参数传递到SQL中。
- 二级缓存:配置缓存策略提升性能。
XML映射配置代码详解
1. 基础结构示例
<?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">
<!-- 查询用户 -->
<select id="selectUserById" resultType="com.example.entity.User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 插入用户 -->
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>
</mapper>
2. 核心标签说明
<select>
/<insert>
/<update>
/<delete>
:定义CRUD操作,id
对应Java方法名,resultType
指定返回类型。#{param}
:参数占位符,防止SQL注入。- 动态SQL:使用
<if>
,<foreach>
等标签实现条件查询。
<select id="findUsers" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND name = #{name}</if>
<if test="email != null">AND email = #{email}</if>
</where>
</select>
3. 结果映射(ResultMap)
处理复杂对象关系(如一对一、一对多):
<resultMap id="userResultMap" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<collection property="orders" ofType="Order">
<result property="orderId" column="order_id"/>
</collection>
</resultMap>
面试常见问题与解答
问题1:MyBatis中#{}
和${}
的区别?
#{}
:预编译处理,参数以占位符?
形式传入,防止SQL注入。${}
:字符串拼接,直接替换到SQL中,可能引发注入风险,通常用于动态表名、列名。
问题2:如何实现分页查询?
- XML配置:结合
limit
语句或分页插件(如PageHelper)。
<select id="selectByPage" resultType="User">
SELECT * FROM user LIMIT #{offset}, #{pageSize}
</select>
问题3:ResultMap的作用?
解决数据库字段名与Java属性名不一致问题,支持嵌套对象映射(如关联查询)。
问题4:MyBatis的一级/二级缓存?
- 一级缓存:SqlSession级别,默认开启。
- 二级缓存:Mapper命名空间级别,需在XML中配置
<cache/>
,跨SqlSession共享。
问题5:动态SQL的常用标签?
<if>
:条件判断。<foreach>
:遍历集合(如IN
查询)。<choose>/<when>/<otherwise>
:多分支选择。
最佳实践建议
- 复杂查询优先使用
ResultMap
而非resultType
。 - 避免过度使用
${}
,防止安全风险。 - 分页场景推荐集成PageHelper等插件简化逻辑。