- 如果想看看mybatis中执行的sql语句,可以做如下配置:
- 在项目中导入log4j.jar相关jar包和log4j.properties文件;在mybatis的配置文件中配置如下即可:
- 注意:在测试一级缓存存在的时候,一定要保证session的统一
- 测试一级缓存的作用域:session
- 当用户发情请求时,并不是直接去数据库中查询,先到缓存中去命中,如果命中,则直接返回结果,如果缓存中没有要查找的数据,这个时候才会去数据库查询,
- 查询结束之后会将结果保存一份在缓存中,然后将结果返回,当下一次在发出相同的查询语句时,则直接从缓存中获取数据返回,不会去查询数据库。
- 注意:当执行增删改操作的时候,会刷新缓存。
- Mybatis的一级缓存默认是开启的。
- 注意:使用时要保证session的统一。
- a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个Executor对象。Executor对象中持有一个PerpetualCache对象;
- 当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
- b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
- c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
- d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用。
- 二级缓存是可以跨session的
- Mybatis的二级缓存也是默认开启的,但是还是要配置一下。
- eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。
- (1) LRU,最近最少使用的,最长时间不用的对象
- (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们
- flushInterval:刷新间隔时间,单位为毫秒
- size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。
- readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有办法修改缓存,他的默认值是false,不允许我们修改
- 虽然二级缓存的开关是默认开启的,但是要指明二级缓存的开关。
- 此外还需要在在核心配置文件的setting中配置cacheEnabled,同时pojo对象必须是可序列化的,既要求实现序列化接口;
- 注意:mybatis的二级缓存如果想有效果的话,则必须要让实体类实现序列化接口
- resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情。
- 事实上, 编写相似于对复杂语句联合映射这些等同的代码, 也许可以跨过上千行的代码。 ResultMap的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
- resultMap 常用属性
- id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
- result – 注入到字段或 JavaBean 属性的普通结果
- association – 一个复杂的类型关联;许多结果将包成这种类型,包含了另外一个对象的引用时,mybatis无法实现自动的映射,需要使用手动映射,同时autoMapping也需要手动的 开启
- 嵌入结果映射 – 结果映射自身的关联,或者参考一个
- collection – 复杂类型的集合
- 嵌入结果映射 – 结果映射自身的集,或者参考一个
- 拓展:当进行多表关联查询时,无法使用一个对象完成对结果的封装时,可以使用hashmap进行封装,
- 如果返回的是一个结果时,接口中的方法返回hashMap,xml中的resultMap中封装类型也是hashMap;
- 如果返回的是多个结果时,接口中的方法返回类型应该是list集合,xml中的sql语句封装类型还是hashMap,遵循mybatis的输入和输出参数类型。
- 1:1对1的映射
- 关联元素处理“有一个”类型的关系。一般用于一对一的对应关系
- property 映射到java类中的属性名称。
- javaType property属性的类型全路径,支持别名
- association的子标签用法和resultMap 子标签的用法一致。
- 注意:关联查询中的自动映射无效,需要手动开启。
- 需求:查询冠希哥和他老婆的信息,返回Husband对象 , 最简单的就是返回一个HashMap
- 注意:mybatis 自动封装只能完成简单类型的封装,复杂的类型无法封装 ---- 手动封装
Property:属性名字
ofType : 集合中封装的类型,就是泛型
javaType:属性的类型
集合元素的作用几乎和关联是相同的。实际上,它们也很相似,文档的异同是多余的。所以我们更多关注于它们的不同。他主要是用来处理一对多的映射关系
需求:查询10号部门中的员工信息和部门信息,返回部门对象(部门对象中包含了所有的员工信息)