1 mapper接口和映射文件如何绑定
解析mapper配置信息,比如package配置、全限定名xml映射等方式,解析xml并将其与对应的mapper接口映射起来,用一个hashmap(knownMappers)映射起来。然后遍历Mapper接口中所有方法,将每个方法的全限定名作为key存在mapperStatements中。
注意点:同一个value会存储2次,一个全限定名作为key,另一个就是只用方法名(sql语句的id)来作为key。
所以如果全局只存在一个方法名,就可以直接session.selectList("listAllUser")来执行,否则session.selectList("com.u.listAllUser");
2 sql执行流程(statementHandler) -- 将参数弄好传进DB中,然后返回结果的
找到对应是select、insert、update、delete的方式,然后找到是返回多行还是单行还是游标,最后把sql传进执行
3 参数映射(parameterHandler) -- 处理参数的
statementhandler找到对应的TypeHandler,通过传参类型绑定对应JdbcType,举例:
- select user_id,user_name from lw_user where user_name=#{userName}
- 其实会自动映射成:select user_id,user_name from lw_user where user_name=#{userName,jdbcType=VARCHAR}
当然也可以继承BaseTypeHandler来自定义一个typeHandler类型,如下:
- public class MyTypeHandler extends BaseTypeHandler<String> { .. setNonNullParameter(..)....}
4 结果集映射(ResultSetHandler) -- 处理返回结果的
同 "参数映射" ,这个最终也是走typeHandler,只是实现重写的方法一样,这个是重写 getXxxxxResult(xxxx)
- 可将JdbcType为varchar指定为Date类型,
整体流程:Configuration->SqlSessionFactory->SqlSession->Executor->(ParameterHandler->(StatementHandler->DB)->ResultSetHandler)