Mybatis的动态sql、懒加载

5 篇文章 0 订阅

一、 动态sql

  1. if标签:满足某某条件
<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>
  1. choose (when, otherwise):选择其中一个满足的条件查找
<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>
  1. trim (where, set):去除动态sql多余的符号
<select id="findActiveBlogLike" resultType="Blog">
  SELECT * FROM BLOG
  <trim prefix="WHERE" prefixOverrides="AND |OR ">
	  <where>
	    <if test="state != null">
	         state = #{state}
	    </if>
	    <if test="title != null">
	        AND title like #{title}
	    </if>
	    <if test="author != null and author.name != null">
	        AND author_name like #{author.name}
	    </if>
	  </where>
  </trim>
</select>
<update id="updateAuthorIfNecessary">
  update Author
  <trim prefix="SET" suffixOverrides=",">
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  </trim>
  where id=#{id}
</update>
  1. foreach:遍历集合(index 是当前迭代的次数,item 的值是本次迭代获取的元素)
<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
        #{item}
  </foreach>
</select>

批量操作尽量交给mybatis做(但foreach也要控制条数,一般30条一次,mysql自身会设置接收数据包的大小max_allowed_packet=4M,超过就报错),代码循环单条记录更新会占用数据库连接资源。

mybatis还提供了Batch Executor:Executor是jdbc底层操作数据库的方式,mybatis封装了三种,分别是Simple(statements)、Reuse(preparedstatements)、Batch(封装preparedstatements的addBatch方法,会把sql语句存起来发给数据库一次性执行)

二、 懒加载

  1. 嵌套查询会出现N+1问题
    在这里插入图片描述
    mybatis的setting标签提供了配置:
    1. <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。默认 false -->
      <setting name="lazyLoadingEnabled" value="true"/>
      开启这个开关执行嵌套查询的时候不会执行部门的查询,只有调用了get部门的方法才会执行部门查询。
      (不包括这个默认配置的方法会触发加载:lazyLoadTriggerMethods 指定哪个对象的方法触发一次延迟加载。 用逗号分隔的方法列表。 equals,clone,hashCode,toString
    2. <!-- 当开启时,任何方法的调用都会加载该对象的所有属性。默认 false,可通过select标签的 fetchType来覆盖-->
      <setting name="aggressiveLazyLoading" value="true"/>
      开启这个开关执行嵌套查询的时候,只要调用了员工对象的方法且不管是什么方法都会执行部门查询

  1. 猜也能猜到这个延迟加载用到了动态代理
    让代理类去查询数据
    mybatis提供了两种代理方式:JAVASSIST 和CGLIB
    <!-- Mybatis 创建具有延迟加载能力的对象所用到的代理工具,默认JAVASSIST -->
    <setting name="proxyFactory" value="CGLIB" />

三、逻辑分页与物理分页

  1. 逻辑分页(这个数据放内存的,谁用谁2B):RowBounds:只需查询时候当做参数传进去就行,无需任何处理
    在这里插入图片描述
  2. 物理分页:集成分页插件PageHelper(4.x与5.x有差别,4版本用pagehelper,5版本用PageInterceptor)
    在这里插入图片描述

四、statement和preparedstatement区别

链接: 参考别人的blog.

  • 1
    点赞
  • 1
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值