【MyBatis深入剖析】应用分析与最佳实践

2020-04-20  本文已影响0人  fteng1024
文章目标
  1. 了解ORM框架的发展历史,了解MyBatis特性
  2. 掌握MyBatis编程式开发方法和核心对象
  3. 掌握MyBatis核心配置含义
  4. 掌握MyBatis的高级用法与扩展方式

文章定位

为什么要用MyBatis?

我们先来回顾一下,在我们Java程序中,当我们要操作数据库,不仅限于MySQL、SqlServer、oracle等数据库,我们最简单、最原始的方式是什么?我想大部分人想到的都是JDBC?那咱来看看Java使用JDBC操作数据的代码

public void testJDBC() {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        Student student = new Student();
        try {
            // 注册MySQL驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 获取连接
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
            // 执行查询
            statement = connection.createStatement();
            // 定义一个SQL语句
            String sql = "select id,name,qq from student";
            // 调用 statement 包装好的方法 返回一个结果集
            resultSet = statement.executeQuery(sql);
            // 将结果集封装成我们的 BOJO 对象
            while (resultSet.next()) {
                Integer id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                String qq = resultSet.getString("qq");
                student.setId(id);
                student.setName(name);
                student.setQq(qq);
            }
            log.info("student jsonStr is {}", JSON.toJSONString(student));
        } catch (Exception e) {
            log.error("SQL语句执行失败.", e);
        } finally {
            // 关闭连接
            close(resultSet);
            close(statement);
            close(connection);
        }
    }

通过编码我们发现,操作数据库有以下步骤

  1. 注册驱动
  2. 获取连接
  3. 创建Statement对象
  4. execute()方法执行SQL语句
  5. 把结果集转换成POJO对象
  6. 关闭连接,释放资源

当项目复杂时,直接使用原生API会带来什么问题?

  1. 代码重复(如果项目复杂,有很多上面步骤的重复代码)
  2. 结果集处理太复杂(需要找到对应的数据库字段并转换为POJO对象)
  3. 连接管理(手动管理连接,如果出了点错,就有可能造成数据库连接资源消耗殆尽)
  4. SQL语句和代码耦合在一起

如果要解决这种使用源生API的问题,有哪些更简单操作数据库的方式呢?

  1. Apache DbUtils (解决了结果集的封装)
  2. Spring JDBC

部分代码块

@Slf4j
public class StudentDao {
    private static QueryRunner queryRunner;


    static {
        queryRunner = HikariUtil.getQueryRunner();
    }

    /**
     * 使用ID获取学生信息
     *
     * @param id 主键ID
     * @throws SQLException
     */
    public static void selectDataById(Integer id) throws SQLException {
        String sql = "select * from student where id = ? ";
        Object[] params = new Object[]{id};
        StudentDTO studentDTO = queryRunner.query(sql, new BeanHandler<>(StudentDTO.class), params);
        log.info("studentDTO jsonStr is {}", JSON.toJSONString(studentDTO));
    }

    public static void selectList() throws SQLException {
        String sql = "select * from student ";
        List<StudentDTO> studentDTOList = queryRunner.query(sql, new BeanListHandler<>(StudentDTO.class));
        log.info("studentDTOList jsonStr is {}", JSON.toJSONString(studentDTOList));
    }
}
List<StudentDTO> studentDTOList = jdbcTemplate.query("select * from student",new StudentRowMapper());
        log.info("studentDTOList jsonStr is {}", JSON.toJSONString(studentDTOList));

要想完美解决上面的问题,那么就需要引入ORM框架了。
什么是ORM框架呢?
Object Relational Mapping
也就是 对象映射关系型数据库。
MyBatis特性:

  1. 使用连接池对连接进行管理
  2. SQL与代码分离,集中管理
  3. 参数映射和动态SQL
  4. 结果集映射
  5. 缓存管理
  6. 重复SQL的提取<sql>标签
  7. 插件机制

选择什么ORM框架?
1. 业务简单的项目可以使用Hibernate
2. 需要灵活的SQL,可以用MyBatis
3. 对性能要求高,可以使用JDBC
4. Spring JDBC可以合ORM框架混用


今天就总结到这儿,欲知后事如何,且听下回分解。

上一篇 下一篇

猜你喜欢

热点阅读