配置数据库
驼峰命名,开启日志,定义别名,配置路径,开启二级缓存
properties里面的数据
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
dbuser=root
dbpassword=123456
<!-- 要加载数据库的资源文件,然后在数据库的连接池的配置中可以使用-->
<properties resource="db.properties"/>
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 支持驼峰式命名规范,数据库里面式first_name,而User中式firstName 驼峰形式-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 给User全类名,起一个别名,方便我们使用,别名不区分大小写-->
<typeAliases>
<typeAlias type="com.haina.mybatis.model.User" alias="user"/>
<!-- 该包下的所有类的别名,都是类名-->
<!-- <package name="com.haina.mybatis.model"/>-->
<!-- 以上这两条不能混着用,只能用一个,要不就乱套了-->
</typeAliases>
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${dbuser}"/>
<property name="password" value="${dbpassword}"/>
</dataSource>
</environment>
</environments>
<!-- 告诉mybatis 要加载得xml得路径在哪-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
Mybatis缓存机制
把相同条件的查询,合并成一个。
数据库的数据存储在硬盘中,程序运行过程中变量的值,对象的值式存储在内存中(堆)
出现过就放在内存中,
缓存的作用:就是加快我们程序的运行效率。
一级缓存(本地缓存):
特点:默认开启,声明周期短(不会占用太多的控件),session,会话开启到会话关闭就失效
sqlSession级别的缓存。一级缓存是一直开启的;SqlSession级别的一个Map,与数据库同一次会话期间的查询到的数据会放在本地缓存中。以后如果需要获取相同的数据,直接从缓存中拿,不会再去查询数据库。
一级缓存失效:
(1)openSession不同
(2)open Session相同,单查询条件不同s
(3) openSession相同,查询条件不同,两次查询间执行过增删改操作
(4)一级缓存呗清空,openSession.clearCache()
二级缓存(全局缓存):
特点:全局缓存(相当于dao级别的缓存),声明周期比较长(可以跨session),不能存放过多的数据。
占用空间大,所以要有限定条件加以控制。
基于namespace级别的缓存:一个namespace对应一个二级缓存;
原理:一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容;而不同Mapper有不同的namespace,那么由不同Mapper经过查询产生的数据,就会存储到不同的缓存区域(Map)
在
核心配置文件中加入
<setting name="cacheEnabled" value="true"/>
在sql语句中
<!-- 表示这个方法要使用缓存 加useCache="true"-->
<select id="selectById" resultType="USER" useCache="true">
select*from user where id = #{id}
</select>
序列化异常: implements Serializable,缓存的存储,就会出现序列化,反序列化
缓存的意义:缓存到本地内存种,先查缓存在查数据库
MyBatis:xml文件和注解两种形式,注解可以用一个条件查询
xml虽然麻烦一点但是比较灵活
缓存刷新,在UserMapper.xml中
<cache>
<property name="eviction" value="LRU"/>
<!-- 缓存刷新 10秒-->
<property name="flushInterval" value="10"/>
<!-- 大小-->
<property name="size" value="10"/>
</cache>