MyBatis学习(3)

第五章:

  1. 数据库的属性配置文件: 把数据库连接信息放到一个单独的文件中。 和mybatis主配置文件分开。
    目的是便于修改,保存,处理多个数据库的信息。

    1. 在resources目录中定义一个属性配置文件, xxxx.properties ,例如 jdbc.properties
      在属性配置文件中, 定义数据,格式是 key=value
      key: 一般使用 . 做多级目录的。
      例如 jdbc.mysql.driver , jdbc.driver, mydriver
      jdbc.driver=com.mysql.jdbc.Driver
      jdbc.url=jdbc:mysql//…
      jdbc.username=root
      jdbc.password=123456

      <!--指定properties文件路径 从类路径根开始查找-->
          <properties resource="jdbc.properties"/>
      

    2. 在mybatis的主配置文件,使用 指定文件的位置
      在需要使用值的地方, ${key}

<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>

2.mapper文件,使用package指定路径
在MyBatis-config文件中可以指定多个mapper文件 第一个中方式直接在中加入多个
注意mapper的路径从类路径的根开始(target/classes)

    <!--第二种方式: 使用包名
        name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
        使用package的要求:
         1. mapper文件名称需要和接口名称一样, 区分大小写的一样
         2. mapper文件和dao接口需要在同一目录
    -->
    <package name="com.bjpowernode.dao"/>
</mappers>

第六章:PageHelper

PageHelper做数据分页的。(国人写的)

  1. maven中添加依赖

    <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>5.3.0</version>
    </dependency>
    
  2. 在MyBatis-config中配置插件
    注意:MyBatis-config配置顺序如下properties, settings,plugins;

    <!--在<plugins>标签中配置-->
    <!--配置pageHelper插件放在setting后面-->
        <plugins>
            <plugin interceptor="com.github.pagehelper.PageInterceptor" />
        </plugins>
    
  3. 配置完成后在使用时调用 pagehelper.startpage(页码(int),每页显示条数(int))方法 注意放在执行sql语句之前 输出会自动显示参数指定的几条


MyBatis的缓存机制

​ https://segmentfault.com/a/1190000041193993

缓存机制减轻数据库压力,提高数据库性能
mybatis的缓存分为两级:一级缓存、二级缓存
一级缓存:

​ 一级缓存为 sqlsession 缓存,缓存的数据只在 SqlSession 内有效。在操作数据库的时候需要先 创建 SqlSession 会话对象,在对象中有一个 HashMap 用于存储缓存数据,此 HashMap 是当前 会话对象私有的,别的 SqlSession 会话对象无法访问。

​ 具体流程:

​ 第一次执行 select 完毕会将查到的数据写入 SqlSession 内的 HashMap 中缓存起来

​ 第二次执行(可能多次) select 会从缓存中查数据,如果 select 同传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率

注意:

​ 1、如果 在一个SqlSession 执行了 DML 操作(insert、update、delete),并 commit 了,那么 mybatis 就会清空当前 SqlSession 缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现差异

​ 2、当一个 SqlSession 结束后那么他里面的一级缓存也就不存在了, mybatis 默认是开启一级缓存且默认作用范围时SESSION,也可以手动配置为STATEMENT(让一级缓存仅针对当前执行的SQL语句生效;),不需要配置二级缓存默认时没有开启的为false 需要手动在Mybatis-config中配置(中)

​ 3、 mybatis 的缓存是基于 [namespace:sql语句:参数] 来进行缓存的,意思就是, SqlSession 的 HashMap 存储缓存数据时,是使用 [namespace:sql:参数] 作为 key ,查询返回的语句作为 value 保存的,即{key=namespace:sql:参数,value=查询到的数据}

​ 4. 不同会话持有不同的一级缓存,本会话内的操作不会影响其它会话内的一级缓存。

二级缓存

二级缓存是 mapper 级别的缓存,也就是同一个 namespace 的 mapper.xml ,当多个 SqlSession 使用同一个 Mapper 操作数据库的时候,得到的数据会缓存在同一个二级缓存区域

二级缓存默认是没有开启的。需要在 setting 全局参数中配置开启二级缓存

开启二级缓存步骤:

1、conf.xml 配置全局变量开启二级缓存

<settings>
    <setting name="cacheEnabled" value="true"/>默认是false:关闭二级缓存
<settings>

2、在userMapper.xml中配置

<cache eviction="LRU" type="org.apache.ibatis.cache.impl.PerpetualCache" flushInterval="60000" size="512" readOnly="true"/>当前mapper下所有语句开启二级缓存

这里配置了一个 LRU 缓存,并每隔60秒刷新,最大存储512个对象,而返回的对象是只读的

若想禁用当前select语句的二级缓存,添加 useCache="false"修改如下:

<select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">

具体流程:

1.当一个sqlseesion执行了一次 select 后,在关闭此 session 的时候,会将查询结果缓存到二级缓存

2.当另一个sqlsession执行 select 时,(前提二级缓存开启时)首先会在他自己的二级缓存中找,如果没找到,就回去一级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能

注意:
  1. 如果 SqlSession 执行了 DML 操作(insert、update、delete),并 commit 了,那么 mybatis 就会清空当前 mapper 缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现差异(如果没有commit)就不会清空mybatis中的二级缓存

  2. mybatis 的缓存是基于[namespace:sql语句:参数]来进行缓存的,意思就是,SqlSessionHashMap 存储缓存数据时,是使用 [namespace:sql:参数] 作为 key ,查询返回的语句作为 value 保存的。

  3. Mybatis中需要在映射文件中添加<cache>标签来为映射文件配置二级缓存,也可以在映射文件中添加<cache-ref>标签来引用其它映射文件的二级缓存以达到多个映射文件持有同一份二级缓存的效果。

  4. 该语句可以在另一个mybatis-mapper中指定二级缓存(一个mapper拥有一个二级缓存 这里指定了缓存的指向)这样两个mapper可以共享一个二级缓存


<cache>标签如下所示。

属性含义默认值
eviction缓存淘汰策略。LRU表示最近使用频次最少的优先被淘汰;FIFO表示先被缓存的会先被淘汰;SOFT表示基于软引用规则来淘汰;WEAK表示基于弱引用规则来淘汰LRU
flushInterval缓存刷新间隔。单位毫秒空,表示永不过期
type缓存的类型PerpetualCache(永久缓存)
size最多缓存的对象个数1024
blocking缓存未命中时是否阻塞false
readOnly缓存中的对象是否只读。配置为true时,表示缓存对象只读,命中缓存时会直接将缓存的对象返回,性能更快,但是线程不安全;配置为false时,表示缓存对象可读写,命中缓存时会将缓存的对象克隆然后返回克隆的对象,性能更慢,但是线程安全false
属性含义
namespace其它映射文件的命名空间,设置之后则当前映射文件将和其它映射文件将持有同一份二级缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值