1.1 MyBatis 概述


文档摘要

1.1 MyBatis 概述 1.1 MyBatis 概述:持久层框架的优雅选择 MyBatis 是一款优秀的持久层框架,它通过 XML 或注解的方式将接口和 Java 的 POJO(Plain Old Java Object,普通的 Java 对象)映射为数据库中的记录。 相比于传统的 JDBC 编程,MyBatis 极大地简化了数据库操作,提高了开发效率。 相比于 Hibernate 等 ORM 框架,MyBatis 提供了更精细的 SQL 控制能力,允许开发者编写和优化自己的 SQL 语句,从而更好地适应复杂的业务场景。 1.1.

1.1 MyBatis 概述

1.1 MyBatis 概述:持久层框架的优雅选择

MyBatis 是一款优秀的持久层框架,它通过 XML 或注解的方式将接口和 Java 的 POJO(Plain Old Java Object,普通的 Java 对象)映射为数据库中的记录。 相比于传统的 JDBC 编程,MyBatis 极大地简化了数据库操作,提高了开发效率。 相比于 Hibernate 等 ORM 框架,MyBatis 提供了更精细的 SQL 控制能力,允许开发者编写和优化自己的 SQL 语句,从而更好地适应复杂的业务场景。

1.1.1 MyBatis 的核心价值

MyBatis 的核心价值体现在以下几个方面:

  • SQL 映射的灵活性: MyBatis 允许开发者直接编写 SQL 语句,避免了 ORM 框架自动生成 SQL 语句的性能瓶颈和可控性问题。 通过 XML 配置文件或注解,MyBatis 将 SQL 语句与 Java 方法进行映射,使得开发者可以专注于业务逻辑的实现,而无需编写大量的 JDBC 代码。

  • 高度的可定制性: MyBatis 提供了丰富的配置选项,允许开发者根据自己的需求进行定制。 例如,可以配置数据源、事务管理器、缓存策略等。 此外,MyBatis 还提供了插件机制,允许开发者扩展 MyBatis 的功能。

  • 易于学习和使用: MyBatis 的 API 简单易懂,学习曲线平缓。 开发者可以通过阅读官方文档和示例代码快速上手 MyBatis。

  • 良好的性能: 由于 MyBatis 允许开发者直接编写 SQL 语句,因此可以根据实际情况进行优化,从而获得更好的性能。

1.1.2 MyBatis 的架构

MyBatis 的架构主要由以下几个组件组成:

各个组件的作用如下:

  • SqlSessionFactoryBuilder: 用于创建 SqlSessionFactory 对象。 SqlSessionFactoryBuilder 可以从 XML 配置文件或 Java 代码中读取配置信息,并创建 SqlSessionFactory 对象。

  • SqlSessionFactory: 用于创建 SqlSession 对象。 SqlSessionFactory 是一个单例对象,它缓存了 MyBatis 的配置信息,并用于创建 SqlSession 对象。

  • SqlSession: 用于执行 SQL 语句。 SqlSession 提供了执行 SQL 语句的方法,例如 selectOneselectListinsertupdatedelete 等。 SqlSession 是一个会话对象,它代表了一个数据库连接。

  • Executor: 用于执行 SQL 语句。 Executor 负责将 SQL 语句发送到数据库,并接收数据库的返回结果。 MyBatis 提供了多种 Executor 实现,例如 SimpleExecutorReuseExecutorBatchExecutor 等。

  • StatementHandler: 用于处理 SQL 语句。 StatementHandler 负责将 SQL 语句转换为 JDBC Statement 对象,并设置 Statement 对象的参数。

  • ParameterHandler: 用于处理 SQL 语句的参数。 ParameterHandler 负责将 Java 对象转换为 JDBC Statement 对象所需的参数类型。

  • ResultSetHandler: 用于处理 SQL 语句的返回结果。 ResultSetHandler 负责将 JDBC ResultSet 对象转换为 Java 对象。

  • MappedStatement: MappedStatement 是 MyBatis 中最重要的一个类,它描述了一个 SQL 映射语句。 MappedStatement 包含了 SQL 语句、参数类型、返回类型、缓存策略等信息。

