mybatis的运行过程

mybatis运行过程

mybatis的运行过程分为两大步:

  1. 读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory;
  2. SqlSession的执行过程。

SqlSessionFactory是Mybatis的核心类之一,其最重要的作用是提供Mybatis的核心接口SqlSession。Mybatis采用Builder模式创建SQLSessionFactory,实际中通过SQLSessionFactoryBuilder去构建,分为两步:

  • 通过XMLConfiguration解析xml配置文件,读取所配置的参数,并将读取的内容存入Configuration类对象中。而Configuration采用的是单例模式,Mybatis的所有配置内容都会存储在这个单例对象中。
    Configuration的主要作用有:
    1)读入配置文件,包括基础配置和映射器配置
    2)初始化一些基础配置,如Mybatis的别名、typeHandler等
    3)提供单例,用于创建后续的SessionFactory等
  • 使用Configuration对象去创建SqlSessionFactory。它有一个默认的实现类DefaultSQLSessionFactory,实际中,没有必要再去创建一个SqlSessionFactory.
映射器的内部组成

Mybatis中一条sql和它相关的配置信息由三部分组成:MapperedStatement/SqlSource/BoundSql

  • MapperedStatement的作用是保存一个映射器节点(select|insert|update|delete)的内容,包括id、缓存信息、resultMap、parameterType等重要配置内容。
  • SqlSource是提供BoundSql的地方,它是MapperedStatement的一个属性,他本身是一个接口,只有getBoundSql一个方法,
    主要作用是根据上下文和参数解析生成需要的sql.
  • BoundSql是一个结果对象,包括解析得到的sql和参数,它有三个属性:parameterMappings、parameterObject和sql

BoundSql中最重要的属性是parameterObject,该参数可以传递简单对象、POJO或者Map、@Param注解的参数

  • 传递简单对象,包括int/long等基础类型,Mybatis会将他们转换为包装类对象
  • 传递POJO或者Map,parameterObject就是传入的传递POJO或者Map
  • 传递多个参时, 如果没有@Param,Mybatis会把parameterObject变成一个Map<String,Object>对象,类似于
    {“1”:“p1”,“2”:“p2”}或{“param1”:“p1”,“param2”:“p2”},所以可以使用#{param1}或#{1}去引入第一个参数
    如果使用了@Param, 如@Param(“key1”),就可以通过#{key1}来引入。
SqlSession下的四大对象

SQLSession的执行时通过Executor、StatementHandler、ParameterHandler、ResultSetHandler来完成数据库操作和结果返回的。

  • Executor代表执行器,由他来调度另外三个核心组件,SqlSession其实是一个门面,真正干活的是Executor,它是一个真正执行java和数据库交互的对象;
  • StatementHandler是四大对象的核心,用它来实现prepare以及crud操作;
  • ParameterHandler用来处理sql参数;
  • ResultSetHandler用来进行结果集的封装和返回处理。
常见异常问题

异常排查mybatis:Invalid bound statement (not found)

这个问题在项目初期比较常见,以springboot为例,常用排查方式如下:

  1. 检查mybatisConfig,Mapper接口的包路径有没有正确扫描
@MapperScan("com.ftcs.core.mapper")
  1. 检查配置文件,实体类的扫描路径是否正确
mybatis-plus:
    mapper-locations: classpath*:mybatis/**/*.xml
    typeAliasesPackage: com.ftcs.core.entity
  1. 检查Mapper配置文件,配置的Mapper接口和实体类路径是否正确
  2. 检查打包resources,可能本地正常调用,但打包后报错
<resources>
	<resource>
		<directory>src/main/resources</directory>
		<filtering>true</filtering>

		<includes>
			<include>bootstrap.yml</include>
			<include>mapper/*</include>
		</includes>
	</resource>
</resources>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值