JDBC现状
- 数据库的连接配置信息存在硬编码问题,如果切换数据库需要重新编译源码文件
- 频繁创建、释放连接,造成资源的浪费
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库连接
DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characteEncoding=utf-9", "root", "root");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
try {
assert resultSet != null;
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
- sql语句、设置参数、获取结果集参数均存在硬编码问题
// 定义SQl语句 ? 表示占位符
String sql = "select * from user where userName = ?";
// 获取预处理对象
preparedStatement = connection.prepareStatement(sql);
// 设置参数
preparedStatement.setString(1, "test");
// 执行sql获取返回结果集
resultSet = preparedStatement.executeQuery();
- 需要手动封装返回的结果集,较为繁琐
while (resultSet.next()) {
final int id = resultSet.getInt("id");
final String userName = resultSet.getString("userName");
// 封装对象
user.setId(id);
user.setUserName(userName);
}
System.out.println(user);
完整版本的JDBCcode
public class JustTestJdbc {
private static class User {
private String userName;
private int id;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
User user = new User();
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库连接
DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characteEncoding=utf-9", "root", "root");
// 定义SQl语句 ? 表示占位符
String sql = "select * from user where userName = ?";
// 获取预处理对象
preparedStatement = connection.prepareStatement(sql);
// 设置参数
preparedStatement.setString(1, "test");
// 执行sql获取返回结果集
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
final int id = resultSet.getInt("id");
final String userName = resultSet.getString("userName");
// 封装对象
user.setId(id);
user.setUserName(userName);
}
System.out.println(user);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
try {
assert resultSet != null;
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
经过分析原始JDBC有如下问题
- 数据库的连接配置信息存在硬编码问题
- sql语句、设置参数、获取结果集参数均存在硬编码问题
- 需要手动封装返回的结果集,较为繁琐
- 频繁创建、释放连接,造成资源的浪费
这个时候持久层框架就出现了
数据库的连接配置信息存在硬编码问题
解决方式: 通过配置文件的方式
频繁创建、释放连接,造成资源的浪费
解决方式: 连接池 (市面上连接池比较多c3p0等等)
sql语句、设置参数、获取结果集参数均存在硬编码问题
解决方式: 配置文件
需要手动封装返回的结果集,较为繁琐
解决方式: 反射、内省