大家好,我是锋哥。今天分享关于【MyBatis的工作流程是怎样的?】面试题。希望对大家有帮助;
MyBatis的工作流程是怎样的?
MyBatis 的工作流程可以分为几个主要步骤:从配置、映射到执行 SQL,最终获取数据库结果并映射回 Java 对象。下面是 MyBatis 的典型工作流程:
1. 加载配置文件
MyBatis 的核心是 SqlSessionFactory
,它负责创建 SqlSession
实例。SqlSessionFactory
通过读取配置文件来初始化 MyBatis。配置文件通常是 mybatis-config.xml
,它包含了 MyBatis 的全局配置和一些其他配置信息(例如:数据库连接池、事务管理、缓存设置等)。
- 步骤:
- 创建
SqlSessionFactoryBuilder
。 - 通过
SqlSessionFactoryBuilder.build(inputStream)
加载mybatis-config.xml
配置文件。 SqlSessionFactory
创建后,应用程序可以从中获取SqlSession
实例。-
<!-- mybatis-config.xml --> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/example/mapper/UserMapper.xml"/> </mappers> </configuration>
- 创建
2. 创建 SqlSession
实例
SqlSession
是 MyBatis 与数据库交互的核心接口,应用程序通过它执行 SQL 语句,获取查询结果,提交事务等。SqlSession
是通过 SqlSessionFactory
创建的。
- 步骤:
- 调用
SqlSessionFactory.openSession()
创建SqlSession
对象(可以指定自动提交事务的模式)。 - 每次使用完
SqlSession
后,要调用sqlSession.close()
来关闭连接。 -
SqlSession session = sqlSessionFactory.openSession();
- 调用
3. 执行 SQL 语句
MyBatis 通过 SqlSession
来执行 SQL 语句。SQL 语句通常是通过 XML 映射文件(如 UserMapper.xml
)与 Java 接口(如 UserMapper.java
)映射的。
- 步骤:
SqlSession
提供了方法来执行各种 SQL 操作,比如selectOne()
,selectList()
,insert()
,update()
,delete()
等。SqlSession
会根据传入的映射 ID 查找对应的 SQL 映射语句,然后执行 SQL。-
UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1);
在上面的代码中,mapper.selectUserById(1)
会调用 UserMapper.xml
中的 selectUserById
映射方法,执行对应的 SQL 语句。
4. SQL 映射和动态 SQL
在 MyBatis 中,SQL 是通过 XML 映射文件(如 UserMapper.xml
)与 Java 接口方法关联的。MyBatis 支持使用动态 SQL,根据传入参数动态生成 SQL 语句。
-
静态 SQL 映射示例:
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectUserById" resultType="com.example.domain.User"> SELECT id, name, email FROM users WHERE id = #{id} </select> </mapper>
-
动态 SQL 示例:
<select id="selectUsersByCondition" resultType="com.example.domain.User"> SELECT id, name, email FROM users WHERE 1=1 <if test="name != null">AND name = #{name}</if> <if test="email != null">AND email = #{email}</if> </select>
在上面的例子中,selectUsersByCondition
根据传入的条件动态拼接 SQL 语句。
5. 获取查询结果并映射到 Java 对象
MyBatis 会将从数据库查询到的结果映射到 Java 对象中,过程是通过 resultMap
或简单的 resultType
配置来完成的。
-
使用
resultType
映射结果:如果 SQL 查询的返回结果与 Java 类的字段直接对应,MyBatis 会自动将结果集映射到 Java 对象中。
<select id="selectUserById" resultType="com.example.domain.User"> SELECT id, name, email FROM users WHERE id = #{id} </select>
-
使用
resultMap
映射复杂的查询结果:对于复杂的查询(例如一对多关系),可以使用
resultMap
映射更复杂的对象结构。<resultMap id="userResultMap" type="com.example.domain.User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="email" column="email"/> <collection property="orders" ofType="com.example.domain.Order" select="selectOrdersByUserId" column="id"/> </resultMap>
这里,
selectOrdersByUserId
是一个子查询,用于加载用户的订单信息。
6. 提交事务或回滚
MyBatis 支持事务管理。如果使用 SqlSessionFactory.openSession(true)
方法,SqlSession
会自动提交事务。如果没有启用自动提交,则需要手动提交事务。
- 步骤:
- 如果执行了更新、插入或删除操作,需要调用
session.commit()
提交事务。 - 如果操作失败,可以调用
session.rollback()
来回滚事务。
- 如果执行了更新、插入或删除操作,需要调用
session.commit(); // 提交事务
session.rollback(); // 回滚事务
7. 关闭 SqlSession
使用完 SqlSession
后,必须关闭它,释放数据库连接。否则,可能会造成连接泄漏。
session.close(); // 关闭 SqlSession
总结 MyBatis 工作流程
- 加载配置文件:MyBatis 通过
SqlSessionFactoryBuilder
读取mybatis-config.xml
文件并创建SqlSessionFactory
。 - 创建
SqlSession
:通过SqlSessionFactory.openSession()
创建SqlSession
实例,执行 SQL 操作。 - 执行 SQL 语句:使用
SqlSession
调用映射的 SQL 语句(如selectOne()
、selectList()
等)。 - 映射查询结果:MyBatis 将查询结果自动映射为 Java 对象,支持动态 SQL 和复杂映射。
- 事务处理:提交或回滚事务。
- 关闭
SqlSession
:使用完SqlSession
后,必须关闭它。
这个流程体现了 MyBatis 在执行 SQL 时的高灵活性和控制力,但也要求开发者对 SQL 和映射有更多的掌控。