mybatis实现mapper代理,mytais的缓存机制

1、mybatis实现mapper代理
简单来说,就是未来我们需要得到一个mybatis的代理对象,去为我们执行对应的功能。
第一步:
创建一个实体类的mapper,创建一个实体的dao接口文件,
注意一下配置:
这里写图片描述
注意: xml文件的namespace必须指向接口
里面sql片段的名字必须和对应方法名一样

mapper就这个接口给代理了。以后我们要调用这个sql片段,我们就不需要找xml的sql片段的路径,只需要找到对应的接口的对应方法。

在使用mybatis的时候,我们就值需要通过session获取我们mapper的代理,代码如下:

package com.xingxue.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.xingxue.dao.GoodsDao;
import com.xingxue.entity.TypeBean;

public class MyBatisUtils3 {

    public static void main(String[] args) throws IOException {

        //获取会话工厂
        InputStream is = Resources.getResourceAsStream("com/config/mybatis-config.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is); 

        //获取会话
        SqlSession session = factory.openSession();

        //获取mapper代理对象
        GoodsDao dao = session.getMapper(GoodsDao.class);

        HashMap<String, Object> param = new HashMap<String, Object>();
        param.put("id", 5);
        HashMap<String, Object> result = dao.selectGoodsById(param);
        System.out.println(result);
    }

}

mybatis缓存:
缓存就是一块临时区域,用于存储临时数据,以前使用的内存缓存,但是由于数据集的增大,一般的内存缓存已经不能满足日常需求了。所以现在普遍使用硬盘缓存。(redis),只有查询才使用缓存
缓存的出现是由于我们频繁访问数据库的统一大量数据, 对于我们来说,如果频繁操作数据库,会让我们数据负荷很大,所以我们就采用在我们的程序创建一块临时区域,来存储需要频繁访问的数据,下一个在要访问就不需要到数据库去获取了。直接到我们的缓存获取。

mybatis自带2个缓存,但是生产环境估计都很少使用
一级缓存: 强制使用
mybatis一级缓存是session自带的缓存,也叫session缓存, 这个缓存是session自带的,我们没有权利去取消或者不使用,就被强制使用了。
当我们利用session去查询数据的时候,session先不到数据库查询数据,先到一级缓存查询是否又该ID标的数据,如果有直接获取,不到数据库查询了,如果没有从数据库查询出来,先放到session缓存里面,然后在返回个调用者。
此缓存的生命周期为session开启到seesin关闭,同时执行DML操作,缓存会被清空, 因为DML操作会造成数据脏读。

二级缓存: 我们通过配置使用
二级缓存是第三方的缓存,二级缓存又成sessionFactory缓存,可以跨session访问,生命周期从sessionFactory开启到sessionFactory关闭。mybatis没有开发自己的二级缓存,但是可以整合其他的二级缓存, 然后我们就直接使用,oscache、ehcache等,redis,这个redis是硬盘级别的缓存。

当我们每次 查询数据的时候,首先是到一级缓存查看是否存在该对象,如果有直接返回,如果没有就去二级缓存进行查看,如果有直接返回,如果没有在发送SQL到数据库查询数据,
当SQL发送查询回该数据的时候,mybatis会把该对象以主键为标记的形式存储到二级缓存和一级缓存,如果返回的是集合,会把集合打散然后以主键的形式存储到缓存。一级缓存和二级缓存只针对以ID查询的方式生效,如果是集合查询,其他字段查询都无法使用缓存机制,

目前项目开发通常使用redis这个缓存, 不是只支持主键了。

猜你喜欢

转载自blog.csdn.net/sky274548769/article/details/81355434