Mapper.xml的属性及标签说明

本文围绕MyBatis XML展开,介绍了常见属性,对比了${}和#{}的区别,前者是直接替换,后者会加引号并解析为参数占位符。还详细讲解了<sql>、<where>、<if>、<set>、<trim>、<choose>等标签的功能和使用方法,有助于提升SQL编码效率和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.常见属性

属性

作用

namespace

Dao类对应接口的路径

id

表示此段sql执行语句的唯一标识,也是接口的方法名称【必须一致才能找到方法】

parameterType

表示该sql语句中需要传入的参数, 类型要与对应的接口方法的类型一致【可选】

resultMap

定义出参,调用已定义的映射管理器的id值

resultType

定义出参,匹配普通Java类型或自定义的pojo【出参类型若不指定,将为语句类型默认类型,如语句返回值为int】

2.${}和#{}的区别

        #{}会自动在你要插入字段两端 加上引号。例如:你写的是order by #{username},传的是 zhangsan,那么会解析成order by “zhangsan”。

        ${}是将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111 如果传入的值是id,则解析成的sql为order by id.

        #{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符 。

        $ {}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。在使用order by 时,就需要使用$

3.<sql>标签

        该标签主要定义复用的sql语句片段,在执行的sql语句标签直接引用即可。可以提高编码效率、简化代码和提高可读性。

        需要配置id熟悉,表示该sql片段的唯一标识。

        引用:通过<include refid=" " / >标签引用,refid的值就是< sql>的id属性的值。

      

<sql id="Base_Column_List">  

	id, question, answer   

</sql>  

<select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">  

	select   

		<include refid="Base_Column_List" />  

		from java  

		where id = #{id,jdbcType=BIGINT}  

</select> 

# 在<sql>中也可以include其他的<sql>标签,例如:

<sql id="sometable">   

    ${prefix}Table   

</sql>   

<sql id="someinclude">  
 
    from   

    <include refid="${include_target}"/> 
  
</sql>   

<select id="select" resultType="map"> 
  
    select field1, field2, field3  
 
        <include refid="someinclude">   

            <property name="prefix" value="Some"/> 
  
            <property name="include_target" value="sometable"/> 
  
        </include>   

</select> 

4.<where>和<if>标签

        < where > : 主要用来替换sql语句中的where字段,他的作用主要是用来简化sql语句中where条件判断的书写的

        < if >:条件判断标签,配置属性test=" 条件字符串 ",判断是否满足条件,满足则执行,不满足则跳过。

        如果当id值为空时,此时打印的sql应是:select * from hrmresource where name=“xx” and age=“xx”

# where 标签会自动将其后第一个条件的and或者是or给忽略掉

<select id="selectByParams" parameterType="map" resultType="user"> 
 
    select * from hrmresource  

    <where>  

        <if test="id != null ">id=#{id}</if>  

        <if test="name != null and name.length()>0" >and name=#{name}</if>  

        <if test="age != null and age.length()>0">and age = #{age}</if>  

    </where>  

</select>

5.<set>标签

        < set > : 主要用来替换sql语句中的set字段,一般在update中使用。

        在下述的代码片段当中,假如说现在三个字段都有值得话,那么上面打印的SQL语句如下:

        update hrmresource set name=‘xxx’ , age=‘xx’ where id=‘x’

        在上面age="xx"的后是没有逗号的,也就是说set标记已经自动帮助我们把最后一个逗号给去掉了

# set 标记会自动将其后第一个条件后的逗号忽略掉

<update>  

    update hrmresource   

    <set>  

        <if test="name != null and name.length()>0">name = #{name},</if>  

        <if test="age != null and age .length()>0">age = #{age },</if>  
    </set>  

    where id = #{id}  

</update>

6.<trim>标签

        < trim > : 是一个格式化的标记,可以完成set或者是where标记的功能。

示例1:

select * from hrmresource   
  
    <trim prefix="WHERE" prefixoverride="AND |OR">  

        <if test="name != null and name.length()>0"> AND name=#{name}</if>  

        <if test="age != null and age.length()>0"> AND age=#{age}</if>  
  
