浅谈JDBC与MyBatis
MyBatis是一个基于Java的、封装了JDBC的持久层框架。
1 JDBC
JDBC(Java Data Base Connectivity)表示Java数据库连接。在Java语言中,我们使用JDBC来操作关系型数据库。
1.1 案例代码
package core;
import java.sql.*;
/**
* JDBC案例类.
*
* @author 李程鹏
*/
public class JDBC {
public static void main(String[] args) {
// 定义连接对象
Connection connection = null;
// 定义预编译语句对象
PreparedStatement preparedStatement = null;
// 定义结果集对象
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过数据库驱动获取数据库连接
connection = DriverManager.
getConnection("jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8", "root", "root");
// 定义并初始化SQL语句
String sql = "select * from user where id = ?";
// 创建预编译语句对象
preparedStatement = connection.prepareStatement(sql);
// 设置查询参数
preparedStatement.setString(1, "1");
// 向数据库发出SQL并执行查询,获取查询结果集.
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
// 输出查询结果
System.out.println("id = " + resultSet.getString("id"));
System.out.println("name = " + resultSet.getString("name"));
}
} catch (Exception e) {
e.printStackTrace();
} finally { // 释放资源
if (resultSet != null) {
try {
// 关闭结果集对象
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
// 关闭预编译语句对象
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
// 关闭连接对象
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
1.2 问题分析
上面的JDBC代码存在以下几个问题:
- 频繁地开启和关闭数据库连接,严重地影响了数据库的性能。
- 代码中存在硬编码。每当需求变更时,都需要修改源代码然后重新编译,系统不易维护。硬编码的具体体现:
- SQL语句中的查询条件(String sql = "select * from user where id = ?";)。如果需求变更,改为根据用户主键和用户名进行查询,那么就需要修改源代码。
- 设置查询参数时的参数位置和参数值(preparedStatement.setString(1, "1");)。如果SQL语句由于需求变更而发生变化,那么原来编写的赋值语句就可能出错,需要修改源代码。
- 获取查询结果时指定的列名(resultSet.getString("name");)。如果数据表的字段名发生了变化,那么就需要修改源代码。
- 设置查询参数的过程繁琐。因为在设置查询参数的过程中,需要为查询语句中不同位置上的占位符设置不同的值。
- 获取查询结果的过程繁琐。因为在获取查询结果的过程中,需要遍历查询结果集,而且在遍历的过程中还需要根据数据表的列名才可以获取出其值。
2 MyBatis
MyBatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建连接、创建执行语句、手动设置参数和结果集检索等繁杂的过程。
MyBatis通过封装JDBC解决了它在编程中出现的问题,解决的技术方案主要有以下五种:
- 数据库连接池。我们可以在MyBatis的全局配置文件SqlMapConfig.xml中配置数据库连接池,使用它来管理数据库连接,这样就可以避免由于频繁地创建和释放数据库连接而造成的资源浪费。
- SQL配置文件。MyBatis将SQL语句与Java源文件进行分离,将SQL语句放置到配置文件Mapper.xml中。如果有需求变更需要修改SQL语句,那么只需要修改配置文件即可。修改配置文件的维护成本比修改Java源文件的成本要低,因为修改配置文件后重启系统就可以生效,但是如果修改的是Java源文件,那么就需要经过修改、编译、打包、发布和重启五个步骤。
- 动态SQL语句。MyBatis使用动态SQL技术解决了JDBC编程中存在的SQL硬编码的问题。
- 输入映射。MyBatis通过输入映射技术将Java对象映射至SQL语句,SQL语句可以通过使用该Java对象取出查询参数值,简化了JDBC中设置查询参数的过程。
- 输出映射。MyBatis通过输出映射技术将SQL的执行结果映射至Java对象,省去了JDBC编程中对结果集检索的过程。