java学习day35-三大框架-MyBatis(六)--mapper接口开发/缓存

使用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,不允许我们修改
原文地址:https://www.cnblogs.com/liqbk/p/13172642.html