Mybatis中mapper文件中sql语句的几点

一、resultMap中的映射关系
 resultMap:设置自定义映射       

        resultMap标签的属性: id:该自定义映射的唯一标识
                                              type:查询的数据要映射的实体类的类型

          resultMap的子标签:  id:设置主键的映射关系
                                              result:设置普通字段的映射关系

          resultMap的子标签的属性: property:设置映射关系中实体类中的属性名
                                                       column:设置映射关系中表中的字段名

<resultMap id="ResultMap" type="Emp">
    <id property="eid" column="eid"></id>
    <result property="empName" column="emp_name"></result>
    <result property="age" column="age"></result>
    <result property="sex" column="sex"></result>
    <result property="email" column="email"></result>
</resultMap>
<select id="getEmp" resultMap="ResultMap">
    select * from emp
</select>

 

二、参数占位符的映射

User getUserById(@Param("id") Long userId);
<select id="getUserById" resultType="User">
    SELECT * FROM t_user WHERE id = #{id}
</select>

 对于#{id}的映射规则:

#{id}是MyBatis中的参数占位符,用于接收传入的参数值。在实际执行SQL语句时,#{id}会被实际的参数值替换。

在MyBatis的使用中,#{id}的映射规则是由MyBatis框架根据传入的参数自动进行映射的。具体的映射规则如下:

  • 如果传入的参数是一个简单类型(如int、long、String等),那么#{id}会直接替换为对应的参数值,例如select * from t_user where id = 123
  • 如果传入的参数是一个对象,MyBatis会根据对象的属性名和#{}中的名称进行自动映射,例如传入的对象是User对象,且User对象中有id属性,则#{id}会被映射为对应的id属性的值,例如select * from t_user where id = #{id}会被映射为select * from t_user where id = user.getId()

#{id}的映射规则取决于传入的参数类型和参数值,MyBatis会根据参数类型自动进行映射。

在MyBatis中,除了直接使用#{id}来引用参数外,还可以使用@Param注解为参数起一个别名。这种方式的区别在于以下几点:

  1. 易读性:使用@Param注解可以让SQL语句中的参数更具有可读性,尤其是在多个参数的情况下,可以清晰地知道每个参数的含义。

  2. 参数重用:使用@Param注解可以为参数起别名,这样可以在多个地方重复使用同一个参数,而不需要在不同的地方使用不同的参数名。

在这个例子中,@Param("id")起到了给参数userId起了一个别名id的作用,使得在SQL语句中可以直接使用#{id}引用参数,增强了可读性和参数的重用性。

三、xml文件和mapper接口的对应

在MyBatis中,Mapper接口定义了对数据库的操作,而对应的SQL语句则是在XML文件中定义的。通过在XML文件中声明namespace属性,可以将XML文件与对应的Mapper接口进行关联,从而实现了Mapper接口与XML文件的映射关系。

<!-- UserMapper.xml -->
<mapper namespace="com.qrc.mapper.UserMapper">
    <select id="getUserById" resultType="User">
        SELECT * FROM t_user WHERE id = #{id}
    </select>
    <!-- 其他SQL语句... -->
</mapper>

四、动态sql标签

if标签

1.if标签中test属性是必须的。

2.if标签中test属性的值是false或者true。

3.如果test是true,则if标签中的sql语句就会拼接。反之,则不会拼接。

4.test属性中可以使用的是:

当使用了@Param注解,那么test中要出现的是@Param注解指定的参数名。@Param(“brand”),那么这里只能使用brand

当没有使用@Param注解,那么test中要出现的是:param1 param2 param3 arg0 arg1 arg2…当使用了POJO,那么test中出现的是POJO类的属性名。

5.在mybatis的动态SQL当中,不能使用&&,只能使用and。

