20201120_陈宇_

日志

学习总结:

延迟加载:

​ 在需要用到数据时才进行加载,不需要用到数据时就不加载数据,延迟加载也称懒加载

​ 好处:

​ 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张 表速度要快

​ 坏处:

​ 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工作也要消耗 时间,所以可能造成用户等待时间变长,造成用户体验下降

开启 Mybatis 的延迟加载:

​ Mybatis默认没有打开懒加载配置,我们需要在 Mybatis 的配置文件 SqlMapConfig.xml 文件中添加延 迟加载的配置

标签:主要用于加载关联的集合对象

​ select 属性:用于指定查询 account 列表的 sql 语句,所以填写的是该 sql 映射的 id

​ column 属性:用于指定 select 属性的 sql 语句的参数来源,上面的参数来自于 user 的 id 列,所 以就写成 id 这一个字段名了

​ 注:select 属性中不一定是其他xml(DAO/Mapper)文件中的方法,也可以是当前xml中对应 的方法

​ 如果column属性需要多个参数时,使用 {key1=value1,key2=value2} 这种方式传参

Mybatis 缓存:

​ 缓存(也称作cache)的作用是为了减去数据库的压力,提高数据库的性能

​ Mybatis内部存储缓存使用一个HashMap缓存数据,key为hashCode+sqlId+Sql语句,value为从查询出来映射生成的java对象

​ 一级缓存:

​ 一级缓存的作用域是同一个SqlSession,在同一个sqlSession中 两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓 存中获取数据将不再从数据库查询,从而提高查询效率

​ 当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了

​ Mybatis默认开启一级缓存(本地的会话缓存)

​ 一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush、close或提交事务,它就存在

​ 一级缓存的范围有SESSION和STATEMENT两种,默认是SESSION

​ 二级缓存:

​ 二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率

​ 二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的

​ 二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询的数据缓存在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分

​ sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域,防止脏读

​ 总结:

​ Mybatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能

​ 二级缓存的其他设置:

​ flushInterval:(刷新间隔)可以被设置为任意的正整数,表示以毫秒为单位的时间段。默认情况不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

​ Size:(引用数目)可以被设置为任意正整数,表示被缓存对象的数量,默认值是1024。建议该项配置要根据运行环境的可用内存大小进行设置

​ readOnly:(只读)该属性可以被设置为true或false。只读的缓存会给所有调用者返回缓存对象的相同实例,因此这些对象不能被修改。因此提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝。运行速度慢一些,但是安全,因此默认是false

​ eviction: 清除策略,有以下几种:

​ 默认的清除策略是 LRU

注解:

​ @Results 注解:代替的是标签,该注解中可以使用单个@Result 注解,也可以使用@Result 集合

​ @Results({@Result(),@Result()})或@Results(@Result())

​ @Result 注解:代替了标签和标签

​ 属性介绍:

​ id 是否是主键字段 column 数据库的列名

​ property 需要装配的属性名

​ one 需要使用的@One 注解(@Result(one=@One)())

​ many 需要使用的@Many 注解(@Result(many=@many)())

​ @One 注解(一对一):代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象

​ 属性介绍:

​ select 指定用来多表查询的 sqlmapper

​ fetchType 会覆盖全局的配置参数 lazyLoadingEnabled

​ 使用格式:

​ @Result(column=" ",property="",one=@One(select=""))

​ @Many 注解(多对一):代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合

​ 注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType

​ (一般为 ArrayList)但是注解中可以不定义;

​ 使用格式:

​ @Result(property="",column="",many=@Many(select=""))

逆向工程:

​ 逆向工程是指根据数据库生成Java代码,正向工程是指根据java代码生成数据库

​ 特点:

​ 可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、 pojo)

学习心得:

​ 今天学完了mybatis框架的基本知识,感觉框架确实简化了很多操作,注解开发感觉比xml更简单,可能真是如浩哥所说的还没有那个地步,xml感觉更容易懂一些吧,今天还看到了传说中的代码生成,以后是不是就可以开始使用代码生成器了?那不是直接开始少写好多代码了嘛,感觉就是靠谱。

标签

评论


© 2021 成都云创动力科技有限公司 蜀ICP备20006351号-1