MyBatis 是一个流行的持久层框架,主要用于简化 Java 应用程序中对数据库的访问。与传统的 JDBC(Java Database Connectivity)相比,MyBatis 提供了更高层次的抽象,帮助开发者更方便地进行数据库操作。
MyBatis 的执行流程是指在一个完整的数据库操作中,MyBatis 如何从接收到用户请求到最终执行 SQL 并返回结果的整个过程。以下是 MyBatis 的典型执行流程:
mybatis-config.xml
): MyBatis 在启动时会加载主配置文件,这个文件定义了数据库连接池、事务管理器、以及其他全局设置。Mapper XML
): 映射文件通常包括 SQL 语句及其与 Java 对象的映射关系。SqlSessionFactory
对象。这个工厂对象是创建 SqlSession
实例的入口,每个 SqlSession
实例都表示一个与数据库的会话。SqlSessionFactory
来获取 SqlSession
对象。SqlSession
是执行 SQL 语句的核心接口,它提供了执行增删改查操作的方法。SqlSession
提供了获取 Mapper 接口实例的方法,MyBatis 会动态生成该接口的实现类。Mapper 是 MyBatis 的核心组件,它将接口方法映射到具体的 SQL 语句。
、
等),MyBatis 会根据实际传入的参数对 SQL 进行动态解析和生成。
标签或注解指定,MyBatis 会根据这些配置将结果集转换为预期的 Java 对象。SqlSession
提供了手动提交和回滚事务的方法。在 SqlSession
关闭前,开发者可以选择提交或回滚事务。SqlSession
,以释放数据库连接等资源。通常情况下,SqlSession
是在try-finally
代码块中使用,以确保在异常发生时资源能够被正确释放。SqlSession
返回结果给调用者,调用者可以直接使用这些映射后的 Java 对象。总结来说,MyBatis 的执行流程是从加载配置文件到生成 SQL、执行 SQL,再到结果映射的一个完整过程。每一步都有相应的组件和机制来保证 SQL 的正确执行和结果的准确返回。
相比于传统的 JDBC,MyBatis 增加了丰富的功能,使得数据库操作更加简洁、灵活且易于维护。它将大量繁琐的手动编码工作自动化,并且提供了强大的配置、扩展和管理能力,极大地提高了开发效率和代码质量。
SQL映射
动态SQL
对象关系映射(ORM)支持
我们将用一个简单的代码演示,来理解这三个特点
以下是一个简单的示例,展示了MyBatis的基本用法和特点,包括SQL映射、动态SQL以及对象关系映射。
首先,你需要一个MyBatis的配置文件(mybatis-config.xml
),来配置数据库连接和其他参数。
DOCTYPE configuration
PUBLIC "-//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/mybatis_demo"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="UserMapper.xml"/>
mappers>
configuration>
创建一个简单的用户表作为示例。
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(50)
);
定义一个与数据库表对应的Java类User
。
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
MyBatis中Mapper接口用于定义与数据库操作相关的方法。
public interface UserMapper {
User getUserById(int id);
List<User> getAllUsers();
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
UserMapper.xml
用于定义SQL语句并将它们映射到Mapper接口的方法上。
DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
select>
<select id="getAllUsers" resultType="User">
SELECT * FROM users
select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
insert>
<update id="updateUser" parameterType="User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
update>
<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
delete>
mapper>
编写主程序来演示如何使用MyBatis执行数据库操作。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisExample {
public static void main(String[] args) throws IOException {
// 1. 读取MyBatis配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 获取SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 3. 插入新用户
User newUser = new User();
newUser.setName("John Doe");
newUser.setEmail("[email protected]");
mapper.insertUser(newUser);
session.commit(); // 提交事务
// 4. 查询所有用户
List<User> users = mapper.getAllUsers();
users.forEach(user -> System.out.println(user.getName() + ": " + user.getEmail()));
// 5. 更新用户
User existingUser = users.get(0);
existingUser.setName("Jane Doe");
mapper.updateUser(existingUser);
session.commit();
// 6. 删除用户
mapper.deleteUser(existingUser.getId());
session.commit();
}
}
}
User
对象与数据库中的记录相对应,MyBatis自动将查询结果映射为User
对象。
、
等。