JDBC的救星——Mybatis
JDBC的缺陷分析以及解决方案
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能。
解决: 在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
- Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决: 将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
- 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
- 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
解决: Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
JDBC编程的具体实现步骤
import java.sql.*;
public class JdbcTools {
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/task?characterEncoding=utf8", "root",
"123456");
// 定义sql语句?表示占位符
String sql = "select *from login where phone= ? ";
// 获取预处理preparedStatement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "18782831009");
// 向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("phone") + " " + resultSet.getString("password"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e2) {
e2.printStackTrace();
}
}
}
}
}
通过mybatis解决jdbc编程的好处
- mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
- mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。
- 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装,屏蔽了jdbc api底层访问细节,使我们不用与jdbc
api打交道,就可以完成对数据库的持久化操作。