明月清风精进不止 2020-01-07
MyBatis事一个半自动化的持久层框架
jdbc:sql夹在Java代码块里,耦合度高,容易导致硬编码内伤
维护也不方便,因为直接写死了
hibernate:内部自动生成sql,但是不容易维护优化
基于全映射的全自动框架,字段过多,而且进行部分映射的时候会相对困难点,致使性能下降。
mybatis:sql和java分开,各自的功能比较清晰。
#{}:是以预编译的形式,把餐宿设置到sql语句中,Prepared Statement,防止sql注入
${}:取出的值直接拼装到sql语句中;会有安全问题
在大多情况下,我们取出参数的值都应该去使用#{}
比如分表排序,按照年份分表拆分:
select * from ${year}_salary where xxx;
select * from tab_employee order by ${f_name} ${order}
#{}:更丰富的用法:
规定参数的一些规则
javaType,jdbcType,mode(存储过程),numericScale,resultMap,typeHander,jdbcTypeName,expression(未来准备支持的功能)
jabcType通常需要在某种特定的条件下被设置:如:#{email,jdbcType=NULL}
在我们数据为null的时候,有些数据库可能不能识别mybatis对null的默认处理,比如Oracle(报错)
JdbcType OTHER,无效的类型,因为mybatis对所有的null都映射的是原声Jdbc的OTHER类型,oracle不能正确处理。
MyBatis包含了一i个非常强大的查询缓存特性,缓存可以极大的提升查询效率。
MyBatis系统中默认定义了两级缓存
1.默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启
2.二级缓存需要手动开启配置,它是基于namespace级别的缓存
3.为了提高扩展性。MyBatis定义了缓存接口Cache。我们可以通过Cache接口来自定义二级缓存
一级缓存(本地缓存):与数据库同一次会话期间查询到的数据会放在本地缓存中,如若以后需要再次获取相同的数据,直接从缓存中取。
注:一级缓存作为SqlSession级别的缓存,所以一级缓存之间不互通。
一级缓存失效情况(没有使用到当前以及缓存情况,效果就是,还是需要再向数据库发出查询)
1.sqlSession不同
2.SQL Session相同,查询条件不同
3.SQL Session相同,两次查询之间执行了增删改查
4.SQL Session相同,手动清除了一级缓存(缓存清空)
二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存
工作机制:
1.一个会话,查询一条数据,这个数据就会被放在房前会话的一级缓存中
2.入股偶会话关闭,一级缓存中的数据就会被保存到二级缓存中,新的会话查询,就可以参照二级缓存中的内容
3.SQL Session===》Employee Mapper==》Employee
Department Mapper==》Department
不同的namespace查出的数据会放在自己对应的缓存中(map)