JDBC 与 Mybatis 对比
MyBatis 是一种流行的 Java 持久层框架,它支持定制 SQL、存储过程以及高级映射。MyBatis 原本是 Apache 的一个开源项目 iBatis,后来这个项目由 Apache Software Foundation 迁移到了 Google Code,并且在 2010 年更名为 MyBatis。MyBatis 的主要目标是简化 JDBC 的操作,而不隐藏 JDBC 的功能,这使得开发者可以控制 SQL 执行的细节而不是完全交给 ORM 框架。
MyBatis 的主要特点包括:
-
直接使用 SQL 语句:它允许开发者直接编写原始的 SQL 语句,不像某些 ORM 框架那样自动生成 SQL,这为开发者提供了更高的灵活性。
-
松耦合的设计:MyBatis 不会强迫映射到实体类,也可以通过简单的 XML 或注解方式来映射原始类型和 Map 接口。
-
灵活的映射能力:支持复杂的映射关系,包括一对一、一对多和多对多等。
-
动态 SQL:MyBatis 提供了强大的动态 SQL 功能,这使得 SQL 语句的构造更加灵活和方便。
-
会话管理和事务控制:虽然提供了会话管理和事务控制的功能,但开发者依然可以手动控制它们以达到更细粒度的控制。
一、JDBC(Java Database Connectivity)
JDBC(Java Database Connectivity)是一个 Java API,可以统一地访问各种关系数据库,提供了一种执行 SQL 语句的方法,包括存储过程调用、数据库管理和事务控制。JDBC 是一个面向关系数据库的标准 Java API,是一个用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。
下面是一个使用 JDBC 连接和查询数据库的简单示例,展示了如何加载驱动、建立连接、执行查询、处理结果以及关闭连接的全过程。在这个例子中,我们将从数据库中查询用户信息。
示例环境
- 数据库: 假设我们使用的是 MySQL 数据库
- 表: 假设有一个名为
users
的表,包含字段id
,name
, 和email
JDBC 代码示例
首先,确保你的项目中已经加入了 JDBC 驱动的依赖,对于 MySQL,通常是这样的:
<!-- Maven 依赖 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version>
</dependency>
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {// 数据库的 URLString url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";// 数据库用户String user = "root";// 数据库密码String password = "password";Connection conn = null;Statement stmt = null;ResultSet rs = null;try {// 1. 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获得数据库连接conn = DriverManager.getConnection(url, user, password);// 3. 创建 Statement 对象stmt = conn.createStatement();// 4. 执行 SQL 查询String sql = "SELECT id, name, email FROM users";rs = stmt.executeQuery(sql);// 5. 处理结果集while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");String email = rs.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);}} catch (Exception e) {e.printStackTrace();} finally {// 6. 关闭资源try {if (rs != null) rs.close();if (stmt != null) stmt.close();if (conn != null) conn.close();} catch (Exception e) {e.printStackTrace();}}}
}
-
加载驱动:
Class.forName("com.mysql.cj.jdbc.Driver")
是用来加载 MySQL 的 JDBC 驱动。 -
创建连接:
DriverManager.getConnection
使用提供的 URL、用户名和密码来建立与数据库的连接。 -
创建 Statement:创建一个
Statement
对象,它将被用来发送 SQL 语句到数据库。 -
执行 SQL 查询:使用
Statement.executeQuery(sql)
方法执行 SQL 查询语句。 -
处理结果集:使用
ResultSet
对象rs
来遍历查询结果,每次循环可以通过rs.getXXX(columnName)
方法获取列数据。 -
关闭资源:最后,关闭
ResultSet
、Statement
和Connection
以释放数据库资源。这一步是非常重要的,否则可能导致数据库资源不足。
通过以上步骤,可以看出 JDBC 提供了一种相对底层的方式来操作数据库,这让开发者能够精确控制数据库操作,但同时也需要写更多的模板代码来管理资源。
二、JDBC 与 Mybatis 的对比
尽管 JDBC 提供了直接与数据库交互的强大能力,但在实际开发中,直接使用 JDBC 往往涉及大量重复和模板化的代码,这不仅增加了开发的复杂度,也提高了出错的可能性。为了解决这些问题,框架如 MyBatis 应运而生,它们提供了更高级的抽象和更多的便利性,以简化数据库操作和提高开发效率。以下是 MyBatis 相对于直接使用 JDBC 的一些优势:
1. 简化代码和提高维护性
MyBatis 自动处理了诸如创建和关闭连接、执行 SQL 语句和处理结果集等繁琐的任务。开发者只需要关注 SQL 本身,而不是执行 SQL 所需的样板代码。这大大减少了代码量,也使得代码更易于维护和理解。
2. 动态 SQL
MyBatis 非常擅长处理动态 SQL 语句。它允许你在 XML 配置文件或注解中编写 SQL,并可以根据不同的条件动态地改变 SQL 语句的结构。例如,根据不同的用户输入添加不同的 WHERE 子句。这种能力在使用纯 JDBC 时很难实现,或者代码会变得非常复杂和难以维护。
3. 映射支持
MyBatis 提供了强大的结果映射功能,可以将数据库的行直接映射到 Java 对象中。这一过程在使用 JDBC 时需要手动进行,而 MyBatis 通过配置就可以自动完成。同时,MyBatis 也支持更为复杂的数据结构如列表、映射和嵌套对象。
4. 解耦 SQL 和 Java 代码
通过将 SQL 语句保存在 XML 文件或使用注解的方式中,MyBatis 使得 SQL 语句与 Java 代码解耦,这样可以让 SQL 开发者和 Java 开发者各自专注于他们最擅长的领域。此外,这也使得 SQL 语句的管理变得更加集中和系统化。
5. 事务管理和会话控制
虽然 JDBC 提供了事务控制的基本工具,MyBatis 通过更简单的接口对这些功能进行了封装,使得事务管理和会话控制更加简洁和直观。
总之,MyBatis 为处理数据库操作提供了一个既灵活又强大的中间层,有效地桥接了 JDBC 与高级 ORM 框架之间的差距。它提供了足够的控制力,同时又大大简化了数据库编程工作,这使得它在 Java 社区中非常受欢迎。
三、Mybatis 的环境依赖搭建与基础使用
1)在maven中加入依赖
<dependencies><!-- Spring Boot Starter Web, 用于创建web应用 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis Starter for Spring Boot --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- MySQL 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!-- Spring Boot Starter JDBC, 包含数据库连接池等基础设施 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- Spring Boot Starter Test, 用于测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
2) 配置数据库连接
在 src/main/resources
目录下的 application.properties
文件中添加数据库连接和 MyBatis 的基本配置:
spring.datasource.url=jdbc:mysql://localhost:3306/yourdatabase?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis Settings
mybatis.mapper-locations=classpath:/mappers/*.xml
mybatis.type-aliases-package=com.example.mybatisdemo.model
3) 创建实体类
在你的项目中创建实体类。例如,如果你有一个 user
表,则可以创建一个对应的 User 类
package com.example.mybatisdemo.model;public class User {private Integer id;private String name;private String email;// Getters and Setters
}
4)创建 MyBatis Mapper 接口
在 src/main/java/com/example/mybatisdemo/mapper
目录下创建一个 Mapper 接口:
package com.example.mybatisdemo.mapper;import com.example.mybatisdemo.model.User;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface UserMapper {@Select("SELECT * FROM user")List<User> findAll();
}
接下来就可以使用UserMapper这个接口来直接操控数据库了