</trim>  

        假如说name和age的值都不为null的话打印的SQL为:select * from hrmresource where name = ‘xx’ and age = ‘xx’

        在where的后面是不存在第一个and的,上面两个属性的意思如下:

        prefix:前缀      

        prefixoverride:去掉第一个and或者是or

示例2:

update hrmresource  

    <trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">  

        <if test="name != null and name.length()>0"> name=#{name} , </if>  

        <if test="age!= null and age.length()>0"> age=#{age} ,  </if>  

    </trim> 

        假如说name和age的值都不为null的话打印的SQL为:update hrmresource set name=‘xx’ , age=‘xx’ where id=‘x’

        在age='xx’的后面不存在逗号,而且自动加了一个set前缀和where后缀,上面三个属性的意义如下,其中prefix意义如上:

        suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)

        suffix:后缀

7.<choose>标签

        < where > : choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

<select id="selectByParams" parameterType="map" resultType="user">  

    select * from hrmresource where 1 = 1  

        <choose>  

              <when test="id !=null ">    

                    AND id = #{id}  

                </when >    

              <when test="username != null and username != '' ">    

                  AND username = #{username}    

              </when >    

              <when test="age != null and age !=''">    

                  AND age = #{age}    

              </when >    

              <otherwise>    

              </otherwise>    

        </choose>  

</select>

### 回答1: collection标签用于映射一个集合属性,可以将一个集合类型的属性映射到数据库中的一张表或者另一个实体类中的集合属性。在collection标签中可以使用select、insert、update、delete等标签来定义对集合属性的CRUD操作。同时,collection标签也支持嵌套使用,可以实现对多层嵌套集合属性的映射。 ### 回答2: 在MyBatis的mapper.xml文件中,collection标签用于处理一对多关系的映射。它可以在映射文件中定义一个集合或数组属性,将其与数据库表中的多个记录进行关联。 通过collection标签,可以指定一个列与集合属性之间的映射关系,并且可以对集合进行一些特定的操作,例如增加、删除、修改等。 collection标签有两个主要的属性:property和ofType。property属性指定了集合类型的属性名,即在Java对象中的集合属性名。ofType属性指定了集合中元素的类型,可以是简单类型也可以是复杂类型。 在collection标签的内部,可以使用id标签定义一个作为主键的列名,id标签的property属性指定了Java对象中作为主键的属性名。使用id标签,可以为集合中的每个元素指定一个唯一标识。 collection标签还可以包含其他标签,例如resultMap、association、result等,用于进一步定义关联关系和映射规则。通过这些标签的组合使用,可以实现更复杂的一对多关联映射。 总之,collection标签是MyBatis中用于处理一对多关系的重要标签之一。它可以将数据库表中多个记录映射到Java对象的集合属性中,并提供了丰富的操作和映射配置选项,方便开发人员进行一对多关系的数据库操作。 ### 回答3: 在MyBatis的mapper.xml文件中,collection标签用于处理集合类型的映射。它通常用于一对多或多对多的关联关系。collection标签可以嵌套在resultMap标签中,用于定义集合类型属性的映射规则。 collection标签有以下常用的属性: - property:指定集合属性的名称。它对应Java对象中的一个集合类型属性,例如List或Set。 - ofType:指定集合元素的类型。可以是Java类的全限定名或别名。 - column:指定关联的数据库字段名。通常用于多表关联查询中,指定关联列的名称。 - select:指定一个关联查询语句的id。这个查询语句将在集合加载时执行,用于加载关联数据。 - fetchType:指定数据加载方式。包括lazy和eager两种,分别表示延迟加载和立即加载,默认为延迟加载。 collection标签的使用示例: ``` <resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="user_name" /> <result property="age" column="user_age" /> <collection property="orders" ofType="Order" select="findOrderByUserId" column="user_id" fetchType="eager"> <id property="id" column="order_id" /> <result property="name" column="order_name" /> <result property="price" column="order_price" /> </collection> </resultMap> <select id="findOrderByUserId" resultType="Order"> SELECT * FROM orders WHERE user_id = #{userId} </select> ``` 在上述示例中,resultMap定义了User类的映射规则,并使用collection标签定义了orders属性的映射规则。通过select属性指定了查询关联订单的SQL语句的id,并通过column属性指定了关联的列名。在关联查询时,会加载对应的订单数据,并将其封装为List<Order>类型的属性orders。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值