<select id="selectUserCount" resultType="integer">
		select count(*) from user_info
		<where>
			<if test="userCode != null and userCode != ''">
				and user_code like concat('%', #{userCode}, '%')
			</if>
			<if test="userType != null and userType != ''">
				and user_type = #{userType}
			</if>
			<if test="userState != null and userState != ''">
				and user_state = #{userState}
			</if>
			and is_delete = 0
		</where>
</select>

where标签

  • where标签的作用:让where子句更加动态智能。
  • 所有条件都为空时,where标签保证不会生成where子句。·自动去除某些条件前面多余的and或or。

Trim标签

在MyBatis中,<trim>标签用于在生成动态SQL时对SQL语句进行修剪和处理。<trim>标签通常用于处理SQL语句中的空白字符和条件语句,以便动态地构建SQL语句。

<trim>标签通常包含以下属性:

  • prefix:在修剪后的内容前面添加的字符串。
  • prefixOverrides:指定需要从修剪后的内容中移除的前缀。
  • suffix:在修剪后的内容后面添加的字符串。
  • suffixOverrides:指定需要从修剪后的内容中移除的后缀。

<trim>标签通常与其他条件标签(如<if><where><set>等)一起使用,以便根据条件动态地添加或移除SQL语句的一部分。

<update id="updateUser" parameterType="User">
  UPDATE users
  <trim prefix="SET" suffixOverrides=",">
    <if test="username != null">username=#{username},</if>
    <if test="password != null">password=#{password},</if>
    <if test="email != null">email=#{email},</if>
  </trim>
  WHERE id = #{id}
</update>

示例中,<trim>标签被用来处理SET子句中可能出现的多余逗号。如果usernamepasswordemail其中之一为null,那么对应的属性和赋值语句会被移除,同时逗号也会被处理掉,以确保生成的SQL语句是正确的。

set标签

  • 主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”
  • 比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。

传统写法:

<update id="update">
        update t_car set
            name = #{name},
            sex = #{sex}
        where id = #{id}
</update>

set标签写法:

update t_car
   <set>
        <if test="name != null and name !=''">name = #{name},</if>
        <if test="sex != null and sex !=''">sex = #{sex},</if>
        <if test="guidePrice != null and guidePrice !=''">guide_price = #{guidePrice},</if>
    </set>
where 
  id = #{id}

choose when otherwise标签

<select id="getUser" parameterType="map" resultType="User">
  SELECT * FROM users
  <where>
    <choose>
      <when test="id != null">
        AND id = #{id}
      </when>
      <when test="username != null">
        AND username = #{username}
      </when>
      <otherwise>
        AND status = 'active'
      </otherwise>
    </choose>
  </where>
</select>

示例中,<choose>标签包裹了三个条件分支:当id不为空时,执行对应的条件语句;当username不为空时,执行对应的条件语句;否则,执行<otherwise>中的默认条件语句。这样可以根据不同的条件

foreach标签

foreach标签的属性:

collection:指定数组或者集合

item:代表数组或集合中的元素

separator:循环之间的分隔符

动态地构建SQL语句,使得SQL查询更加灵活和可定制。

<select id="getUsersByIds" parameterType="map" resultType="User">
  SELECT * FROM users
  WHERE id IN
  <foreach collection="ids" item="id" open="(" close=")" separator=",">
    #{id}
  </foreach>
</select>

示例中,<foreach>标签用于迭代ids集合,并将集合中的元素应用到SQL语句中的IN子句中。在每次迭代中,${id}会被替换为集合中的当前元素,同时根据opencloseseparator属性动态地构建SQL语句,使得生成的SQL语句形如id IN (1, 2, 3)

include标签和sql标签

<include>标签和<sql>标签都用于在动态SQL中实现代码重用,提高SQL语句的可维护性和可读性。

<sql id="baseColumn">
  id, username, email
</sql>

<select id="getUser" parameterType="int" resultType="User">
  SELECT
  <include refid="baseColumn"/>
  FROM users
  WHERE id = #{id}
</select>

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值