zoukankan      html  css  js  c++  java
  • mybatis接口开发和缓存

    使用mapper接口开发

    使用mapper接口开发可以减少大量重复的代码,由代理对象实现,开发者专注写 sql 就可以了

    SqlSession类中提供了getMapper(Class mapper)的方法, 自动实现dao的接口, 参数是指定的mapper接口的字节码对象

    使用流程和注意事项

    1. 提供一个接口, 要求XxxMapper文件的全限定类名保持一致
    2. 指定的sql语句在接口中有对象的方法, 并且标签上的id值和方法的名字保持一致
    3. 要求sql标签上的resultType要和接口中对应方法的返回值类型保持一致(如果方法返回值是一个集合, 那么resultType只需要指定集合中的泛型即可
    4. 要求sql标签上的参数类型要和接口对应的方法的参数类型保持一致, 如果是基本类型可以不写, 如果是引用类型, 最好使用标签的parameType属性指定, 如果有多个基本类型, 则使用@Param注解来指定名字, 否则可能会抛出异常

    使用案例

    namespace属性指定的就是接口的全类名, 一个接口对应一个xml配置文件

    <mapper namespace="com.test.dao.EmpMapper">
        <select id="findAll" resultType="com.test.pojo.Emp">
            select * from emp;
        </select>
    </mapper>
    

    接口:

    // com.test.dao.EmpMapper
    public interface EmpMapper {
    	public List<Emp> findAll();
    }
    

    测试:

    SqlSession类中有一个getMapper(Class mapper)的方法, 自动实现dao的接口, 参数是指定的mapper接口的字节码对象

    public class TestMyBatis03 {
    	static SqlSession session = null;
    	static {
    		// 为session进行初始化
    		try {
    			InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
    			SqlSessionFactory fac = new SqlSessionFactoryBuilder().build(in);
    			session = fac.openSession(true);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
        // 测试
        @Test
    	public void testFindAll() {
    		EmpMapper mapper = session.getMapper(EmpMapper.class);
    		List<Emp> emps = mapper.findAll();
    		for (Emp emp : emps) {
    			System.out.println(emp);
    		}
    	}
    }
    

    运行结果正常, 查询了所有的员工信息

    使用mapper的注解开发

    我们需要开启扫描, name属性的内容就是mapper接口所在的包

    <mappers>
        <package name="com.test.dao"/>
    </mappers>
    

    所以上面的内容我们不需要写mapper.xml的配置文件, mapper接口类内容如下:

    public interface EmpMapper {
    	@Select("select * from emp")
    	public List<Emp> findAll();
    }
    

    当然除了@Select注解, 还有对应的@Insert, @Update, @Delete注解

    mybatis缓存

    缓存的重要性是不言而喻的。 使用缓存, 我们可以避免频繁的与数据库进行交互, 尤其是在查询越多、缓存命中率越高的情况下, 使用缓存对性能的提高更明显。

    mybatis 也提供了对缓存的支持, 分为一级缓存和二级缓存。 但是在默认的情况下, 只开启一级缓存(一级缓存是对同一个 SqlSession 而言的)。

    一级缓存

    同一个 SqlSession 对象, 在参数和 SQL 完全一样的情况先, 只执行一次 SQL 语句(如果缓存没有过期)

    二级缓存

    二级缓存存在于 SqlSessionFactory 生命周期中。

    全局开关

    在 mybatis 中, 二级缓存有全局开关和分开关, 全局开关, 在 mybatis-config.xml 中如下配置:

    <settings>
      <!--全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存。 -->
      <setting name="cacheEnabled" value="true"/>
    </settings>
    

    默认是为 true, 即默认开启总开关。

    分开关

    分开关就是说在 Mapper.xml 中开启或关闭二级缓存, 默认是不开启的。

    <cache eviction="LRU" flushInterval="10000"/>
    

    cache标签属性

    • eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。

      • LRU(Least Recently Used),最近最少使用的,最长时间不用的对象

      • FIFO(First In First Out),先进先出,按对象进入缓存的顺序来移除他们

      • SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象

      • WEAK,弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,
        移除最长时间不用的对形象

    • flushInterval:刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当
      SQL被执行的时候才会去刷新缓存。

    • size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。
      这里配置的是1024个对象

    • readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有
      办法修改缓存,他的默认值是false,不允许我们修改

  • 相关阅读:
    BFC——块级格式化上下文
    深入浅出——float
    NodeJS 学习记录
    JavaScript高级程序设计 第六章 面向对象程序设计
    软件项目管理课感想
    第八周PSP 新折线图和饼图 个人时间管理
    第七周PSP 新折线图和饼图 个人时间管理
    Alpha、伪Beta 发布个人感想与体会
    ”单元测试“理解与感悟
    编程
  • 原文地址:https://www.cnblogs.com/zpKang/p/13176259.html
Copyright © 2011-2022 走看看