第一章:MyBatis 核心概念与基础


文档摘要

第一章:MyBatis 核心概念与基础 第一章:MyBatis 核心概念与基础 1.1 MyBatis 简介 MyBatis 的核心思想是将 SQL 语句与 Java 代码分离,通过配置文件或注解来管理 SQL 语句,从而提高代码的可维护性和可读性。相比于 Hibernate 等 ORM 框架,MyBatis 更加灵活,允许开发者编写和优化 SQL 语句,更好地控制数据库操作。 MyBatis 的优点: 简单易学: MyBatis 的 API 相对简单,学习曲线平缓。 灵活: 开发者可以编写和优化 SQL 语句,更好地控制数据库操作。 性能: 通过优化 SQL 语句,可以提高数据库操作的性能。 易于集成: 可以与 Spring 等框架无缝集成。

第一章:MyBatis 核心概念与基础

第一章:MyBatis 核心概念与基础

1.1 MyBatis 简介

MyBatis 的核心思想是将 SQL 语句与 Java 代码分离,通过配置文件或注解来管理 SQL 语句,从而提高代码的可维护性和可读性。相比于 Hibernate 等 ORM 框架,MyBatis 更加灵活,允许开发者编写和优化 SQL 语句,更好地控制数据库操作。

MyBatis 的优点:

  • 简单易学: MyBatis 的 API 相对简单,学习曲线平缓。

  • 灵活: 开发者可以编写和优化 SQL 语句,更好地控制数据库操作。

  • 性能: 通过优化 SQL 语句,可以提高数据库操作的性能。

  • 易于集成: 可以与 Spring 等框架无缝集成。

MyBatis 的缺点:

  • 需要编写 SQL 语句: 相比于 ORM 框架,需要手动编写 SQL 语句。

  • 映射关系维护: 需要维护 Java 对象与数据库表之间的映射关系。

1.2 核心概念

在深入学习 MyBatis 之前,我们需要了解以下核心概念:

  • SqlSessionFactoryBuilder: 用于创建 SqlSessionFactory 的构建器。

  • SqlSessionFactory: 用于创建 SqlSession 的工厂。

  • SqlSession: 用于执行 SQL 语句的接口,类似于 JDBC 中的 Connection 对象。

  • Mapper 接口: 定义 SQL 语句的接口,通过 XML 或注解将接口方法与 SQL 语句绑定。

  • Configuration: MyBatis 的全局配置文件,包含数据源、事务管理器等配置信息。

  • Statement: 代表一个执行的SQL语句。

以下是 MyBatis 核心组件关系的 Mermaid 图:

1.3 MyBatis 环境搭建

首先,我们需要创建一个 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 文件的位置。

1.4 第一个 MyBatis 程序

现在,我们来创建一个简单的 MyBatis 程序,实现查询用户的功能。

  1. 创建 User 实体类:
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; } }
  1. 创建 UserMapper 接口:
public interface UserMapper { User getUserById(Integer id); }
  1. 创建 UserMapper.xml 文件:
<?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 属性指定了返回结果类型。

  1. 编写测试代码:
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() 方法查询用户信息。最后,我们打印用户的用户名。

1.5 MyBatis 的配置

MyBatis 的配置主要分为全局配置和 Mapper 映射配置。

1.5.1 全局配置

全局配置文件 mybatis-config.xml 包含以下配置:

  • environments: 配置数据源和事务管理器。

  • mappers: 配置 Mapper 接口对应的 XML 文件或接口。

  • settings: 配置 MyBatis 的全局行为,例如缓存、延迟加载等。

  • typeAliases: 为 Java 类型定义别名,方便在 XML 文件中使用。

  • typeHandlers: 用于处理 Java 类型和 JDBC 类型之间的转换。

  • plugins: 配置 MyBatis 插件,用于扩展 MyBatis 的功能。

1.5.2 Mapper 映射配置

Mapper 映射文件用于配置 SQL 语句和 Java 对象之间的映射关系。主要包含以下元素:

  • select: 定义查询语句。

  • insert: 定义插入语句。

  • update: 定义更新语句。

  • delete: 定义删除语句。

  • parameterMap: 定义参数映射关系(已过时)。

  • resultMap: 定义结果映射关系。

  • sql: 定义可重用的 SQL 片段。

  • cache: 配置缓存。

1.6 MyBatis 的 CRUD 操作

MyBatis 提供了丰富的 API 来执行 CRUD 操作。

  • select: 使用 select 语句查询数据。可以通过 parameterType 属性指定参数类型,通过 resultTyperesultMap 属性指定返回结果类型。

  • insert: 使用 insert 语句插入数据。可以通过 parameterType 属性指定参数类型,可以通过 useGeneratedKeyskeyProperty 属性获取自增主键。

  • 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>

1.7 动态 SQL

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 关键字。

1.8 总结

本章介绍了 MyBatis 的核心概念和基础知识,包括 MyBatis 的简介、核心概念、环境搭建、第一个 MyBatis 程序、配置和 CRUD 操作,以及动态 SQL。通过学习本章内容,你应该能够掌握 MyBatis 的基本用法,并能够使用 MyBatis 来进行简单的数据库操作。在后续章节中,我们将深入探讨 MyBatis 的高级特性,例如缓存、插件和与 Spring 的集成。


发布者: 作者: 转发
评论区 (0)
U