前导必备
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 }