学习mybatis的总结

映射器(Mapper)

方式一:

 方式二:使用class文件注册

 注意:
1.接口和他的Mapper配置文件必须同名
2.接口和他的Mapper配置文件必须在同一个包下
方式三:使用包扫描注册

注意:
1.接口和他的Mapper配置文件必须同名
2.接口和他的Mapper配置文件必须在同一个包下

八.生命周期和作用域

       

生命周期、作用域是至关重要的,因为错误的使用会导致非常严重的并发问题

SqlSessionFactoryBuilder
1.这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了
2.局部变量
SqlSessionFactory
1.可以想象成连接池
2.SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
3.SqlSessionFactory的最佳作用域是应用作用域
4.最简单的就是使用单例模式或者静态单例模式

SqlSession
1.连接到的一个请求,可以想象成数据库连接池中的一个请求。
2.SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域
3.用完之后需要赶紧关闭,否则资源被占用!(类似于数据库连接池的回收)

解决属性名和数据库字段名不一致问题
ResultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

然后在引用它的语句中设置 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

分页

使用Limit实现分页

  • Mapper接口,参数为map

1、修改Mapper文件

3、在测试类中传入参数测试

推断:起始位置 = (当前页面 - 1 ) * 页面大小

动态SQL
1.什么是动态SQL
动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句也就是复杂的SQL语句。
官网描述:
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

MyBatis缓存介绍
MyBatis 是一款优秀的持久层框架,它提供了缓存功能来减少数据查询时的数据库交互次数,从而提高查询性能。MyBatis 的缓存分为一级缓存和二级缓存两种类型。

缓存分类
根据缓存存放位置,缓存可以分为本地缓存和分布式缓存。根据缓存作用范围,缓存可以分为永久缓存和临时缓存。在 MyBatis 中,根据作用范围,分别有一级缓存和二级缓存两种类型。

一级缓存与二级缓存的区别
1.作用范围
一级缓存的作用范围是 SqlSession 的生命周期,二级缓存的作用范围是整个应用程序的生命周期。

2.实现方式
一级缓存是通过 SqlSession 内置的一个 HashMap 来实现的,而二级缓存则是通过配置 Cache 接口来实现的。

3.共享机制
一级缓存只能在同一个 SqlSession 内部共享,二级缓存可以在多个 SqlSession 之间共享。

4.缓存规则
一级缓存默认开启并且无法关闭;二级缓存需要手动开启并进行配置。

MyBatis缓存原理
MyBatis 的缓存本质上是一个 HashMap,它的键是查询语句和参数的组合,值是查询结果。当我们执行一个查询时,MyBatis 会先从缓存中查找对应的查询结果,如果缓存中存在,则直接返回缓存的结果;如果缓存中不存在,则从数据库中查询数据,并将查询结果存入缓存中。

每个 SqlSession 都有自己的缓存,因此在不同的 SqlSession 中执行同一个查询语句,它们所使用的缓存是不同的。同时,MyBatis 的缓存是基于引用计数的机制实现的,当查询语句被多次引用时,缓存的引用计数会加 1,只有当引用计数为 0 时,缓存才会被真正的清除。

使用缓存
1.一级缓存的使用
在同一个 SqlSession 中,同样的 SQL 查询只会执行一次,并把查询结果缓存到 SqlSession 内置的 HashMap 中。下面是示例代码:

2.二级缓存的使用
需要在 XML 映射文件中添加 <cache> 标签来开启二级缓存,并指定缓存实现类。下面是示例代码:

<cache/>
需要注意的是,如果要使用二级缓存,需要让你的实体类实现 Serializable 接口。

缓存的使用场景
缓存的使用场景主要包括以下两种情况:

1.某些数据被经常访问
如果某些数据经常被访问,那么将这些数据缓存起来,可以减少数据库交互次数,提高系统性能。

2.数据存储较大,查询耗时较长
如果某些数据存储较大,且查询这些数据的效率比较低,那么可以将查询结果缓存下来,下次需要查询时,直接从缓存中读取。

二级缓存的使用原则
只能在一个命名空间下使用二级缓存
由于二级缓存中的数据是基于namespace的,即不同namespace中的数据互不干扰。在多个namespace中若均存在对同一个表的操作,那么这多个namespace中的数据可能就会出现不一致现象。
在单表上使用二级缓存
如果一个表与其它表有关联关系,那么久非常有可能存在多个namespace对同一数据的操作。而不同namespace中的数据互补干扰,所以就有可能出现多个namespace中的数据不一致现象。
查询多于修改时使用二级缓存
在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值