第一章:MyBatis 核心概念与基础 第一章:MyBatis 核心概念与基础 1.1 MyBatis 简介 MyBatis 的核心思想是将 SQL 语句与 Java 代码分离,通过配置文件或注解来管理 SQL 语句,从而提高代码的可维护性和可读性。相比于 Hibernate 等 ORM 框架,MyBatis 更加灵活,允许开发者编写和优化 SQL 语句,更好地控制数据库操作。 MyBatis 的优点: 简单易学: MyBatis 的 API 相对简单,学习曲线平缓。 灵活: 开发者可以编写和优化 SQL 语句,更好地控制数据库操作。 性能: 通过优化 SQL 语句,可以提高数据库操作的性能。 易于集成: 可以与 Spring 等框架无缝集成。
MyBatis 的核心思想是将 SQL 语句与 Java 代码分离,通过配置文件或注解来管理 SQL 语句,从而提高代码的可维护性和可读性。相比于 Hibernate 等 ORM 框架,MyBatis 更加灵活,允许开发者编写和优化 SQL 语句,更好地控制数据库操作。
MyBatis 的优点:
简单易学: MyBatis 的 API 相对简单,学习曲线平缓。
灵活: 开发者可以编写和优化 SQL 语句,更好地控制数据库操作。
性能: 通过优化 SQL 语句,可以提高数据库操作的性能。
易于集成: 可以与 Spring 等框架无缝集成。
MyBatis 的缺点:
需要编写 SQL 语句: 相比于 ORM 框架,需要手动编写 SQL 语句。
映射关系维护: 需要维护 Java 对象与数据库表之间的映射关系。
在深入学习 MyBatis 之前,我们需要了解以下核心概念:
SqlSessionFactoryBuilder: 用于创建 SqlSessionFactory 的构建器。
SqlSessionFactory: 用于创建 SqlSession 的工厂。
SqlSession: 用于执行 SQL 语句的接口,类似于 JDBC 中的 Connection 对象。
Mapper 接口: 定义 SQL 语句的接口,通过 XML 或注解将接口方法与 SQL 语句绑定。
Configuration: MyBatis 的全局配置文件,包含数据源、事务管理器等配置信息。
Statement: 代表一个执行的SQL语句。
以下是 MyBatis 核心组件关系的 Mermaid 图:
首先,我们需要创建一个 Java 项目,并引入 MyBatis 的依赖。这里以 Maven 为例:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
接下来,我们需要创建一个 MyBatis 的配置文件 mybatis-config.xml,配置数据源和事务管理器:
<?xml version="1.0" encoding="UTF-8" ?> <!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_test?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
在这个配置文件中,我们定义了一个名为 "development" 的环境,配置了 JDBC 事务管理器和 POOLED 数据源。mappers 节点指定了 Mapper 接口对应的 XML 文件的位置。
现在,我们来创建一个简单的 MyBatis 程序,实现查询用户的功能。
public class User { private Integer id; private String username; private String password; private String email; // 省略 getter 和 setter 方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
public interface UserMapper { User getUserById(Integer id); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mapper.UserMapper"> <select id="getUserById" parameterType="java.lang.Integer" resultType="com.example.entity.User"> SELECT * FROM user WHERE id = #{id} </select> </mapper>
在这个 XML 文件中,我们定义了一个 select 语句,用于根据用户 ID 查询用户信息。namespace 属性指定了 Mapper 接口的完整类名,id 属性指定了接口方法名,parameterType 属性指定了参数类型,resultType 属性指定了返回结果类型。
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 com.example.entity.User; import com.example.mapper.UserMapper; import java.io.IOException; import java.io.InputStream; public class MyBatisTest { public static void main(String[] args) throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession sqlSession = sqlSessionFactory.openSession()) { UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.getUserById(1); System.out.println(user.getUsername()); } } }
在这段代码中,我们首先通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory,然后通过 SqlSessionFactory 打开一个 SqlSession。接着,我们通过 sqlSession.getMapper() 方法获取 UserMapper 接口的代理对象,并调用 getUserById() 方法查询用户信息。最后,我们打印用户的用户名。
MyBatis 的配置主要分为全局配置和 Mapper 映射配置。
全局配置文件 mybatis-config.xml 包含以下配置:
environments: 配置数据源和事务管理器。
mappers: 配置 Mapper 接口对应的 XML 文件或接口。
settings: 配置 MyBatis 的全局行为,例如缓存、延迟加载等。
typeAliases: 为 Java 类型定义别名,方便在 XML 文件中使用。
typeHandlers: 用于处理 Java 类型和 JDBC 类型之间的转换。
plugins: 配置 MyBatis 插件,用于扩展 MyBatis 的功能。
Mapper 映射文件用于配置 SQL 语句和 Java 对象之间的映射关系。主要包含以下元素:
select: 定义查询语句。
insert: 定义插入语句。
update: 定义更新语句。
delete: 定义删除语句。
parameterMap: 定义参数映射关系(已过时)。
resultMap: 定义结果映射关系。
sql: 定义可重用的 SQL 片段。
cache: 配置缓存。
MyBatis 提供了丰富的 API 来执行 CRUD 操作。
select: 使用 select 语句查询数据。可以通过 parameterType 属性指定参数类型,通过 resultType 或 resultMap 属性指定返回结果类型。
insert: 使用 insert 语句插入数据。可以通过 parameterType 属性指定参数类型,可以通过 useGeneratedKeys 和 keyProperty 属性获取自增主键。
update: 使用 update 语句更新数据。可以通过 parameterType 属性指定参数类型。
delete: 使用 delete 语句删除数据。可以通过 parameterType 属性指定参数类型。
以下是一个简单的 CRUD 示例:
public interface UserMapper { User getUserById(Integer id); void insertUser(User user); void updateUser(User user); void deleteUser(Integer id); }
<mapper namespace="com.example.mapper.UserMapper"> <select id="getUserById" parameterType="java.lang.Integer" resultType="com.example.entity.User"> SELECT * FROM user WHERE id = #{id} </select> <insert id="insertUser" parameterType="com.example.entity.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email}) </insert> <update id="updateUser" parameterType="com.example.entity.User"> UPDATE user SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id} </update> <delete id="deleteUser" parameterType="java.lang.Integer"> DELETE FROM user WHERE id = #{id} </delete> </mapper>
MyBatis 提供了强大的动态 SQL 功能,可以根据不同的条件生成不同的 SQL 语句。常用的动态 SQL 标签包括:
if: 根据条件判断是否包含某个 SQL 片段。
choose (when, otherwise): 类似于 Java 中的 switch 语句,根据不同的条件选择不同的 SQL 片段。
where: 自动处理 WHERE 子句中的 AND 和 OR 关键字。
set: 自动处理 SET 子句中的逗号。
foreach: 用于遍历集合,生成 IN 子句或批量更新语句。
以下是一个动态 SQL 的示例:
<select id="findUsers" parameterType="com.example.entity.User" resultType="com.example.entity.User"> SELECT * FROM user <where> <if test="username != null and username != ''"> AND username LIKE #{username} </if> <if test="email != null and email != ''"> AND email LIKE #{email} </if> </where> </select>
在这个示例中,我们使用 if 标签根据用户名和邮箱是否为空来决定是否包含相应的 SQL 片段。where 标签会自动处理 WHERE 子句中的 AND 关键字。
本章介绍了 MyBatis 的核心概念和基础知识,包括 MyBatis 的简介、核心概念、环境搭建、第一个 MyBatis 程序、配置和 CRUD 操作,以及动态 SQL。通过学习本章内容,你应该能够掌握 MyBatis 的基本用法,并能够使用 MyBatis 来进行简单的数据库操作。在后续章节中,我们将深入探讨 MyBatis 的高级特性,例如缓存、插件和与 Spring 的集成。