1.1.3 MyBatis 的使用步骤

使用 MyBatis 的一般步骤如下:

  1. 创建 MyBatis 的配置文件: mybatis-config.xml 文件包含了 MyBatis 的全局配置信息,例如数据源、事务管理器、缓存策略等。

    <?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/your_database?useSSL=false&amp;serverTimezone=UTC"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>

    详解:

    • configuration 根元素: MyBatis 配置文件的根元素。

    • environments 环境配置: 定义了 MyBatis 运行的环境,可以配置多个环境,并指定默认环境。

      • environment 单个环境配置: 定义了一个具体的环境,例如开发环境、测试环境、生产环境。

        • transactionManager 事务管理器: 指定事务管理器的类型,常用的有 JDBCMANAGEDJDBC 使用 JDBC 的事务管理,MANAGED 使用容器的事务管理。

        • dataSource 数据源: 指定数据源的类型,常用的有 POOLEDUNPOOLEDJNDIPOOLED 使用连接池,UNPOOLED 不使用连接池,JNDI 使用 JNDI 数据源。

          • property 属性配置: 配置数据源的属性,例如数据库驱动、连接 URL、用户名、密码等。 请将 your_database, your_username, 和 your_password 替换为你的实际数据库信息。
    • mappers 映射器配置: 指定 MyBatis 映射文件的位置。

      • mapper 映射文件: 指定一个具体的映射文件。 resource 属性指定了映射文件的路径,通常是相对于 classpath 的路径。
  2. 创建 Mapper 接口: Mapper 接口定义了对数据库的操作方法。

    public interface UserMapper { User selectUserById(int id); List<User> selectAllUsers(); int insertUser(User user); int updateUser(User user); int deleteUser(int id); }

    详解:

    • Mapper 接口定义了对数据库的操作方法,每个方法对应一个 SQL 映射语句。

    • Mapper 接口的方法名应该与 SQL 映射语句的 id 属性相同。

    • Mapper 接口的参数类型应该与 SQL 映射语句的 parameter type 属性相同。

    • Mapper 接口的返回类型应该与 SQL 映射语句的 result type 属性相同。

  3. 创建 Mapper XML 文件: Mapper XML 文件包含了 SQL 映射语句,用于将 Mapper 接口的方法映射到数据库操作。

    <?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.UserMapper"> <select id="selectUserById" parameterType="int" resultType="com.example.User"> SELECT * FROM users WHERE id = #{id} </select> <select id="selectAllUsers" resultType="com.example.User"> SELECT * FROM users </select> <insert id="insertUser" parameterType="com.example.User"> INSERT INTO users (name, email) VALUES (#{name}, #{email}) </insert> <update id="updateUser" parameterType="com.example.User"> UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id} </update> <delete id="deleteUser" parameterType="int"> DELETE FROM users WHERE id = #{id} </delete> </mapper>

    详解:

    • mapper 根元素: MyBatis 映射文件的根元素。

      • namespace 命名空间: 指定 Mapper 接口的完整类名,用于将 Mapper XML 文件与 Mapper 接口关联起来。
    • select 查询语句: 用于执行查询操作。

      • id 唯一标识: 指定 SQL 映射语句的唯一标识,应该与 Mapper 接口的方法名相同。

      • parameterType 参数类型: 指定 SQL 映射语句的参数类型,可以是 Java 基本类型、Java 对象或 Map。

      • resultType 结果类型: 指定 SQL 映射语句的返回类型,可以是 Java 基本类型、Java 对象或 Map。

      • #{id} 参数占位符: 用于引用参数的值,MyBatis 会自动将参数的值替换到占位符的位置。

    • insert 插入语句: 用于执行插入操作。

    • update 更新语句: 用于执行更新操作。

    • delete 删除语句: 用于执行删除操作。

  4. 创建 SqlSessionFactory: 通过 SqlSessionFactoryBuilder 创建 SqlSessionFactory 对象。

    String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    详解:

    • Resources.getResourceAsStream(resource) 从 classpath 中加载 MyBatis 配置文件。

    • new SqlSessionFactoryBuilder().build(inputStream) 使用 MyBatis 配置文件创建 SqlSessionFactory 对象。 SqlSessionFactory 是一个单例对象,应该在应用程序启动时创建,并在应用程序关闭时销毁。

  5. 创建 SqlSession: 通过 SqlSessionFactory 创建 SqlSession 对象。

    SqlSession sqlSession = sqlSessionFactory.openSession();

    详解:

    • sqlSessionFactory.openSession() 创建 SqlSession 对象。 SqlSession 是一个会话对象,代表了一个数据库连接。 SqlSession 对象应该在使用完毕后关闭,以释放数据库连接。
  6. 获取 Mapper 接口的实例: 通过 SqlSession 获取 Mapper 接口的实例。

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    详解:

    • sqlSession.getMapper(UserMapper.class) 获取 Mapper 接口的实例。 MyBatis 会自动生成 Mapper 接口的实现类,并将 SQL 映射语句与 Mapper 接口的方法关联起来。
  7. 执行 SQL 语句: 通过 Mapper 接口的实例执行 SQL 语句。

    User user = userMapper.selectUserById(1);

    详解:

    • userMapper.selectUserById(1) 执行 selectUserById SQL 映射语句,并返回结果。
  8. 提交或回滚事务: 根据业务逻辑提交或回滚事务。

    sqlSession.commit(); // 提交事务 sqlSession.rollback(); // 回滚事务

    详解:

    • sqlSession.commit() 提交事务,将所有数据库操作持久化到数据库。

    • sqlSession.rollback() 回滚事务,撤销所有数据库操作。

  9. 关闭 SqlSession: 在使用完毕后关闭 SqlSession 对象。

    sqlSession.close();

    详解:

    • sqlSession.close() 关闭 SqlSession 对象,释放数据库连接。 应该始终在使用完毕后关闭 SqlSession 对象,以避免数据库连接泄漏。

