Mybatis的XML映射文件怎么写 SQL语句配置教程

MyBatis XML映射文件核心是SQL与Java方法绑定,需正确处理参数传递、结果映射及动态SQL;通过select/insert/update/delete标签配置基础操作,结合#{param}防注入、resultMap解决字段不一致、//实现动态逻辑。

MyBatis 的 XML 映射文件核心是把 SQL 语句和 Java 方法绑定起来,关键不是写多复杂的 SQL,而是让 SQL 能正确接收参数、返回结果,并适配不同场景(比如动态条件、批量操作)。下面直接说实用写法。

基础 SQL 配置:select / insert / update / delete 标签

每个 SQL 操作对应一个标签,必须放在 apper> 标签下,且 namespace 要和对应的 Mapper 接口全类名一致。

示例(UserMapper.xml):


  
    SELECT * FROM user WHERE id = #{id}
  
  
    INSERT INTO user (name, email) VALUES (#{name}, #{email})
  

说明:
#{id} 是预编译占位符,防 SQL 注入,推荐始终使用
${email} 是字符串拼接(不推荐,除非明确需要,如动态表名)
resultType 用于简单类型或已定义别名的 POJO;复杂映射用 resultMap
parameterType 可省略(MyBatis 3.4+ 会自动推断),但建议显式写上便于维护

传参方式:单个参数、多个参数、对象参数怎么写

MyBatis 会把方法参数包装成一个 Map,所以写法取决于你传的是什么:

  • 单个基本类型(int/String):直接用 #{id}#{param1}
  • 多个参数(无注解):默认 key 是 param1, param2...,建议加 @Param("xxx") 注解,例如:
    User findByNameAndAge(@Param("name") String name, @Param("age") int age);
    XML 中就写 WHERE name = #{name} AND age = #{age}
  • 传对象(如 User user):直接用属性名,如 #{name}#{email},支持点号嵌套(#{profile.phone}

动态 SQL:if / choose / where / foreach 常用组合

避免手拼 SQL 字符串,用 MyBatis 内置标签处理条件逻辑:

示例:按条件查询用户


  SELECT * FROM user
  
    
      AND name LIKE CONCAT('%', #{name}, '%')
    
    
      AND age >= #{minAge}
    
  

要点:
自动处理开头的 AND/OR,比手动写 WHERE 1=1 更干净
中的表达式用 OGNL 语法,支持 ==、!=、and、or、null 判断
• 批量插入用 ,collection 是 List/Array/Map 的 key,item 是当前元素别名

结果映射:resultMap 解决字段名与属性名不一致

当数据库字段是 user_name,Java 属性是 userName,又不想改命名或加 @Column,就用 resultMap:


  
  
  


  SELECT id, user_name, email_addr FROM user

注意:
用于主键,提升性能(MyBatis 缓存识别)
• 关联查询(一对多、多对一)也靠 resultMap + 实现

基本上就这些。XML 文件本质是配置桥梁,重点是参数怎么进、SQL 怎么变、结果怎么出。写熟了比注解更灵活,尤其复杂动态场景。