MyBatis

/ 数据库 / 没有评论 / 937浏览

MyBatis޾

带着问题学习

  1. MyBatis 干了什么、为什么用 MyBatis
  2. 如果不用我们会怎么做

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/mybatis?characterEncoding=utf-8", "root", "root");
            // 定义 sql 语句 ? 标识占位符
            String sql = "select * from user where username = ?";
            // 获取预处理 statement
            preparedStatement = connection.prepareStatement(sql);
            // 设置参数
            preparedStatement.setString(1, "tom");
            // 想数据库发出 sql 执行查询 查询出结果集
            resultSet = preparedStatement.executeQuery();
            //便利查询结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String username = resultSet.getString("username");
                //封装实体 user
                user.setId(id);
                user.setUsername(username);
            }
            System.out.println(user);
        } 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();
                }
            }
        }

    }

JDBC 问题

  1. 数据库链接创建、释放频繁造成系统资源浪费
  2. SQL 语句再代码中硬编码、赵成代码不易维护,实际应用中 sql 的变化可能较大、sql 变动需要改变 java 代码,
  3. 使用 preparedStatement 向占有位符号传参数存在硬编码、因为 sql 语句的 where 条件不一定、修改 sql 不灵活、需修改代码不易维护
  4. 对结果集解析存在硬编码(查询列名),sql 变化解析代码变化、系统不移维护。

问题解决

  1. 数据库频繁创建链接、释放资源:连接池
  2. sql 硬编码:配置文件管理
  3. 手动解析封装返回结果集:反射、内省
  4. 动态代理模式创建接口的代理对象、减少sql 执行的硬编码和模板重复创建