一、工作流程
MyBatis的工作流程是MyBatis中重要的知识点,整个MyBatis工作流程分为5个步骤。
-
编写配置文件与映射文件:配置文件设置数据库连接;映射文件设置与SQL文件相关的操作。
-
MyBatis通过配置文件和映射文件生成SqlSessionFactory对象:此对象在MyBatis整个生命周期中只存在一份,它负责为每一个连接生成SqlSession对象。
-
通过SqlSessionFactory对象生成SqlSession对象:SqlSession对象在每次连接中只有一个,它封装了操作数据库的所有方法。
-
在每一次连接中,通过SqlSession对象操作数据库,SqlSession通过底层的Executor执行器执行对应操作。Executor执行器分为两种:一种是普通执行器;另一种是缓存执行器。
-
Executor执行器将此次操作封装为MappedStatement对象,在执行SQL语句之前,Executor执行器通过MappedStatement对象将输入的实体对象或基本类型数据映射到SQL语句,在执行SQL语句之后,Executor执行器通过MappedStatement对象将SQL语句执行的结果映射为实体对象或基本类型数据。
二、核心对象
(1)SqlSessionFactory
SqlSessionFactory是MyBatis中的核心类,它采用工厂设计模式构建,负责创建SqlSession对象。构建SqlSessionFactory对象需要使用SqlSessionFactoryBuilder类
调用SqlSessionFactoryBuilder类中的builder()方法即可创建SqlSessionFactory对象
build()方法有多种重载,参数可以选填Reader和InputStream的实现类
1、构建SqlSessionFactory对象
build方法的参数中需要MyBatis配置文件的输入流,接下来创建输入流。
调用Resource类的getResourceAsStream()方法,传入配置文件的绝对路径
InputStream inputStream = Resources.getResourceAsStream("文件路径");
获得配置文件流之后,将其作为参数传入SqlSessionFactoryBuilder的build()方法中
调用build()方法,返回值就是SqlSessionFactory对象
SqlSessionFactoryBuilder builder = SqlSessionFactoryBuilder.builder(inputStream );
2、使用SqlSessionFactory对象
在SqlSessionFactory类中存在openSession()方法与getConfiguration()方法
openSession()方法可以创建SqlSession对象,也可以在该方法中传入参数来设置创建的SqlSession对象,getConfiguration()方法用于获取SqlSessionFactory的配置。
3、产生SqlSession对象
SqlSessionFactory类的主要作用是生产SqlSession对象
调用SqlSessionFactory对象的openSession()方法就可以产生SqlSession对象
通过SqlSessionFactory对象生成的SqlSession对象,在每次连接中只有一个,它负责通过各种方法操作数据库。
SqlSession sqlSession= SqlSessionFactory.openSession();
4、使用SqlSession对象
SqlSession对象是MyBatis中的核心类对象。在日常开发中,常用SqlSession对象与数据库进行交互。
SqlSession对象贯穿于整个数据库访问的过程,一定时间段内没有使用SqlSession对象时,需要及时调用SqlSession对象的close()方法,将其关闭。
SqlSession对象提供了执行SQL,提交事务或回滚事务,使用映射器等方法,在方法中需要指定映射文件中的方法。
三、配置日志
1、导入log4j的依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2、在应用的类路径中创建一个名为 log4j.properties
的文件,文件的具体内容如下:
# 全局日志配置
log4j.rootLogger=ERROR, stdout
# MyBatis 日志配置
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
上述配置将使 Log4J 详细打印 org.mybatis.example.BlogMapper
的日志,对于应用的其它部分,只打印错误信息。
为了实现更细粒度的日志输出,你也可以只打印特定语句的日志。以下配置将只打印语句 selectBlog
的日志:
log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE
或者,你也可以打印一组映射器的日志,只需要打开映射器所在的包的日志功能即可:
log4j.logger.org.mybatis.example=TRACE
某些查询可能会返回庞大的结果集。这时,你可能只想查看 SQL 语句,而忽略返回的结果集。为此,SQL 语句将会在 DEBUG 日志级别下记录(JDK 日志则为 FINE)。返回的结果集则会在 TRACE 日志级别下记录(JDK 日志则为 FINER)。因此,只要将日志级别调整为 DEBUG 即可:
log4j.logger.org.mybatis.example=DEBUG