返回顶部
首页 > 资讯 > 精选 >mybatis查询方式与效率高低源码对比分析
  • 545
分享到

mybatis查询方式与效率高低源码对比分析

2023-07-05 12:07:17 545人浏览 安东尼
摘要

这篇文章主要介绍“mybatis查询方式与效率高低源码对比分析”,在日常操作中,相信很多人在mybatis查询方式与效率高低源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mybatis查询方式与效

这篇文章主要介绍“mybatis查询方式与效率高低源码对比分析”,在日常操作中,相信很多人在mybatis查询方式与效率高低源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mybatis查询方式与效率高低源码对比分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

mybatis查询方式与效率高低

<!--     一对一关联查询     select s.id,s.name,s.age,t.name tname  from student s,teacher t where s.tid=t.id;      -->    <!--        关联的嵌套 Select 查询    问题:        这种方式虽然很简单,但在大型数据集或大型数据表上表现不佳。这个问题被称为“N+1 查询问题”。 概括地讲,N+1 查询问题是这样子的:            你执行了一个单独的 sql 语句来获取结果的一个列表(就是“+1”)。            对列表返回的每条记录,你执行一个 select 查询语句来为每条记录加载详细信息(就是“N”)。    解决:        MyBatis 能够对这样的查询进行延迟加载,因此可以将大量语句同时运行的开销分散开来。        (例如: 我需要teacher这个对象的时候就会进行加载,如果不需要就不会立即加载(延迟加载))         然而,如果你加载记录列表之后立刻就遍历列表以获取嵌套的数据,就会触发所有的延迟加载查询,性能可能会变得很糟糕。    -->    <!--  关联的嵌套 Select 查询  -->    <resultMap id="studentMap" type="student">        <id property="id" column="id"/>        <result property="name" column="name"/>        <result property="age" column="age"/>        <association property="teacher" column="tid" javaType="teacher" select="selectTeacherById">        </association>    </resultMap>    <select id="findAll" resultMap="studentMap">        select * from student;    </select>    <select id="selectTeacherById" parameterType="int" resultType="teacher"  >        select * from  teacher where id=#{id};    </select>    <!--        关联的嵌套  结果映射        将结果直接映射 到实体类中        第二种 方式效率比第一种 速度更高     -->    <resultMap id="studentMap1" type="student">        <id property="id" column="id"/>        <result property="name" column="name"/>        <result property="age" column="age"/>        <association property="teacher" javaType="teacher">            <id property="id" column="tid"/>            <result property="name" column="tname"/>        </association>    </resultMap>    <select id="selectAll" resultMap="studentMap1">        select s.id,s.name,s.age,t.name tname ,t.id tid from student s,teacher t where s.tid=t.id;    </select>------------------------------------------------------------------<!--  一对多  关联嵌套  结果映射    ofType 将数据封装到指定的泛型  -->    <resultMap id="teacherMap" type="teacher">        <id property="id" column="id"/>        <result property="name" column="name"/>        <collection property="students" ofType="student" >            <id property="id" column="sid"/>            <result property="name" column="sname"/>            <result property="age" column="sage"/>            <result property="tid" column="stid"/>        </collection>    </resultMap>    <select id="selectTeacherById"  parameterType="int"  resultMap="teacherMap">         select t.id ,t.name,s.id sid,s.name sname,s.age sage,s.tid stid         from student s ,teacher t         where s.tid=t.id and t.id=1;    </select>

mybatis提高查询效率的方式

缓存机制

1 一级缓存:

mysql连续执行两次select * from table where id =1;第一次会执行sql语句查询数据库,然后保存到sqlsession缓存,第二次查询会先从缓存里查找,有的话直接返回不会执行sql.

但是如果两次sql中间增加一次commit操作(insert,delete,update),如:

select * from table where id =1update table set name = zjw where id =1;select * from table where id =1

这个时候第一次查询依然会执行sql查询数据库,但是在执行完update后会清空sqlsession里的缓存,原因是避免脏读,

所以第二次select在缓存里找不到数据,又会执行sql查询数据库。

2 二级缓存:

二级缓存是基于mapper文件的namaspace,对该mapper的所有sqlsession都共享一个二级缓存,如果两个mapper的namespace一致,则两个mapper的所有sqlsession共用一个二级缓存,

步骤:

在全局配置文件mybatis-configuration.xml加入

其次在mapper文件开启缓存 type里面是缓存类。如果不写是默认的mabatis缓存类,自定义缓存类必须实现cache接口

需要缓存的pojo实体类要实现serializable接口,因为在缓存中取出数据映射到pojo类需要反序列化。

不同的两个sqlsession查询走二级缓存,但是如果其中有一个commit操作,为避免脏读二级缓存还是会被清空。

在每个sql语句上使用useCache=true/false是否使用缓存,flushcache=true/false是否刷新缓存 ,在每次的commit后默认刷新缓存。

懒加载

Mybatis中resultmap可以实现高级映射,association一对一,Collection一对多具有延迟加载功能

在collection或association中fetchtype=lazy,即为懒加载

在查询主表时,不会把子集查出来,直到子集用到的情况才会查出子集。

到此,关于“mybatis查询方式与效率高低源码对比分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: mybatis查询方式与效率高低源码对比分析

本文链接: https://lsjlt.com/news/351730.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mybatis查询方式与效率高低源码对比分析
    这篇文章主要介绍“mybatis查询方式与效率高低源码对比分析”,在日常操作中,相信很多人在mybatis查询方式与效率高低源码对比分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mybatis查询方式与效...
    99+
    2023-07-05
  • mybatis 查询方式与效率高低对比
    目录mybatis查询方式与效率高低mybatis提高查询效率的方式缓存机制懒加载总结mybatis查询方式与效率高低 <!--      一对一关联查询      selec...
    99+
    2023-03-15
    mybatis查询方式 mybatis查询效率 mybatis查询效率对比
  • Python列表和集合效率源码对比分析
    这篇“Python列表和集合效率源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python列表和集合效率源码对比...
    99+
    2023-07-06
  • 大数组元素差异removeAll与Map效率源码对比分析
    本文小编为大家详细介绍“大数组元素差异removeAll与Map效率源码对比分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“大数组元素差异removeAll与Map效率源码对比分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-05
  • Python与sed,grep文本查找效率对比的示例分析
    小编给大家分享一下Python与sed,grep文本查找效率对比的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!测试文本:20w行,21M大 python...
    99+
    2023-06-13
  • JS数组循环的方式以及效率分析对比
    数组的方法 JavaScript发展到现在已经提供了许多数组的方法,下面这张图涵盖了数组大部分的方法,这篇文章主要说一说数组的遍历方法,以及各自的性能,方法这么多,如何挑选性能最佳的...
    99+
    2024-04-02
  • 二维码如何帮助Java分布式索引系统提高数据查询效率?
    随着互联网技术的不断发展,数据量呈现爆炸式增长,如何快速高效地查询数据成为了互联网公司必须面对的问题。Java分布式索引系统作为一种高效的数据查询方案,被广泛应用于各大互联网公司中。而二维码技术的应用,则可以进一步提高Java分布式索引系...
    99+
    2023-09-26
    分布式 索引 二维码
  • Go语言如何高效的进行字符串拼接(6种方式对比分析)
    目录前言string类型字符串拼接的6种方式及原理原生拼接方式"+"字符串格式化函数fmt.SprintfStrings.builderbytes.Buffers...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作