持久层
----------------------------------------------------------------------------------------------------------
一、MyBatics中#与$区别:
1、#:预处理,参数用占位符?代替,参数的替换发生在dbms中。
2、$:拼接字符串,参数的替换发生在动态解析过程中,容易引起sql注入。
3、只用$的情况 order by后面
4、$:解析的参数值不带引号(必须自己写)
5、#:解析的参数值 带引号(自带,不用明写)
----------------------------------------------------------------------------------------------------------
二、MyBatics中缓存
1、一级缓存:sqlsession级别,在同一个sqlsession中查询先从缓存中查,没有的话再从数据库中查,中间有增加、修改、删除的话清除缓存。
2、二级缓存,需要开启,如下:
(1)config文件中<setting name="cacheEnabled" value="true"/>
(2)mapper文件中加入cache标签<span style="font-size:18px;"><cache/></span>
(3)类实现Serializable接口
mapper级别的缓存,可以跨多个sqlsession,多个sqlsession共享二级缓存,二级缓存按照namespace分,一个namespace一个二级缓存。默认是关闭的。二级缓存缺点,如果是跨namespace的关联查询肯能查到脏数据。订单表一个缓存,详情表一个缓存,如果修改了订单表,详情表的缓存不会清空。spring整合中,每次查询都关闭sqlsession,清空缓存,只有遇到事务时一级缓存才有作用。
----------------------------------------------------------------------------------------------------------
三、MyBatis怎样启动加载的:
分为Mybatics单独加载和spring整合mybatics加载
Spring的配置文件中定义了sqlSessionFactory,这个bean实现了InitializingBean接口,该接口有个方法afterPropertiesSet,该方法在初始化bean属性设置完后执行,这里面生成sqlSessionFactory。sqlSessionFactory中设置数据源,解析mybatis-config.xml封装到Configuration和解析sql的xml文件封装到mapperLocations中。Spring的配置文件中定义了MapperScannerConfigurer这个bean,作用是把定义的Mybatics增删改查的接口封装成bean。
-----------------------------------------------------------------