一、分页,一种是在sql中实现(推荐使用),一种是在java中实现
@Test
public void test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
HashMap stringIntegerHashMap = new HashMap<>();
stringIntegerHashMap.put("startIndex",0);
stringIntegerHashMap.put("pageSize",2);
List userByLimit = userDao.getUserByLimit(stringIntegerHashMap);
for (User user : userByLimit) {
System.out.println(user);
}
sqlSession.close();
}
二、注解开发
@Select("select * from user where id = #{id}")
User getUserById(@Param("id") int id);
@Param("id") 引用类型的参数或String类型,需要加上,引用类型不需要加,两个以上的基本类型必须加,
即使用这种注解,在config中也要绑定mapper,class等于接口
不绑定不行。congfig 中绑定了谁,才会扫描谁
三、lombok
@Data,放在类上,作用在所有属性上,放在属性上,作用在该属性上
不支持构造器重载,需要手动添加。
缺点:改变了java语言的书写,减少了本该存在的东西,不便于阅读,如果到处充斥着这种插件,会极大降低java语言的严谨性,迟早被其他语言取代。
四、studentMapper接口和studentMapper.xml存放问题
接口放在java文件夹下的dao文件夹,xml放在resource文件夹下的dao文件夹,在config配置mapper中,填写dao/studentMapper.xml,注意:resource文件夹下也应该能展开,如果展不开,一级一级的建,不要加.一次建完,生成的target文件,会自动把接口和xml文件放在同一个包里。
五、多对一 association 社团 property 财物
方法1、子查询
方法2、连表查询 推荐使用
六、一对多
方法一、
方法二、
七、动态sql,本质动态sql还是sql语句,只是增加一个逻辑代码,根据不同的条件生成不同的sql语句
1、if(where标签,可以自动去除第一个可以插入的and)
2、choose(when,otherwise)和java的 swich case类似
3、trim(where,set)set会拼接set 语句,并且删除掉无关的逗号
4、foreach
5、SQL片段 sql标签
把相同的sql提取出来,用的地方再includ引用
title = #{title} author = #{author} and views = #{views}
七、缓存,一级缓存默认开启(sqlsession级别,一个用户一个缓存),二级缓存需要设置(一级缓存丢出来的东西给二级缓存,二级缓存不同的sqlSession都可以使用,前提是要在同一个namespace,也就是Mapper.xm中才有效)
注意事项:在mybatis的paramaType类型,是与java不同的,比如_int表示int。在接口中要把形参前面加上@param(这是规范)
1、一级缓存:测试步骤:1、开启日志 2、查询两次相同的数据 3、
缓存失效的前提:1、查询不同的东西,2、增删改操作,3、手动清理
一级缓存相当于一个map,用的时候取
2、二级缓存:开启步骤1、在config.xml中开启二级缓存
2、在当前Mapper.xml中增加
容易出现问题:报错,NotSerializableException,没有序列化接口。需要先将实体类 implements Serializable(也是规范要求)
结论:所有的数据都会先放到一级缓存中,只有session提交或者失效后,才会转到二级缓存中
用户新建查询任务,先查二级,再查一级,再查数据库
3、自定义缓存 Ehcache(现在用redis做缓存,了解即可,实际不会用)
1、导包 2、
redis缓存就是K V键值对保存