为什么出现持久性框架

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有如下问题

  1. 数据库的连接配置信息存在硬编码问题
  2. sql语句、设置参数、获取结果集参数均存在硬编码问题
  3. 需要手动封装返回的结果集,较为繁琐
  4. 频繁创建、释放连接,造成资源的浪费

这个时候持久层框架就出现了

数据库的连接配置信息存在硬编码问题

解决方式: 通过配置文件的方式

频繁创建、释放连接,造成资源的浪费

解决方式: 连接池 (市面上连接池比较多c3p0等等)

sql语句、设置参数、获取结果集参数均存在硬编码问题

解决方式: 配置文件

需要手动封装返回的结果集,较为繁琐

解决方式: 反射、内省

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值