错误代码:
<sql id="SELECT_SCGC">
select s.s_id as s_id , s.s_name as s_name , s.s_phone as s_phone , s.s_qq as s_qq , s.s_age as s_age , s.s_birthday as s_birthday , s.s_star as s_star , s.s_attr as s_attr,
c.clazz_id as clazz_id , c.c_name as c_name ,
g.g_id as g_id , g.g_name as g_name , g.g_createdate as g_createdate ,
y.c_id as c_id , y.c_name as c_name ,
m.m_id as m_id , m.m_name as m_name
</sql>
<select id="selectLimit" resultMap="StudentResultMap">
<include refid="SELECT_SCGC"></include>
from T_STUDENT s left join T_CITY y
on s.c_id = y.c_id
left join T_GROUP g
on s.g_id = g.g_id
left join T_CLAZZ as c
on s.clazz_id = c.clazz_id
left join M_S_FK ms
on s.s_id = ms.s_id
left join T_MARK as m
on ms.m_id = m.m_id
limit begin=#{begin}, size=#{size}
</select>
报错内容:
原因:误把limit的sql语句写错 正确的应该写为 limit #{begin},#{size}
ps:使用mybatis时,查询时一定要关闭资源
出现的问题:添加学生时,跳转到分页查询页面不显示添加的数据,重新加载页面才显示
由于mybatis的缓存机制
Mybatis 缓存【Cache】
缓存:缓冲存储,内存中的一块空间,用于存放用户反复查询的数据,有了缓存后,后续的查询都会直接从缓存中获取
好处:减少每次使用连接的资源的占用,提升查询效率,提升程序的运行效率
缺陷:占用大量的内存资源
缓存机制:
一级缓存:基于SqlSession的缓存【默认开启,没用】
造成查询结果闪动,查询操作一定要关闭SqlSession
二级缓存:基于Mapper文件的缓存(基于指定实体类的缓存) 默认不开启
使用二级缓存(开启手工设置)
1、在Mybatis框架中声明 使用二级缓存
<settings> <!--开启Mybatis二级缓存 cacheEnabled:启动mybatis二级缓存 值:布尔值 false:不启动【默认值】 true:开启 --> <setting name="cacheEnabled" value="true"/> </settings>
2、在需要进行缓存的操作中指定Mapper中指定使用缓存 在mapper文件中声明
<mapper namespace="com.bz.dao.StudentMarkDao"> <!--开启当前查询操作缓存--> <cache></cache>
3、要缓存的实体类必须实现序列化接口
public class Mark implements Serializable { private Integer id; private String name; private Date time; private String type; }
4、测试
每次查询都要使用全新的SqlSession对象模拟不同的用户
util类
//仅用于测试缓存 每次调用方法获取的都是全新的连接 实际开发不使用 public static SqlSession getSqlSession(){ return ssf.openSession(); }
Test测试类
注意:执行完查询操作要关闭SqlSession,只有关闭SqlSession后数据才会被放置在缓存区域
@Test
public void test1(){
System.out.println("------用户1查询所有------");
SqlSession sqlSession1 = MybatisUtil.getSqlSession();
//查询所有
UserDao userDao1 = sqlSession1.getMapper(UserDao.class);
List<User> users = userDao1.selectAll();
for (User user : users) {
System.out.println(user);
}
//关闭资源 只有在关闭SqlSession时Mybatis才会将查询数据放入缓存区中
sqlSession1.close();
System.out.println("------用户2查询所有------");
SqlSession sqlSession2 = MybatisUtil.getSqlSession();
//查询所有
UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
List<User> users2 = userDao2.selectAll();
for (User user : users2) {
System.out.println(user);
}
sqlSession2.close();
}
脏数据问题
脏数据:缓存的数据和数据库中实际数据不匹配
解决方案:在进行增删改操作时,除了完成数据操作之外,还需要清空缓存数据
Mybatis脏数据解决:Mybatis会在事务控制时自动清空花奴才能数据
注意:查询一定不要控制事务,增删改一定要控制事务