1.加载配置文件
- MyBatis 首先会加载配置文件,配置文件主要有两种形式:XML 配置文件和基于 Java 的配置类。
- XML 配置文件:这是最常见的配置方式。在 XML 配置文件中,会配置数据库连接信息(如数据库的 URL、用户名、密码等)、MyBatis 的全局设置(如日志级别、缓存等)以及 Mapper 接口对应的 SQL 映射文件的位置。例如,以下是一个简单的 XML 配置文件片段:
- **基于Java的配置类**:在Java配置类中,可以通过代码的方式配置MyBatis的各种参数。这种方式更加灵活,适合于复杂的配置场景或者在Spring Boot等框架中进行集成。例如,可以创建一个`MyBatisConfig`类,在其中使用`@Configuration`注解定义配置方法,通过`@Bean`注解返回数据源、事务管理器等对象。
2. **创建SqlSessionFactory对象**
- 根据加载的配置文件,MyBatis会创建一个`SqlSessionFactory`对象。这个对象是MyBatis的核心对象之一,它就像是一个工厂,用于生产`SqlSession`。
- 它的创建过程涉及到解析配置文件中的数据库连接信息、解析Mapper映射文件等操作。例如,在XML配置文件中配置的数据源信息会被读取并用于创建数据库连接池,而Mapper映射文件中的SQL语句和映射关系也会被解析并存储,以便后续使用。
3. **获取SqlSession对象**
- 从`SqlSessionFactory`对象中获取`SqlSession`对象。`SqlSession`就像是一个数据库会话,通过它可以执行SQL语句。
- 它有两种获取方式:自动提交模式(默认情况下)和手动提交模式。在自动提交模式下,每执行一个更新操作(如INSERT、UPDATE、DELETE)后,数据库事务会自动提交;在手动提交模式下,需要显式地调用`SqlSession`的`commit`方法来提交事务。例如,在进行数据库插入操作时,在自动提交模式下,插入语句执行完成后数据就会立即写入数据库;在手动提交模式下,插入语句执行完成后,需要调用`SqlSession.commit()`才能将数据写入数据库。
4. **执行SQL语句(通过Mapper接口)**
- MyBatis采用接口编程的方式。开发人员先定义一个Mapper接口,如`UserMapper`,其中包含了各种数据库操作方法的声明,如`selectUserById(int id)`。
- 在获取`SqlSession`后,通过`SqlSession`的`getMapper`方法获取Mapper接口的代理对象。例如,`UserMapper userMapper = sqlSession.getMapper(UserMapper.class);`,这个代理对象会根据在Mapper映射文件中定义的SQL语句和映射关系来执行操作。当调用`userMapper.selectUserById(1)`时,代理对象会找到对应的SQL语句(在`UserMapper.xml`中定义),执行查询操作,将查询结果按照映射关系(也是在`UserMapper.xml`中定义)转换为`User`对象并返回。
5. **结果处理和返回**
- 在执行SQL语句后,MyBatis会根据SQL映射文件中定义的结果映射(`resultMap`)来处理查询结果。
- **简单结果映射**:如果查询结果是简单的一对一映射(如一个用户表查询结果映射到一个`User`对象),MyBatis会按照`resultMap`中定义的列名和对象属性名的对应关系,将查询结果的列值赋给`User`对象的属性。例如,如果`resultMap`定义了`id`列对应`User`对象的`id`属性,`name`列对应`User`对象的`name`属性,那么在查询后,会将列值正确地赋给`User`对象的属性。
- **复杂结果映射**:对于复杂的结果映射,如一对多(一个用户对应多个订单)或者多对多(多个用户对应多个角色)的情况,MyBatis会根据`resultMap`中定义的关联关系,通过嵌套查询或者嵌套结果集的方式来处理。例如,在一对多的用户和订单的关系中,`resultMap`可能会定义一个子`resultMap`来处理订单信息,在查询用户信息时,会同时查询出用户的订单信息,并将订单信息填充到`User`对象的订单列表属性中。
6. **关闭SqlSession对象**
- 当数据库操作完成后,需要关闭`SqlSession`对象。这一步非常重要,因为它可以释放数据库连接等资源。
- 关闭`SqlSession`可以手动调用`SqlSession`的`close`方法,也可以通过使用`try - with - Resource`语句(在Java 7及以上版本支持)来自动关闭。例如,在使用`try - with - Resource`语句时,`SqlSession`会在`try`块结束后自动关闭,确保资源的合理利用。
总结:
-
读取MyBatis配置文件
mybatis-config.xml
。 -
构造会话工厂
SqlSessionFactory
。 -
会话工厂创建
SqlSession
对象。 -
操作数据库的接口,
Executor
执行器。 -
Executor
执行方法中的MappedStatement
参数。 -
输入参数映射。
-
输出结果映射。