Mybatis中xml常用标签体学习

本文深入探讨Mybatis中动态SQL的使用技巧,包括<resultMap>与parameterMap的区别,<sql>代码片段的复用,<if>条件判断,<trim>动态拼接,及<foreach>循环遍历等关键标签的运用,为开发者提供实战指南。

在Mybatis中,我们会遇见各式各样的查询,在这里我记录一下几个常用的查询方式以及容易出错的地方

1.<resultMap> 是返回值的封装  parameterMap 是参数的封装 

2.<sql> 这个是代码片段。在标签<sql>中,我们可以将一些常用的写在这个中间,然后在下面的具体的sql语句中进行拼接就行。在下面的具体中需要使用<include>进行引入。

3.<if>标签在使用的时候,需要使用 test属性,将判断条件写在test中

4.<trim>动态拼接sql语句,这个功能很常用,比如我们在执行添加的过程中,insert操作时候,首先封装的属性字段不确定是否存在,就需要判断,我们执行的sql就要动态的拼接了,就要使用到<trim>.这个标签一共有四个属性,分别就是拼接前的头是什么,尾是什么,头忽略什么,尾忽略什么。 prefix前缀  suffix后缀  suffixOverrides 前缀忽略  prefixOverrides后缀忽略,忽略前缀就是如果在这个prefixOverrides标签中,有值了,那么就会在<trim>这个标签体中的所有子标签挨个去查看,如果后缀满足条件,删除掉。

5.<foreach>标签,是遍历, 里面的属性有:

collection (这个是标明你循环的是什么类型,如果是list就写list,如果是map.就写map.如果是数组,就写数组的名字只有这三种)

index(当前遍历到的对象在整个集合中的位置下标)

item (当前遍历到的当前对象)

open 开始   

close 结束 

separator 分隔符 

这里有一个需要注意的地方,就是循环遍历查询的时候,返回值如果是一个list集合的时候,参数的接受不能是list,只能用查询出来的pojo对象接受,也就是resultType写pojo的类名。

