参考资料
1.1mybatis中文帮助文档: https://mybatis.org/mybatis-3/zh/index.html
1.2 maven仓库: https://mvnrepository.com/
搭建项目测试
2.1 idea新建一个空的maven项目,删掉src目录,看起来干净些。Pom文件导入需要的Mybatis、Mysql、Junit、Log4j的坐标依赖。
2.2 新建一个子项目,开始操作:
step1:resources文件下新增mybatis-config.xml配置文件。
<!-- mybatis核心配置文件 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
step2:从XML中构建SqlSessionFactory
step3:编写数据库操作组合套餐:实体类+dao接口+mapper.xml
<!-- SQL语句映射 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="接口类全路径">
<select id="接口类中对应的方法名" resultType="返回的对象类的全路径">
** SQl语句 **
</select>
</mapper>
写完了记得在mybatis-config.xml里配置mapper
step4:测试验证
step5:加上日志
运行测试打印日志
生命周期和作用域
关键对象的生命周期和作用域:作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
一旦创建了 SqlSessionFactory,就不再需要它了
局部变量
SqlSessionFactory
可以想象成类似数据库连接池
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
因此 SqlSessionFactory 的最佳作用域是应用作用域
最简单的就是使用单例模式或者静态单例模式
SqlSession
连接到连接池的一个请求
SqlSession 的实例不是线程安全的,因此不能被共享,所以它的最佳的作用域是请求或方法作用域
用完之后需要赶紧关闭,否则资源被占用
配置说明
配置项有强制的顺序要求:
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
4.1 属性(properties):同一个属性内部外部都有配置的时候,优先读取的内部配置会被覆盖。
外部配置:
最终password的取值是123456.
4.2 设置(Settings)[常用的]:
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载:可用值true|false
<setting name="lazyLoadingEnabled" value="true"/>
开启全局缓存:可用值true|false
<setting name="cacheEnabled" value="true"/>
日志配置:key和value的值必须和提供的可用值完全一致。
可用值SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
<settingname="logImpl"value="LOG4J"/>
4.3 类型别名(typeAliases):仅用于 XML 配置,意在降低冗余的全限定类名书写
<typeAliases>
<typeAliastype="com.jerry.model.User"alias="user"/>
<!-- 可以指定包路径,扫描全部,默认别名为类名小写 -->
<!--<package name="com.jerry.model"/>-->
</typeAliases>
4.4 环境(environments):可以配置多个,但只有default指定的生效。
<environmentsdefault="development">
<environmentid="development">
<transactionManagertype="JDBC"/>
<dataSourcetype="POOLED">
<propertyname="driver"value="${driver}"/>
<propertyname="url"value="${url}"/>
<propertyname="username"value="${username}"/>
<propertyname="password"value="${password}"/>
</dataSource>
</environment>
</environments>
需要注意的是transactionManager(事务管理器)的值有JDBC和MANAGED,后者不常用是因为默认会关闭连接。而大多数时候使用容器是不希望出现关闭连接的情况的。
4.5 映射器(mappers):使用相对于类路径的资源引用,或完全限定资源定位符,或类名和包名等。
<mappers>
<mapperresource="com/jerry/dao/UserMapper.xml"></mapper>
<mapperresource="com/jerry/dao/PersonMapper.xml"></mapper>
</mappers>
5. Mybatis的缓存
简介
什么是缓存
存在内存中的临时数据;将用户经常查询的数据放在缓存(内存)中,用户查询就不用从硬盘(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
为什么用缓存
减少和数据库的交互次数,减少系统开销,提高系统效率。
什么样的数据使用缓存
经常查询并且不经常改变的数据。
Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大地提升查询效率。
Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存。
默认情况下,只有一级缓存开启。(SqlSession级别的缓存,也称为本地缓存)
二级缓存需要手动开启和配置,是基于namespace级别的缓存。
Mapper的namespace下开启二级缓存
<mapper namespace="com.jerry.dao.UserDao">
<!-- 二级缓存配置 -->
<cache/>
<select id="getUserById" resultType="user" useCache="true">
select * from user where id = #{id}
</select>
</mapper>
mybatis-config.xml中显示地告知开启了二级缓存,虽然默认是开启的.(至少算个好的习惯)
<settings>
<!-- 显示地告知开启了二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
注意:使用二级缓存需要将实体类序列化,不然后会报错:
org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.jerry.model.User
Mybatis中缓存的清除策略
LRU-最近最少使用:移除最长时间不被使用的对象(常用)
FIFO-先进先出:按对象进入缓存的顺序来移除它们(常用)
SOFT-软引用:基于垃圾回收器状态和软引用规则移除对象
WEAK-弱引用:更积极地基于垃圾回收器状态和弱引用规则移除对象
缓存失效的场景
查询不同的数据:查1查2然后查1 ->第一次的1不走缓存, 2不走缓存,第二次的1走缓存
增删改操作,可能会改变原来的数据,所以必定会刷新缓存
查询不同的Mapper.xml
单次SqlSession连接中手动清理缓存:sqlSession.clearCache();
缓存图解:
如果这篇博客帮到了你,那么它的存在就有意义。不妨点个赞分享一下,Thanks.