创建SqlSession的关键是先创建SqlSessionFactory,创建SqlSessionFactory需要提供配置文件和相关的参数,然后可以使用SqlSessionFactoryBuilder去创建SqlSessionFactory,提供Configuration对象作为SqlSessionFactory构造函数入参。步骤如下:
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
- 通过XMLConfigBuilder去解析配置的XML文件,读出配置参数,并将读出的数据存入Configuration类中,Mybatis几乎所有的配置都是存在这里。
- 使用Configuration对象去创建SqlSessionFactory,这只是一个接口,有默认的实现类DefaultSqlSessionFactory
Mybatis是一个复杂的系统,其初始化过程非常复杂,因此把所有初始化参数包装成一个对象,方便管理参数,同时具有内聚性
映射器的内部组成
一个映射器是由3个部分组成:
- MappedStatement,它保存着映射器的一个节点(select|insert|delete|update)。包括许多配置的SQL,SQL的id,缓存信息、resultMap、parameterType等配置信息
- SqlSource,是提供BoundSql对象的地方,是MappedStatement的一个属性,
- BoundSql,建立SQL和参数的地方。有三个常用属性:SQL,parameterObject、parameterMappings
parameterObject为参数本身,有三种参数:基本数据类型,POJO,Map或者@param注解的参数
- 基本数据类型,Mybatis会把参数变为Integer对象传递,
- POJO和Map,那么parameterObject就是传入的POJO和Map
- 多个参数,Mybatis会把parameterObject变为一个
Map<String,Object>
对象,其中参数被当做Map的value,而key根据是否有@Param注解来分为两种,如果没有@Param注解,那么key为“1”、“2”…,如果有@Param注解,则key为注解中的字符串
parameterMappings:是一个list,保存着parameterMapping,这个对象会描述我们的参数,包括属性、名称、表达式、jdbcTypeName、jdbcType、javaType、typeHandler等,一般不去修改它,通过它可以实现Sql和参数的结合,以便PreparedStatement能够通过它找到parameterObject对象的属性并设置参数
sql属性就是我们书写在映射器里的一条sql,大多数情况下无需修改它。
SqlSession运行过程
SqlSession是一个接口,通过构造SqlSessionFactory就可以轻易拿到SqlSession,SqlSession接口有许多常用的CRUD方法,调用这些方法可以执行相应的CRUD SQL语句,