1.1.4 代码实践

下面是一个完整的代码示例,演示了如何使用 MyBatis 查询用户信息:

// 1. 创建 User 类 public class User { private int id; private String name; private String email; // 省略 getter 和 setter 方法 @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + '}'; } } // 2. 创建 UserMapper 接口 (如上所示) // 3. 创建 UserMapper.xml 文件 (如上所示) // 4. 创建 mybatis-config.xml 文件 (如上所示) // 5. 测试代码 public class MyBatisExample { 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.selectUserById(1); if (user != null) { System.out.println(user); } else { System.out.println("User not found."); } } } }

注意事项:

  • 确保你的项目中包含了 MyBatis 的相关依赖。 可以使用 Maven 或 Gradle 来管理依赖。

  • 数据库连接信息需要在 mybatis-config.xml 文件中正确配置。

  • Mapper XML 文件的 namespace 属性需要与 Mapper 接口的完整类名一致。

  • SQL 映射语句的 id 属性需要与 Mapper 接口的方法名一致。

1.1.5 MyBatis 的优势和劣势

优势:

  • 灵活性: 可以编写自定义 SQL 语句,更好地控制数据库操作。

  • 性能: 通过优化 SQL 语句,可以获得更好的性能。

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

  • 可维护性: SQL 语句与 Java 代码分离,提高了代码的可维护性。

劣势:

  • 学习成本: 需要学习 SQL 语句和 MyBatis 的配置。

  • 代码量: 相比于 ORM 框架,需要编写更多的 SQL 语句。

  • 类型安全: SQL 语句中的参数类型需要手动指定,容易出错。

1.1.6 总结

MyBatis 是一款优秀的持久层框架,它提供了灵活的 SQL 映射和高度的可定制性,使得开发者可以更好地控制数据库操作。 虽然 MyBatis 相比于 ORM 框架需要编写更多的 SQL 语句,但它可以提供更好的性能和可维护性。 在选择持久层框架时,应该根据实际情况进行权衡,选择最适合自己的框架。 MyBatis 尤其适合需要精细控制 SQL 语句的复杂业务场景。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U