定义:
半封装半自动化的orm框架
流程&组件
Mybatis 核心组件/生命周期
SqlsessionFactoryBuilder|创建sqlsession|方法局部
SqlSessionFactory|创建sqlsession|应用的整个生命周期|单例
SqlSession|请求数据库处理事务|线程不安全
SQL Mapper|sqlsession事务之内|方法级别
源码流程:
序号 | (重点类)Class | (重点的方法或者属性)Method/attr |
获取数据源 | ||
1 | SqlSessionFactoryBuilder | build |
2 | XMLConfigBuilder | parse |
3 | XMLConfigBuilder | parseConfiguration |
4 | XMLConfigBuilder | environmentsElement |
5 | TypeAliasRegistry | resolveAlias |
执行mapper文件中的sql | ||
6 | XMLConfigBuilder | mapperElement |
7 | XMLMapperBuilder | parse |
8 | XMLMapperBuilder | configurationElement |
9 | XMLMapperBuilder | buildStatementFromContext |
10 | XMLStatementBuilder | parseStatementNode |
11 | MapperBuilderAssistant | addMappedStatement |
12 | MappedStatement |
|
操作sql | ||
13 | Configuration | newExecutor |
14 | BaseExecutor | Query [ Key == id+offset+limit+sql ] [ 有:handleLocallyCachedOutputParameters 无:queryFromDatabase ] |
DB<-->映射 | ||
15 | ResultSetWrapper | attr中包含:columnNames/classNames |
16 | ResultSetWrapper | ResultSetMetaData |
基础理论&常见面试题
>>xml中的标签
基础标签:
select/insert/update/delete
关联标签:
一对一:association
一对多:collection
判断标签:
if(场景应用:动态sql)
循环标签:
list(场景应用:批量添加)
>>mappers加载mapper
Mappers加载mapper文件有4种方式
Mappers标签->mapper标签中属性 1>resource/2>url/3>class
Mappers标签->4>package标签(优先级最高)
>>mapper中的设计模式
Builder模式|SqlSessionFactoryBuilder/
工厂模式|SqlSessionFactory/
单例模式|LogFactory/
代理模式|MapperProxy/
组合模式:/
模板方法模式|BaseExecutor
适配器模式/
装饰者模式/
迭代器模式|PropertyTokenizer/
>>mybatis中@param注解使用的四种场景
a方法有多个参数,需要 @Param 注解
b方法参数要取别名,需要 @Param 注解
c XML 中的 SQL 使用了 $ ,那么参数中也需要 @Param 注解
d动态 SQL
>>MyBatis中主键回填的两种实现方式
1>inser标签中添加:useGeneratedKeys/keyProperty属性
2>inser标签中嵌套selectKey标签
>>$#的区别
安全性:#可以防止sql注入
传参区别:$通过传入数据库对象
>>MyBatis中主键回填的两种实现方式
1>inser标签中添加:useGeneratedKeys/keyProperty属性
2>inser标签中嵌套selectKey标签
>>MyBatis的事务管理分为两种形式:
1>JdbcTransaction使用JDBC的事务管理机制
2>ManagedTransaction使用MANAGED的事务管理机制。让程序的容器如(JBOSS,Weblogic)来实现对事务的管理。
>>mybatis缓存
Mybatis默认情况下 只开启一级缓存而且不能关闭。是SqlSession级别的。
一级缓存最多缓存1024条sql。
二级缓存是指可以跨 SqlSession 的缓存。 是 mapper 级别的缓存
>>resultMap resultType 不能同时存在
工作经验部分:
>>Long,Date,BigDecimal类型的mapper.xml方法里,不使用XXX !=''
>>mybatis提示如下异常: apped Statements collection does not contain value for......
解决思路:
1、mapper.xml中没有加入namespace
2、mapper.xml中的方法和接口mapper的方法不对应
3、mapper.xml没有加入到mybatis-config.xml中(即总的配置文件),例外:配置了mapper文件的包路径的除外
4、mapper.xml文件名和所写的mapper名称不相同
>>参数 String 推荐加上toString()