public interface UserMapper {
List<User> findAllUsers();
User findUserById(int id);
UserInfo findUserInfoById(int id);
Order findOrderById(int id);
}
<resultMap id="UserMap" type="User">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="birthday" property="birthday" />
<result column="sex" property="sex" />
<result column="address" property="address" />
<association property="info" select="findUserInfoById" column="id" fetchType="eager"/>
<collection property="order" select="findOrderById" column="id" fetchType="lazy"/>
resultMap>
<resultMap id="OrderMap" type="Order">
<id column="oid" property="oId"/>
<result column="user_id" property="userId"/>
<result column="create_time" property="createTime"/>
resultMap>
<select id="findUserById" resultMap="UserMap">
select * from user where id = #{id};
select>
<select id="findUserInfoById" resultType="com.jwl.pojo.UserInfo">
select * from user_info where id = #{id};
select>
<select id="findOrderById" resultMap="OrderMap">
select * from tb_order where user_id = #{id};
select>
public class TestStore {
@Test
public void test1() throws IOException {
SqlSession sqlSession = MyBatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.findUserById(1);
System.out.println(userById);
sqlSession.commit();
//关闭资源,只需要关闭sqlSession
sqlSession.close();
}
@Test
public void test2() throws IOException {
SqlSession sqlSession = MyBatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user);
sqlSession.commit();
//关闭资源,只需要关闭sqlSession
sqlSession.close();
}
@Test
public void test3() throws IOException {
//懒加载
SqlSession sqlSession = MyBatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.findUserById(1);
System.out.println(user.getUsername());
System.out.println("------------------");
user.getOrder().forEach(System.out::println);
sqlSession.commit();
//关闭资源,只需要关闭sqlSession
sqlSession.close();
}
}
现在我们每次执行相同的SQL语句都是去数据库中查询,存在效率问题。
MyBatis框架提供了缓存策略,通过缓存策略可以减少查询数据库的次数,提升系统性能。
在MyBatis框架中缓存分为一级缓存和二级缓存。
一般来说缓存在内存中
一级缓存是sqlSession范围的缓存,只能在同一个sqlSession内部有效。它本身已经存在,一级缓存不需要手动处理,可以直接使用。
第一次查询数据时,会将查询的数据放入一级缓存中。后面的相同查询直接从缓存中获取。
一级缓存是 SqlSession 范围缓存。当调用 SqlSession 的修改、添加、删除、提交、关闭等方法时,一级缓存会被清空。
清除缓存
sqlSession.clearCache();
二级缓存是mapper映射级别缓存,作用范围跨越SqlSession,即可以在多个SqlSession之间共享二级缓存数据。
二级缓存关键点
1.实体类需要实现Serializable接口
2.在myBatis全局配置文件中配置
3.在mapper.xml文件中配置
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="cacheEnabled" value="true"/>
settings>
configuration>
<mapper namespace="com.jwl.mapper.UserMapper">
<cache/>
mapper>
如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。