Mybatis N+1问题解析 及metadata

前导必备
Mybatis
数据库
级联
N+1问题??
N+1问题来源于数据库中常见的级联技术,即N个数据库表形成关联关系,当再增加一个关联表时,也就是N+1个级联关系,由于某些时候,我们并不需要加载数据库的所有数据,而是某一个数据库表中数据,这时Mybatis会自动加载所有表的数据,多执行几条无关sql语句,会造成数据库资源的浪费以及系统性能的下降,这就是级联表的缺点。

如何解决N+1问题
Mybatis本身给出解决方案,就是延迟加载。

延迟加载
延迟加载会解决上述的N+1问题,也就是在N+1个级联表的情况下,只加载需求的数据库表数据。这是互联网发展的需求,性能提升的途径。

如何配置Mybatis完成延迟加载
全局配置:
    - lazyLoadingEnabled        true/false
    - aggressiveLazyLoading      true/false

    lazyLoadingEnabled:延迟加载的全局开关,当开启时,所有关联都会延迟加载。在特定的关联中,
使用fetchType属性覆盖该内容的功能。fetchType将在后面介绍。

    aggressiveLazyLoading:是层级延迟加载开关,什么意思呢?就是处于同一个层级的关联表会同
时延迟加载,或者同时被加载。

    配置:
        在Mybatis的全局配置中的setting标签中加入设置
        <setting>
            <setting name="lazyLoadingEnabled" value="true"/>
            <setting name="aggressiveLazyLoading" value="true"/>
        </setting>

全局配置的缺点
上面的配置属于全局配置,会出现一个问题,同一个层级的级联表也存在需求性的差异,同一级的某个数据库表的数据或许不是我们经常使用的,那么上述的配置也会影响系统的性能。

全局配置的优化 — fetchType属性
Mybatis使用fetchType属性解决全局配置的缺点。fetchType出现在级联元素association,collection中,它存在两个值

    - eager:获得当前POJO后立即加载对应的数据。
    - lazy:获得当前POJO后延迟加载对应的数据。

配置:
        <collection properties=".." column=".." fetchType="eager"
            select="映射接口"
        />
--------------------- 
作者:布玮 
来源:CSDN 
原文:https://blog.csdn.net/qq_40910541/article/details/80813431 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 在我们前面使用JDBC来处理数据库的接口主要有三个,即Connection,PreparedStatement和ResultSet这三个,而对于这三个接口,还可以获取不同类型的元数据,通过这些元数据类获得一些数据库的信息。

  元数据(MetaData),即定义数据的数据。打个比方,就好像我们要想搜索一首歌(歌本身是数据),而我们可以通过歌名,作者,专辑等信息来搜索,那么这些歌名,作者,专辑等等就是这首歌的元数据。因此数据库的元数据就是一些注明数据库信息的数据。

  ① 由Connection对象的getMetaData()方法获取的是DatabaseMetaData对象。

  ② 由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象。

  ③由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。

 

 

DatabaseMetaData

  DatabaseMetaData是由Connection对象通过getMetaData方法获取而来,主要封装了是对数据库本身的一些整体综合信息,例如数据库的产品名称,数据库的版本号,数据库的URL,是否支持事务等等,能获取的信息比较多,具体可以参考DatabaseMetaData的API文档。

  以下有一些关于DatabaseMetaData的常用方法:

  ·getDatabaseProductName:获取数据库的产品名称

  ·getDatabaseProductName:获取数据库的版本号

  ·getUserName:获取数据库的用户名

  ·getURL:获取数据库连接的URL

  ·getDriverName:获取数据库的驱动名称

  ·driverVersion:获取数据库的驱动版本号

  ·isReadOnly:查看数据库是否只允许读操作

  ·supportsTransactions:查看数据库是否支持事务

例1:

  简单地获取一些常用的数据库综合信息。

复制代码

 1 public void testDatabaseMetaData() throws SQLException {
 2         Connection conn = JdbcUtils.getConnection();
 3         DatabaseMetaData dbMetaData =  conn.getMetaData();
 4         //获取数据库产品名称
 5         String productName = dbMetaData.getDatabaseProductName();
 6         //获取数据库版本号
 7         String productVersion = dbMetaData.getDatabaseProductVersion();
 8         //获取数据库用户名
 9         String userName = dbMetaData.getUserName();
10         //获取数据库连接URL
11         String userUrl = dbMetaData.getURL();
12         //获取数据库驱动
13         String driverName = dbMetaData.getDriverName();
14         //获取数据库驱动版本号
15         String driverVersion = dbMetaData.getDriverVersion();
16         //查看数据库是否允许读操作
17         boolean isReadOnly = dbMetaData.isReadOnly();
18         //查看数据库是否支持事务操作
19         boolean supportsTransactions = dbMetaData.supportsTransactions();
20 }

复制代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值