MyBatis实战教程:SQL映射与动态查询技巧
MyBatis实战教程:SQL映射与动态查询技巧
SQL映射基础
MyBatis通过XML或注解方式定义SQL映射。XML文件中使用<mapper>
标签声明命名空间,内部通过<select>
、<insert>
、<update>
、<delete>
定义CRUD操作。例如:
<mapper namespace="com.example.UserMapper"><select id="selectUserById" resultType="User">SELECT * FROM users WHERE id = #{id}</select>
</mapper>
注解方式直接在接口方法上使用@Select
、@Insert
等注解:
public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectUserById(int id);
}
动态SQL实现
MyBatis提供<if>
、<choose>
、<foreach>
等标签实现动态查询。
条件判断:
<select id="findUsers" resultType="User">SELECT * FROM users<where><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></where>
</select>
循环处理:
<delete id="deleteUsers">DELETE FROM users WHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach>
</delete>
高级映射技巧
结果集映射:使用<resultMap>
处理复杂对象关系。例如一对多映射:
<resultMap id="userWithOrders" type="User"><id property="id" column="user_id"/><collection property="orders" ofType="Order"><result property="orderId" column="order_id"/></collection>
</resultMap>
分页插件:集成PageHelper实现物理分页:
PageHelper.startPage(1, 10);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
性能优化建议
- 使用
<sql>
标签复用SQL片段 - 批量操作优先选择
<foreach>
而非多次单条提交 - 延迟加载关联对象需配置
lazyLoadingEnabled=true
- 避免N+1查询问题,使用
@Many
或@One
注解优化
常见问题排查
- 参数未匹配:检查
#{param}
与接口参数名是否一致 - 结果映射失败:确认
resultType
或resultMap
配置正确 - SQL注入风险:禁止直接拼接
${}
表达式处理用户输入
通过掌握这些核心技巧,可高效利用MyBatis完成复杂数据操作。实际开发中建议结合日志工具(如log4j)监控生成的SQL语句。