1、MyBatis配置:
mybatis配置项分别是:properties、settings、typeAliases、typeHandlers、plugins、environments、mappers,这些配置项必须按照先后顺序进行配置
properties: 用于配置属性信息
settings: 用于配置MyBatis的运行时方式
typeAliases: 配置类型别名,可以在xml中用别名取代全限定名
typeHandlers: 配置类型处理器
plugins: 配置拦截器,用于拦截sql语句的执行
environments: 配置数据源信息、连接池、事务属性等
mappers: 配置SQL映射文件
例:
<property name="name1" value="value1"/>
<property name="name2" value="value2"/>
<property name="name3" value="value3"/>
<property name="nameN" value="valueN"/>
或:
<properties resource="config.properties" />
config.properties:
name1:value1
name2:value2
name3:value2
nameN:valueN
<settings>
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="enhancementEnabled" value="false" />
<setting name="defaultExecutorType" value="SIMPLE" />
</settings>
<typeAliases>
<typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />
<typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />
<typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />
</typeAliases>
<mappers>
<mapper resource="com.manager.data.maps.UserMapper.xml" />
<mapper resource="com.manager.data.maps.StudentMapper.xml" />
<mapper resource="com.manager.data.maps.ClassMapper.xml" />
</mappers>
或:
<mappers>
<package name="com.manager.data.maps"/>
</mappers>
2、MyBatis的主要成员:
Configuration MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中
SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互时的会话,完成必要数据库增删改查功能
Executor MyBatis执行器,是MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护
StatementHandler 封装了JDBC Statement操作,负责对JDBC statement的操作,如设置参数等
ParameterHandler 负责对用户传递的参数转换成JDBC Statement所对应的数据类型
ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandler 负责java数据类型和jdbc数据类型(也可以说是数据表列类型)之间的映射和转换
MappedStatement MappedStatement维护一条<select|update|delete|insert>节点的封装
SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
BoundSql 表示动态生成的SQL语句以及相应的参数信息
3、mybatis执行器:
什么是执行器?所有我们在应用层通过sqlSession执行的各类增删改查操作在做了动态sql和参数相关的封装处理后,都被委托给具体的执行器去执行,包括一、二级缓存的管理,事务的具体管理,Statement和具体JDBC层面优化的实现等等,所以执行器比较像是sqlSession下的各个策略工厂实现,用户通过配置决定使用哪个策略工厂
mybatis提供了两种类型的执行器,缓存执行器与非缓存执行器(使用哪个执行器是通过配置文件中settings下的属性defaultExecutorType控制的,默认是SIMPLE)
<settings>
<setting name="defaultExecutorType" value="REUSE" />
</settings>
BaseExecutor: BaseExecutor实现了大部分通用功能本地缓存管理、事务提交、回滚、超时设置、延迟加载等
SimpleExecutor: 该执行器类型不做特殊的事情,它为每个语句的每次执行创建一个新的预处理语句
ReuseExecutor: 该执行器类型会复用预处理语句
BatchExecutor: 它是批量执行器
CachingExecutor:
缓存执行器相对于其他执行器的差别在于,首先是在query()方法中判断是否使用二级缓存,虽然mybatis默认启用了CachingExecutor,但是如果在mapper层面没有明确设置二级缓存的话,就退化为SimpleExecutor了
4、MyBatis缓存
MyBatis提供查询缓存,用于减轻数据库压力,提高性能,MyBatis提供了一级缓存和二级缓存
一级缓存是SqlSession级别的缓存,每个SqlSession对象都有一个哈希表用于缓存数据,不同SqlSession对象之间缓存不共享,同一个SqlSession对象执行2遍相同的SQL查询,在第一次查询执行完毕后将结果缓存起来,这样第二遍查询就不用向数据库查询了,直接返回缓存结果即可,MyBatis默认是开启一级缓存的(两次相同的查询之间,如果有数据的增删改,一级缓存自动失效)。
二级缓存是mapper级别的缓存,二级缓存是跨SqlSession的,多个SqlSession对象可以共享同一个二级缓存,不同的SqlSession对象执行两次相同的SQL语句,第一次会将查询结果进行缓存,第二次查询直接返回二级缓存中的结果即可,MyBatis默认是不开启二级缓存的,可以在配置文件中使用如下配置来开启二级缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
Mapper映射文件中添加一行:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
flushInterval(刷新间隔)可以被设置为任意的正整数,而且它们代表一个合理的毫秒形式的时间段。默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。 size(引用数目)可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。 readOnly(只读)属性可以被设置为true或false。
只读的缓存会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。
如果已经开启二级缓存的mapper里面某个查询不需要缓存,可以使用useCache=”false”禁用二级缓存:
<select id="selectById" resultMap="BaseResultMap" parameterType="java.lang.String" useCache="false">
当SQL语句进行更新操作(删除/添加/更新)时,会清空对应的缓存,保证缓存中存储的都是最新的数据
5、mybatis拦截器:
MyBatis允许在映射语句执行的某些点拦截方法调用,默认情况下,MyBatis允许插件(plugins)拦截下面的方法:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
如:
@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class PageInterceptor implements Interceptor {
判断是否带分页参数
查询总条数
根据sql组装limit查询分页记录
}