目录
JDBC 概述
JDBC 定义与作用
JDBC(Java Database Connectivity)是 Sun 公司提供的一套使用 Java 语言操作关系型数据库的 API,它定义了操作数据库的规范和接口,使得 Java 程序能够统一地与不同的关系型数据库(如 MySQL、Oracle、SQL Server 等)进行交互,但它本身并不提供具体实现,而是由各个数据库厂商针对自身数据库产品提供相应的 JDBC 驱动实现,开发者在 Java 程序中通过面向接口编程的方式使用 JDBC 接口来操作数据库。
JDBC 操作数据库步骤
注册驱动
通过指定数据库厂商提供的驱动类名(如 MySQL 的 com.mysql.cj.jdbc.Driver
)告知 JDBC 使用的驱动,这一步是建立 Java 程序与数据库连接的基础,确保程序能找到并使用正确的数据库驱动。
获取连接对象(Connection)
使用 DriverManager.getConnection()
方法获取连接对象,此过程需要提供数据库连接的 URL(如 jdbc:mysql://localhost:3306/testdb
,包含数据库协议、主机地址、端口号和数据库名等信息)、用户名和密码,连接对象是后续执行数据库操作的关键,代表了 Java 程序与数据库的连接通道。
创建 Statement 对象并执行 SQL 语句
通过连接对象的 createStatement()
方法创建 Statement 对象,用于执行 SQL 语句(如 SELECT * FROM user;
)。对于查询操作,执行后会返回结果集对象(ResultSet),该对象封装了查询结果,其他操作(如插入、更新、删除)则会返回执行结果的相关信息,如受影响的行数等。
解析结果集(ResultSet)
对于查询返回的结果集,需要逐个解析其中的字段,根据字段类型调用相应的 get
方法(如 getInt()
、getString()
等)获取字段值,并手动将这些值封装到自定义的 Java 对象(如 User
对象)中,再添加到集合中。若表中字段较多,此过程代码会非常繁琐,因为需要对每个字段进行处理,且要准确判断字段类型以调用正确的 get
方法。
释放资源
操作完成后,需关闭获取到的数据库连接对象(Connection)和 Statement 对象,以释放占用的系统资源,避免资源泄漏。若在项目中频繁地获取和关闭连接,会造成资源浪费,影响系统性能,因为建立数据库连接是一个相对耗时的操作。
完整代码
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/testdb";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);
//3.获取执行SQL的对象Statement,执行SQL
String sql = "select * from user";
Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
List<User> userList = new ArrayList<>();
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
short age = resultSet.getShort("age");
short gender = resultSet.getShort("gender");
String phone = resultSet.getString("phone");
User user = new User(id,name,age,gender,phone);
userList.add((user));
}
//4.释放资源
statement.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
JDBC 存在的问题
硬编码问题
在 JDBC 程序中,数据库连接的相关信息(如 URL、用户名、密码)通常硬编码在 Java 代码中,在项目开发过程中,这些信息可能因开发环境(开发数据库、测试数据库、生产数据库)的不同而需要频繁变更。每次变更都需要修改 Java 代码并重新编译、打包,操作繁琐,不利于项目的维护和部署,降低了开发效率。
结果集解析繁琐
解析结果集时,需要针对每个字段编写代码进行处理,考虑字段类型并调用相应方法获取值,再封装到对象中。当表中字段数量较多时,代码量会大幅增加,变得臃肿且容易出错,增加了开发的复杂性和工作量。
资源浪费问题
每次执行数据库操作都需要获取连接、执行后立即关闭连接,在频繁操作数据库的场景下,这种方式会频繁地创建和销毁连接对象,导致资源浪费,降低系统性能,因为创建连接的开销较大,过多的创建和销毁操作会消耗大量系统资源。
MyBatis 对 JDBC 问题的解决
配置文件管理数据库连接信息
MyBatis 将数据库连接的四要素(驱动类名、连接 URL、用户名、密码)配置在 application.properties
或 application.yml
等配置文件中,当需要修改这些信息时,只需在配置文件中进行调整,无需修改 Java 代码,避免了硬编码问题,提高了项目的可维护性和灵活性,方便在不同环境下切换数据库配置。
自动结果封装
MyBatis 能够自动将查询结果封装到对应的 Java 对象中,并将多个对象封装到集合中,无需开发者手动解析结果集和封装对象,大大简化了代码,减少了开发工作量,提高了开发效率,避免了因手动解析结果集可能出现的错误。
数据库连接池技术
在 Spring Boot 整合 MyBatis 时,按照特定前缀(spring.datasource
)在配置文件中配置数据库连接信息后,Spring Boot 底层会自动采用数据库连接池技术(如 HikariCP、Druid 等)来统一管理和分配数据库连接(Connection 对象)。
在执行 SQL 语句时,从连接池中获取连接,执行完毕后将连接归还给连接池,实现连接的复用,避免了频繁创建和销毁连接带来的资源浪费,有效提升了系统性能,与线程池技术类似,通过资源的复用和合理管理提高了程序的运行效率。
MyBatis 与 JDBC 对比总结
通过对比可知,MyBatis 在简化开发、提高性能和增强可维护性等方面具有显著优势,完胜原始的 JDBC 编程方式。在使用 Spring Boot 整合 MyBatis 进行数据库操作时,开发者主要关注两个方面:
一是 application.properties
等配置文件中 MyBatis 的相关配置,确保数据库连接信息正确以及其他相关配置符合项目需求;
二是 Mapper 接口和定义的 SQL 语句,在 Mapper 接口中合理定义数据库操作方法,并通过注解或 XML 配置准确编写 SQL 语句,以实现业务逻辑所需的数据库功能。在实际企业开发中,由于 MyBatis 对 JDBC 的有效封装和优化,已成为主流的数据库持久层框架,大大提高了开发效率和项目质量,减少了开发者在数据库操作方面的工作量和出错概率,使得开发者能够更专注于业务逻辑的实现。
END
学习自:黑马程序员——JavaWeb课程