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感觉更容易懂一些吧,今天还看到了传说中的代码生成,以后是不是就可以开始使用代码生成器了?那不是直接开始少写好多代码了嘛,感觉就是靠谱。
近期评论