1. 加载配置文件
- MyBatis 会首先加载配置文件(通常是
mybatis-config.xml
),这个配置文件中包含了数据库连接相关的配置信息,比如数据库的驱动类、连接地址、用户名、密码等,同时也可以配置诸如类型别名、插件、映射器(mapper)等相关的全局设置信息。例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<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?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="com/example/mapper/UserMapper.xml"/></mappers>
</configuration>
2. 构建 SqlSessionFactory
- 根据加载的配置文件,MyBatis 会创建一个
SqlSessionFactory
对象。这个对象是线程安全的,在整个应用程序的生命周期内通常只需要创建一次,它是后续创建SqlSession
的工厂类,负责生产可以与数据库进行交互的SqlSession
实例。创建过程一般通过如下代码实现:
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
3. 获取 SqlSession
- 从
SqlSessionFactory
中获取SqlSession
对象,SqlSession
就像是一个数据库连接会话,它提供了众多操作数据库的方法,比如执行查询、插入、更新、删除等操作。不过要注意的是,SqlSession
不是线程安全的,所以通常在每次需要和数据库交互时获取,使用完后及时关闭。示例代码如下:
SqlSession sqlSession = sqlSessionFactory.openSession();
4. 查找映射语句(Mapper)
- 当需要执行某个具体的数据库操作时(比如查询用户信息),MyBatis 会根据接口(通常是 Mapper 接口)和对应的 XML 映射文件(或者基于注解的映射方式)去查找对应的 SQL 语句定义。例如,有一个
UserMapper
接口及其对应的UserMapper.xml
映射文件,在接口中定义了方法:
public interface UserMapper {User getUserById(int id);
}
对应的 XML 映射文件中会定义具体的 SQL 语句:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><select id="getUserById" resultMap="UserResultMap">select * from users where id = #{id}</select>
</mapper>
5. 执行 SQL 语句
- 通过
SqlSession
调用对应的 Mapper 接口方法(实际上底层会根据映射找到对应的 SQL 语句去执行),如果是查询操作,会将结果按照配置的结果映射规则(如通过resultMap
等方式)进行转换,返回对应的 Java 对象(比如上述的User
对象)。示例代码如下:
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUserById(1);
6. 处理结果
- 对于查询操作得到的结果,会根据配置的映射规则将数据库中的数据转换为 Java 对象或者集合等合适的数据结构。如果是更新、插入、删除操作,会返回相应的受影响行数等信息,以让调用者知晓操作的执行情况。
7. 关闭 SqlSession
- 当完成与数据库的交互后,需要关闭
SqlSession
,释放相关资源,防止资源泄露。可以通过如下方式关闭:
sqlSession.close();
总的来说,MyBatis 通过这样一套流程实现了 Java 代码与数据库操作的解耦,方便、高效地进行数据库交互,并且能灵活地配置和定制 SQL 语句以及结果映射等相关内容。