使用mapper接口开发
使用mapper接口开发可以减少大量重复的代码,由代理对象实现,开发者专注写 sql 就可以了
SqlSession
类中提供了getMapper(Class mapper)
的方法, 自动实现dao的接口, 参数是指定的mapper接口的字节码对象
使用流程和注意事项
- 提供一个接口, 要求XxxMapper文件的全限定类名保持一致
- 指定的sql语句在接口中有对象的方法, 并且标签上的id值和方法的名字保持一致
- 要求sql标签上的resultType要和接口中对应方法的返回值类型保持一致(如果方法返回值是一个集合, 那么resultType只需要指定集合中的泛型即可
- 要求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,不允许我们修改