<think>嗯,用户想了解MyBatis常用注解及其作用,以及XML文件中的相关标签。根据提供的引用内容,用户已经站内引用了四篇资料,涉及MyBatis的注解分类、XML配置对比、动态SQL注解实现等关键信息。 用户可能在开发中遇到了注解和XML配置的选择困惑,或是需要快速掌握核心注解的用法。从引用[1]看,用户已经接触过基础分类,但需要更系统的整理;引用[3]提到动态SQL在注解中的特殊性,这显然是重点难点;引用[2][4]则表明用户也在对比XML配置方式。 需要特别注意三个技术细节: 1 注解和XML的对应关系要严格对齐,比如@Select对应<select> 2 动态SQL在注解中是通过SQL构建类实现的,和XML标签逻辑完全不同 3 结果集映射在注解中要用@Results链式配置,这点容易出错 对于XML部分,用户可能更关注实际应用场景。引用[4]给出了<select>标签的示例,但其他核心标签如<resultMap>、动态SQL标签也需展开。考虑到用户是查询"相关标签介绍",说明需要基础全面的内容。 准备在回答时分成三部分:常用注解(按功能分类详细说明)、XML核心标签(突出与注解的对比)、选择建议(结合引用[2]的场景分析)。动态SQL部分要单独强调差异点,因为引用[3]明确指出注解实现方式特殊。 最后生成的问题要引导用户深入实际应用场景,比如动态SQL的实现选择、复杂映射的处理方案等,这样能帮助用户解决后续可能遇到的工程问题。 </think>下面我将系统介绍MyBatis常用注解及其作用,以及XML映射文件中的核心标签分类说明: --- ### 一、MyBatis常用注解及作用 #### 1. SQL语句映射 | 注解 | 对应XML标签 | 作用 | 示例片段 | |---------------|------------|-----------------------------|-----------------------------| | `@Select` | `<select>` | 定义查询语句 | `@Select("SELECT * FROM users")` | | `@Insert` | `<insert>` | 定义插入语句 | `@Insert("INSERT INTO users(name) VALUES(#{name})")` | | `@Update` | `<update>` | 定义更新语句 | `@Update("UPDATE users SET name=#{name} WHERE id=#{id}")` | | `@Delete` | `<delete>` | 定义删除语句 | `@Delete("DELETE FROM users WHERE id=#{id}")` | #### 2. 结果集映射 | 注解 | 对应XML标签 | 作用 | |----------------|--------------|-----------------------------| | `@Results` | `<resultMap>` | 定义结果映射集合 | | `@Result` | `<result>` | 指定字段与属性的映射关系 | | `@ResultMap` | `resultMap属性`| 引用已定义的`@Results`映射规则 | ```java @Results(id = "userMap", value = { @Result(property = "id", column = "user_id"), @Result(property = "name", column = "user_name") }) @Select("SELECT user_id, user_name FROM users") List<User> getAll(); ``` #### 3. 关系映射 | 注解 | 对应XML标签 | 作用 | |------------|---------------|----------------------| | `@One` | `<association>` | 一对一关联映射 (e.g., `@Result(property="dept", column="dept_id", one=@One(select="selectDept"))`) | | `@Many` | `<collection>` | 一对多关联映射 (e.g., `@Result(property="orders", column="user_id", many=@Many(select="selectOrders"))`) | #### 4. 动态SQL | 注解 | 对应XML标签 | 作用 | |----------------------|------------------|------------------------| | `@SelectProvider` | `<select>` | 动态生成SQL语句 | | `@InsertProvider` | `<insert>` | 动态生成插入语句 | ```java @SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName") List<User> getUsersByName(String name); // SQL构建类 class UserSqlBuilder { public String buildGetUsersByName(String name) { return new SQL() {{ SELECT("*"); FROM("users"); if (name != null) WHERE("name LIKE #{name} || '%'"); }}.toString(); } } ``` #### 5. 其他关键注解 | 注解 | 作用 | |------------------|-------------------------------------| | `@Param` | 指定方法参数名 (e.g., `@Param("userId") int id`) | | `@Options` | 设置SQL执行选项 (如主键回填、超时时间) | | `@CacheNamespace` | 在类上启用二级缓存 | --- ### 二、XML映射文件核心标签 #### 1. CRUD标签 ```xml <select id="selectUserById" parameterType="int" resultType="User"> SELECT * FROM users WHERE id = #{id} <!-- #{id}对应方法参数 --> </select> <insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users(name) VALUES(#{name}) </insert> ``` #### 2. 结果映射 ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="name" column="user_name"/> <association property="dept" select="selectDept" column="dept_id"/> <!-- 一对一 --> <collection property="orders" ofType="Order" select="selectOrders" column="user_id"/> <!-- 一对多 --> </resultMap> ``` #### 3. 动态SQL标签 | 标签 | 作用 | 示例片段 | |--------------|------------------------------|----------------------------| | `<if>` | 条件判断 | `<if test="name != null">AND name=#{name}</if>` | | `<where>` | 动态添加WHERE并去除首AND | `<where><if ...>...</if></where>` | | `<foreach>` | 遍历集合 | `item IN <foreach item="id" collection="ids" open="(" separator="," close=")">#{id}</foreach>` | | `<choose>` | 多条件选择 (类似switch-case) | 包含`<when>`和`<otherwise>` | --- ### 三、注解 vs XML 选择建议 1. **注解适用场景** - 简单SQL操作(快速开发) - 参数少于3个的查询 - 小型项目或原型验证(如:`@Select("SELECT * FROM table")`) 2. **XML推荐场景** - 复杂动态SQL(如多条件组合查询) - 需要复用SQL片段时(通过`<sql>`+`<include>`) - 大型项目分层管理(SQL与Java代码分离) > 提示:MyBatis允许**混合使用**注解和XML,可通过`@ResultMap`引用XML中的`<resultMap>`实现灵活组合[^2][^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值