• MyBatis的动态 SQL、代理机制与多级缓存


    作者:逍遥Sean
    简介:一个主修Java的Web网站\游戏服务器后端开发者
    主页:https://blog.csdn.net/Ureliable
    觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言!

    前言

    MyBatis 是一个开源的 Java 持久层框架,它通过 XML 或注解的方式将 SQL 语句与 Java 对象进行映射。相比于传统的 JDBC 操作数据库,MyBatis 简化了很多重复的代码和操作,同时也提供了很多功能强大、易于使用的特性。MyBatis 可以与各种数据库进行交互,支持主流的关系型数据库,如 MySQL、Oracle、SqlServer、Postgres 等。其主要特点包括:

    1. 简单易学:MyBatis 的设计思路很简单,易于理解和学习。
    2. 灵活可控:MyBatis 提供了很多灵活可控的特性,如动态 SQL、缓存等。
    3. 映射灵活:MyBatis 支持多种映射方式,如 XML 配置文件、注解等。
    4. 可扩展性强:MyBatis 可以通过自定义插件来扩展其功能。
    5. 缓存支持:MyBatis 提供了多级缓存支持,在高并发场景下可以大幅提升性能。

    总之,MyBatis 是一款非常优秀的 ORM 框架,它不仅提供了很多开发效率和运行性能上的优势,还能够帮助开发人员更好地组织和管理项目中的 SQL 语句。MyBatis 提供了多种缓存机制来提高数据访问性能。MyBatis 缓存是指在 MyBatis 应用程序中为特定查询缓存结果集或查询状态的机制。MyBatis 缓存有两种类型:本地缓存和二级缓存。MyBatis 缓存的使用可以提高查询性能,但也需要注意缓存的更新和清除机制,避免数据一致性问题。在使用缓存时,需要根据具体业务情况进行选择和配置。

    一、动态 SQL

    MyBatis 的动态 SQL 允许在 SQL 语句中添加条件判断、循环、动态拼接 SQL 等操作,以便根据不同需求生成不同的 SQL 语句。通过动态 SQL,可以减少重复编写 SQL 语句的工作量,提高应用程序的可维护性和灵活性。
    MyBatis的动态SQL允许你根据条件生成不同的sql语句,这样可以更加灵活地处理不同的查询条件。MyBatis提供了多种动态SQL元素,包括:

    1. If元素:用于根据条件判断是否包括某段SQL语句。
    <select id="selectBlog" resultType="Blog">
      SELECT * FROM blog WHERE 1=1
      <if test="title != null">
        AND title like #{title}
      if>
      <if test="author != null">
        AND author like #{author}
      if>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. Choose元素:类似于Java中的switch语句,根据不同的条件选择不同的SQL语句。
    <select id="selectBlog" resultType="Blog">
      SELECT * FROM blog WHERE 1=1
      <choose>
        <when test="title != null">
          AND title like #{title}
        when>
        <when test="author != null">
          AND author like #{author}
        when>
        <otherwise>
          AND 1=1
        otherwise>
      choose>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. Where元素:用于将where关键字和条件拼接起来,如果没有条件则不会有where关键字。
    <select id="selectBlog" resultType="Blog">
      SELECT * FROM blog
      <where>
        <if test="title != null">
          AND title like #{title}
        if>
        <if test="author != null">
          AND author like #{author}
        if>
      where>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. Trim元素:类似于Where元素,用于将where关键字和条件拼接起来,但是可以自定义前缀、后缀和连接符,可以更灵活地处理条件。
    <select id="selectBlog" resultType="Blog">
      SELECT * FROM blog
      <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="title != null">
          AND title like #{title}
        if>
        <if test="author != null">
          OR author like #{author}
        if>
      trim>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. Set元素:用于更新操作中,根据条件更新不同的字段。
    <update id="updateBlog" parameterType="Blog">
      UPDATE blog
      <set>
        <if test="title != null">
          title = #{title},
        if>
        <if test="author != null">
          author = #{author},
        if>
      set>
      WHERE id = #{id}
    update>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    以上就是MyBatis动态SQL的五种元素,可以根据具体的需求选择不同的方式来生成SQL语句。

    二、代理机制

    MyBatis 使用了代理模式来实现 DAO 接口的实现类。在运行期间,MyBatis 会根据 Mapper 文件自动生成代理对象,在代理对象中实现了对底层数据库的 CRUD 操作。代理对象是 MyBatis 实现 ORM 的重要工具,它可以隐藏数据访问的细节,提供了数据访问的统一接口。

    Mybatis代理机制主要包括两种代理方式:JDK动态代理CGLIB代理

    1. JDK动态代理方式是基于接口的代理方式,它是在运行时动态生成一个代理类,用于代理目标接口的实现类。这个代理类实现了目标接口,并将所有的方法调用转发到InvocationHandler接口的invoke方法中,实现了在不修改目标接口实现类的情况下,对其进行增强或者拦截其方法调用的功能。

    2. CGLIB代理方式是基于继承的代理方式,CGLIB代理会直接生成目标接口实现类的子类,并重写其方法,从而实现对目标接口方法的增强和拦截。CGLIB代理方式相对于JDK动态代理方式的优势在于,它不依赖于接口,可以直接代理目标类,同时也可以代理没有公共构造方法的类。

    Mybatis的代理机制通过MapperProxy类实现,当Mybatis解析Mapper接口时,会使用JDK动态代理或者CGLIB代理的方式创建Mapper接口的代理实现类,通过代理实现类来操作数据库。代理实现类中会包含一个SqlSession实例,用于执行数据操作,同时也会包含一个Mapper接口实例,用于实现Mapper接口的所有方法。当代理实现类的方法被调用时,会将实际执行的操作传递到SqlSession实例中,并最终由SqlSession实例完成数据的操作。

    三、多级缓存

    1. 本地缓存:是 MyBatis 默认启用的一种基于 Per-Statement 的本地缓存,也就是说同一个会话中,如果多次执行相同的 SQL 语句,MyBatis 会通过本地缓存来缓存结果。本地缓存的特点是生命周期短,仅在会话期间内有效。

    2. 二级缓存:是指 MyBatis 所有 SqlSession 共享的一级缓存,它可以在多个 SqlSession 中共享缓存。二级缓存需要在 mybatis-config.xml 配置文件中配置开启,并需要在 Mapper 文件中设置缓存的实现方式(如 Ehcache、Redis 等)。二级缓存的特点是生命周期长,对于经常查询的数据可以提高查询速度。

    MyBatis 支持多级缓存,包括本地缓存、二级缓存和分布式缓存。本地缓存是指在同一个 SqlSession 中缓存查询结果;二级缓存是指在不同的 SqlSession 之间共享同一个缓存,需要配置;分布式缓存是指通过分布式缓存框架(如 Redis)来共享缓存。使用多级缓存可以加快数据访问速度,减少数据库的访问次数,提高应用程序的性能。

    最后

    在使用 MyBatis 时,动态 SQL 可以帮助我们灵活的构建查询条件,代理机制可以实现数据访问的封装和统一管理,多级缓存可以加速数据的读取。但是需要注意,使用多级缓存时需要合理设置缓存策略,否则会出现数据不一致的问题。同时,动态 SQL 和代理机制也需要合理使用,避免代码逻辑混乱和性能问题。

  • 相关阅读:
    CAD Exchanger SDK 3.22.0 Crack
    【敲级实用】:某小伙写了一个的办公脚本后~变精神了~
    GO语言实战之接口实现与方法集
    大促过后,销量与流量兼具,是否真的高枕无忧?
    centos7搭建git服务器
    文本和二进制混合存储
    力扣刷题 day14:10-14
    减治法(引例中位数、查找问题:折半&二叉&选择、排序问题:堆排序、组合问题:淘汰赛冠军问题&假币问题)
    【26】c++设计模式——>命令模式
    吴恩达深度学习笔记(七)——机器学习策略
  • 原文地址:https://blog.csdn.net/Ureliable/article/details/133187752